Включаю передачу по прерываниям и приём по прерываниям.
скорость без разницы, ну допустим 9600. остальное по умолчанию (т.е. 8 бит с битом чётности и т.п.)
тестирую в Proteus
начинается всё с того, что проц вообще "не дышит" в сгенерированной по умолчанию проге. Не дышит он из-за того, что постоянно вызывается прерывание окончания передачи и это я ещё ничего не передавал! (он только из него вываливается, а оно тутже его обратно затягивает)
помогает только доработка прерывания, путём дописывания кода, сбрасывающего флаг TXC
вот что получается:
Код: Выделить всё
// USART1 Transmitter interrupt service routine
interrupt [USART1_TXC] void usart1_tx_isr(void)
{
//return;
if (tx_counter1)
{
--tx_counter1;
UDR1=tx_buffer1[tx_rd_index1];
if (++tx_rd_index1 == TX_BUFFER_SIZE1) tx_rd_index1=0;
}
else {
UCSR1B = UCSR1B & 191;
};
}пытаюсь передавать байты. Например вот так:
putchar1(111);
putchar1(222);
putchar1(222);
в результате первый символ передаётся, а остальные (которые должны прерыванием из буфера доставаться - не передаются)
если писать вот так:
putchar1(111);
delay_ms(1);
putchar1(222);
delay_ms(1);
putchar1(222);
всё передаётся.
всё вышеописанное относится только к USART1.
USART0 работает без проблем, в сгенерированый код ненужно дописывать сброс флагов и пр. всё работает как и должно быть в теории. Прерывания вызываются и из буфера передаётся.
инициализация, сгенерированная генератором кода - одинаковая для обоих передатчиков (ну за исключением названий портов)
где грабли? В компиляторе? в Протеусе? или в генах? :shock:


