hexFF писал(а):
не успевает прерывание отработать, тут гадать не надо. компилятор на прерывание минимум 70-80 тактов хоронит, на сохранение и восстановление РОН. на ассемблере- самое оно, тактов 25-30 вместе с уходом на вектор и возвратом.
А помочь сможете?
Я в AVR-овском ассемблере ни бум-бум...
Как то же ещё значения из переменных в регистры передать надо.
Вот, собственно, код прерывания
Код:
/**************************************************************************************
* Обработчик прерываний таймера
***************************************************************************************/
ISR(TIMER2_COMP_vect){
static volatile uint8_t prt;
prt = TSOP_IN&TSOP_PIN;
if (prt==0) //На ножке ИК-приемника низкий уровень сигнала (пойман сигнал несущей)
{
low_level_counter++;//Увеличиваем счетчик длительности низкоуровнего сигнала на ножке ИК-приемника
}
else //На ножке ИК-приемника высокий уровень сигнала (пойман сигнал несущей)
{
high_level_counter++;///Увеличиваем счетчик длительности высокоуровнего сигнала на ножке ИК-приемника
if((start_bit_received)&&(high_level_counter > IR_ZERO*8))
{//Фиксируем окончание приема по таймауту
start_bit_received = false; //отменяем прием
rx_event = RX_COMPLETE; //Генерим событие "принят пакет"
receiver_on = false;//выключаем приемник
if (ir_transmitter_on==false) TIMSK &=~_BV(OCIE2); //если передача не ведётся - выключаем прерывания
}
if((high_level_counter > IR_ZERO*8)&&(ir_transmitter_on==false))
{
receiver_on = false;//выключаем приемник
TIMSK &=~_BV(OCIE2);
}
}
if (ir_transmitter_on==true)
{//Если передача разрешена
if (ir_pulse_counter > 0) //необходимая длительность пачки импульсов
{ //ещё не достигнута, "мигаем" дальше
IR_LED_INVERT; //необходимая длительность пачки
ir_pulse_counter--;
}
else //пачка импульсов была отправлена,
{
IR_LED_OFF; //тушим ИК-диод
if ( ir_space_counter > 0) //проверим, выдержан ли промежуток между импульсами
{ //нет, промежуток не выдержан
IR_LED_OFF; //тушим ИК-диод
ir_space_counter--; //уменьшаем обратный счетчик паузы на один "тик"
}
else //Пакет импульсов и промежуток между битами переданы
{ //нужно формировать следующую пачку (передаваемый бит)
if (data_packet.data[cursor_position]!=0) //если указатель указывает не на пустую ячейку
{
ir_pulse_counter =data_packet.data[cursor_position++] ; //передадим импульс указанной длительностью
ir_space_counter = IR_SPACE; //и про паузу не забудем
}
else //Все данные переданы (элемент, на который ссылается указатель, равен 0)
{
ir_transmitter_on=false; //выключаем передатчик
FIRE_LED_OFF;
display_bullets_update_now++;
// если
if (!receiver_on) //если нет приема пакета
{
TIMSK &=~_BV(OCIE2); // Запрещаем прерывания по захвату/сравнению
}
}
}
}
}
else {//Если передача запрещена
}
}