ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
2 июня
233048 Топик полностью
Скрипач, пророк (11.01.2011 18:25, просмотров: 94) ответил mazur на Тогда я где-то что-то пока не догоняю. Это что получается, в каждой машине состояний свой обработчик для каждого таймера? Если не затруднит, расскажите как вы работаете с таймерами?
Вот код простенькой задачи. Извини, не ассемблер :)  uint16_t IOPort; // Логическое состояние дискр.входов void sys_dio(void){ static uint16_t dio_tmp, dio_tmp2; static uint8_t dio_cnt, TL; if( Delay(TL, TCNT2) < 184 ) return; // 4mS TL = TCNT2; if(++dio_cnt > 5*2){ // Два цикла сети 50гц uint16_t filter = dio_tmp ^ dio_tmp2; // Фильтрация дребезга побитно uint16_t newval = filter & IOPort; newval |= (~filter) & dio_tmp; IOPort = newval; dio_cnt = 0; dio_tmp2 = dio_tmp; dio_tmp = 0; }; // Собираем с пинов дискретные входы dio_tmp |= ~PackPins(PINC|0xC0,PIND,PINB); // Инверсные входы if(ADC_val[6] < 20) dio_tmp |= _BV(6); // Эти две ножки имеют только аналоговый вход if(ADC_val[7] < 20) dio_tmp |= _BV(7); } Код для atmega8 TCNT2 - аппаратный счетчик. TL - статическая переменная (не в стеке, но видна только для этой процедуры, ибо внутри нее объявлена)
... но не любой ценой.