Скрипачпророк (11.01.2011 18:25, просмотров: 111) ответил 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 - статическая переменная
(не в стеке, но видна только для этой процедуры,
ибо внутри нее объявлена)
... но не любой ценой.