- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
////выполнение полного сброса, конфигурирования и проверки того что записано в регистрах
////0 - проверка неудачная
////1 - все нормально
BYTE ADE7758::Full_Check(void)
{
OS_DI();
if(Check())//проверка состояний регистров
return 1;//все нормально
else
{
Configure();
OS_Delay(1);//ждем пока нестабильность пройдет
if(Check())//проверка состояний регистров
return 1;//все нормально
else //после переконфигурации не все нормально - значит делаем ресет
{
OS_Delay(100);//ждем пока нестабильность пройдет
Reset(); //полный сброс
OS_Delay(10);//ждем еще чуть-чуть для завершения пересброса (на всякий случай)
Configure();//переконфигурация
//OS_Delay(500);//ждем пока нестабильность пройдет
if(Check())//снова проверка состояний регистров
return 1;//после пересброса все нормально
else
{
OS_Delay(500);//ждем пока нестабильность пройдет
Reset(); //полный сброс
Configure();//переконфигурация
OS_Delay(500);//ждем пока нестабильность пройдет
if(Check())//снова проверка состояний регистров
{
return 1;//после пересброса все нормально
}
else
{
return 0;//все проверки неудачные - выход с ошибкой
}
}
}
}
}
"Нельзя доверять никому. Совсем никому. Даже самому себе."
Разумеется это вызывается в прерывании 200 раз в секунду.
1 тик OS_Delay() = 10мс.
Разрешение прерываний после сделает "дядя Вася".
Зато знаем классы и умеем их писать.
miscff 18.04.2013 13:50 # −1
и где здесь си?
apparato 18.04.2013 14:08 # +1
Вот ещё такая штука стрелилась:
...
if( (!(ADE_MODE.SYNCHRONIZATION) && (IRQ_timeout_A>=ADE_TIMEOUT) && (IRQ_timeout_B>=ADE_TIMEOUT) && (IRQ_timeout_C>=ADE_TIMEOUT)) ||
(!(ADE_MODE.SYNCHRONIZATION) && ( (ADE_ZXA_COUNTER==0) || ( ADE_ZXB_COUNTER==0) || (ADE_ZXC_COUNTER==0) ) ) ||
( (ADE_MODE.SYNCHRONIZATION) && (ADE_ZXA_COUNTER==0) && ( ADE_ZXB_COUNTER==0) && (ADE_ZXC_COUNTER==0) )
)
{
...
P.S. Как такового C++ и его фичей нет. Не хотелось авторский текст портить.
inkanus-gray 18.04.2013 14:06 # 0
apparato 18.04.2013 14:21 # 0
Дополнение 1 для полноты картины.
apparato 18.04.2013 14:22 # 0
Dummy00001 18.04.2013 18:14 # +3
когда у тебя железо подвисает, иногда удается узнать где, на какой строчке, что и как подвисло.
я в свое время пытался тоже красиво писать, а потом забил: во время bring-up'а код, "хороший" по стандартам прикладного программирования, просто не катит. десяток прямых доступов к регистрам намного проще чем цикл.
apparato 19.04.2013 07:45 # 0
K::p[123]_off[datch].
А в Check() проверяются немного чуть другие:
K::i[123]_off[datch].
Поэтому результат Full_Check() равный 1 (всё Ок!) будет истинен только для K::p[123]_off[datch] = K::[b]i[.b][123]_off[datch].
Это разгадка на жалобу "почему-то до калибровки работает, а после нет."
Dummy00001 19.04.2013 13:07 # 0
один из первых девайсов который я программировал (моушн контроллер), из-за крюков реализации memio у ISA-to-PCI контроллера, писать нужно было под одному аддресу, а читать по другому.
Dummy00001 18.04.2013 18:04 # 0
а так, на самом деле, без ковыряния datasheet очень сложно сказать говно это или нет, потому что эта процедура может быть сделана согласно официальной доке. в свое время траханины с заморачками и багами дешевых сетевых адаптеров насмотрелся (или хорошый адаптер c криво привинченым gmac'ом). для одного девайса, в драйвере треть кода была посвящена воркараундам всевозможных багов.
PS http://www.analog.com/en/analog-to-digital-converters/energy-measurement/ade7758/products/product.html - интересно что вы там делаете...
apparato 19.04.2013 08:31 # +1
У AD есть проблемы в реализации некоторых чипов, особенно семейства 77, причем это верно не только для ade77xx, но и для АЦП ad77xx. Вероятность сбоев зависимости от кривизны рук и лени электронщика. Сбои заключаются в самопроизвольном (некоторые говорят "мистическом") изменении значений настроечных регистров. Единственным противодействием является проверка значений регистров. Для полной надёги нужно проверять все настроечные регистры. В данной мыкросхеме регистров что-то около 256 (всего, и настроечных, и значений). Просто проверка в каждом цикле чтения значений займет убийственное время.
В данной реализации Check(mod) проверяется 6 регистров для mod=0,
а для mod=1 ещё дополнительно 18 регистров. Вероятность обнаружения сбоя желающие могут посчитать.
Dummy00001 19.04.2013 13:09 # 0
кривое железо вездесуще. но без кривого железа, было бы меньше работы :)
Dummy00001 19.04.2013 13:19 # 0
а для mod=1 ещё дополнительно 18 регистров."
к слову. по теме memory mapped io. если есть возможность, можно потрясти железячников что бы они эти регистры в железе рядом замапили. тогда можно будет делать проверку одним memcpy(). например: PCI32 может передавать 32bit слова. если регистры байтовые, то так можно будет съэкономить на количестве операций ввода/вывода, читая 4 регистра за раз.
movaxbx 18.04.2013 23:00 # 0
apparato 19.04.2013 07:34 # 0
apparato 19.04.2013 07:58 # 0
И видим наличие параметра mod.
После смотрим на реализацию Full_Check().
О-о! Лулзы!
apparato 19.04.2013 08:01 # 0
И везде полностью халяльный стиль:
И ещё:
guest 19.04.2013 13:35 # +1
незнал что путен кодит