Задача стоит в том чтобы измерить длину управляющих импульсов и интерпретировать сигналы "газ" "поворот" в сигналы для танкового привода.
Вот кусок кода для 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?