if (rx_buffer_overflow)
{
lcd_clear();
for (i=0; i<10; i++)
{
lcd_puts(&rx_buffer[i]);
}
//delay_ms(200); это зачем - пока пауза могут прийти данные с компорта многократно
rx_buffer_overflow = 0;
rx_wr_index= 0;
rx_counter = 0;
}
а вот когда посылаем надо выдержать паузу между посылками - пока микроконтроллер выводит на индикатор:
не нужна. в rx_buffer хранится вся принятая строка и выходит так, что она целиком выводится на дисплей командой lcd_puts(&rx_buffer[0]). в случае for'a она просто 10 раз подряд пишется и с какими-то искажениями уже (индекс в скобках обозначает символ, с которого начинается передача строки. поставил экран побольше и проверил)
ну и задержка в передатчике понадобилась при исправленном приемнике (а то лишнее докидывал передатчик), хотя до этого и без нее обходилось, начиная со второй передачи
вопрос относителтно ATmega8a
используется Т2 в режиме FastPWM
задействованы обработчики прерываний по переполнению и совпадению
OCR2 принимает значения от 0 до 250
глюк состоит в том , что через определенный интервал времени дважды срабатывает ПОДРЯД обработчик преывания по переполнению
когда же я задаю другой диапазон для OCR2 от 10 до 250 то все идет как по маслу
в чем природа оного глюка ?
В том, что на время обработки прерывания таймер у Вас не останавливается, а продолжает считать. код инициализации таймера и обработчиков прерываний выложите.
Фигасе, Вы код засунули в прерывание! Столько условий + вызов функции + вход/выход из обработчика прерывания. Не исключаю возможности, что за время выполнения данного кода Таймер успевает прогнать по кругу и установить флаг на выполнение прерывания повторно. Оставьте в прерывании только самое важное, а код выносите в основную функцию. Ну, и попробуйте как-то его оптимизировать.
Pink-Pank писал(а):Не исключаю возможности, что за время выполнения данного кода Таймер успевает прогнать по кругу и установить флаг на выполнение прерывания