[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=3152729#p3152729"]Форматирование, комментарии и осмысленные названия переменных нужны не непосредственно для правильной работы программы, а чтобы упростить себе и другим анализ кода - где какой блок начинается и заканчивается, какая переменная для чего предназначена, чего автор хотел добиться тем или иным блоком кода. Туда же использование именованных битов в том же ADCSRA - я, например, не помню какой за что отвечает, но если бы было написано, скажем, ADCSRA = (1<<ADIE | 0b001<<ADPS0) была бы сразу заметна ошибка, а то и не одна.
Кажется, у Макконела было что-то вроде "если мне принесут посмотреть вот такой код я скажу сначала привести его в читаемый вид. Если вот сякой - посмотрю по настроению, поскольку глаза не режет, а если вот эдакий - прочитаю обязательно". Потому что можно сконцентрироваться на логике, а не на подробностях реализации.
Тогда как правильно (форматированно) обработать дребезг в прерывании?
А нужно ли в прерывании? Опрос кнопок (хоть одной, хоть всех) проще делать по таймеру с интервалом 10 - 500 мс, либо в бесконечном цикле с тем же периодом: точность времени тут не важна.
Впрочем, я пока не представляю задачу в которой одновременно измеряется напряжение с помощью АЦП и приближенно оценивается его уровень с помощью внешнего прерывания. Требуется реакция на пересечение порога (угу, на IO выводе с неизвестным уровнем срабатывания и гистерезисом) со задержкой менее 30 мкс (что обеспечивается АЦП)? Даже если так, аналоговый компаратор точнее обычного прерывания.
PS а намек понял...спасибо!)
А зря, потому что в зависимости от настроек диапазон меняется: (0...255), (0...1023), (0...65472) и даже (0...3). Кстати, может вам и не надо все 10 бит, а хватит и 8? Работа с 8-битными переменными проще и быстрее. Ну и не стоит использовать магические числа, берущиеся непонятно откуда. Лучше объявить константу или макрос (в gcc-avr макрос обычно удобнее), например
Код: Выделить всё
#define MAX_TEMPERATURE_C 100 //максимальная температура, в градусах Цельсия
#define Temp2ADC(t) (1024*(t+273)) //например, такая формула. Взята от балды так что физический смысл коэффициентов не знаю, но в реальном коде его стоит расписать
...
if( ADC > Temp2ADC(MAX_TEMPERATURE) ){...}
В последнем проекте у меня фигурирует вот такой макрос
Код: Выделить всё
#define P_koeff ((uint32_t)( \
((( \
((( \
( ( (8* R_DL_Ohm*R_sh_mOhm*1024/ (R_DH_Ohm+R_DL_Ohm) )+1 )/2 ) \
*1024/U_ref_mV)+1)/2) \
*1000/U_ref_mV)+1)/2) \
))
У всех входящих в него констант есть физический смысл - сопротивления резисторов (в Омах или миллиОмах), опорное напряжение АЦП (в милливольтах), разрядность каналов. Все их можно напрямую или косвенно измерить для конкретной платы и контроллера. Более правильно было бы хранить эту константу в EEPROM'e, но для одиночного изделия и так неплохо.[/uquote]
О форматировании кода вы меня убедили, будем стараться))
Конечно можно было проще использовать и компаратор, и опрос кнопок в прерываниях, но это просто эксперимент и изучение attiny13 на будущее. Жаль мало информации на русском об этом МК, надо курить даташит на заграничном, а времени совсем мало, видать в этом-то и проблема
Как при 10 бит может быть (0...65472) (0...3)...?
И о каких магические числах вы имеете в виду?