Задача стоит в том чтобы измерить длину управляющих импульсов и интерпретировать сигналы "газ" "поворот" в сигналы для танкового привода.
Вот кусок кода для ATmega8 (кварц 16МГц)
Прерывания настроены на любое изменение состояния порта
подтягивающие резисторы на порт D включены
- Код: Выделить всё • Развернуть
- interrupt [EXT_INT0] void ext_int0_isr(void)
 {
 // Place your code here
 if (flag1==0) {TCNT0=0x00;
 flag1=1;
 }
 else {flag1=0;
 move1=TCNT0;
 };
 
 }
 // External Interrupt 1 service routine
 interrupt [EXT_INT1] void ext_int1_isr(void)
 {
 // Place your code here
 if (flag2==0) {TCNT0=0x00;
 flag2=1;
 }
 else {flag2=0;
 move2=TCNT0;
 };
переменный move1 и move2 хранят длину импульсов с 2х каналов.
НО!
Программа работает но считается только длина импульса на ноге "INT0".
Считает и импульс на ноге "INT1", если отключить прерывание на INT0 и оставить только INT1.
То-есть можно сделать вывод, что импульсы начинаются одновременно.
Если пытаться "поймать" импульс в основном цыкле программы, отключив внешние прерывания
- Код: Выделить всё • Развернуть
- while(flag1==0){ if(PORTD.2==1){TCNT0=0;
 flag1=1;
 };
 };
 
 while(flag1==1){ if(PORTD.2==0){move1=TCNT0;
 flag1=0;
 };
 };
то ничего не получается вообще(
Вот и хочу спросить каким образом можно реализовать поставленную выше задачу на ATmega8?

 
 


