|
|
Написал пробную программу, которая 1 раз в 20мс по прерыванию таймера должна передавать пакет из 3-х байтов - не работает, передаётся только 1 байт. Прерывание от UART возникает, но при этом сразу происходит выключение передатчика, как будто счётчик переданных байтов уже досчитал до 0.
Привожу текст, может я что-то не понимаю, смотрел всё осциллографом.
#include // прерывание передачи по 1 каналу // прерывание передачи по 0 каналу void main(void) { // Программируем UART // программирование Таймера 1 - на тактовую частоту 138,8 мкс - период 20 мс if(ft0) { UCSR1B &= ~0x10; // запретить приём Очень буду благодарен за помощь.
E-mail:
info@telesys.ru
#include
unsigned char ft0;// флаг вспомогательный
unsigned char countUART; // счётчик передачи
unsigned char* ptrUART; // указатель на передаваемый байт
// Подпрограмма обработки прерывания переполнения Таймера 1- 20 мс период опроса ИП
#pragma vector = TIMER1_OVF_vect
__interrupt void TIMER1_OVF0_interrapt(void)
{
ft0 = 1;
}
#pragma vector = UART1_TX_vect
__interrupt void UART1_TX_interrapt(void)
{
PORTC &= ~CS1;// выключить передатчик
UCSR1B |= 0x10;// разрешить приём
}
#pragma vector = UART0_TX_vect
__interrupt void UART0_TX_interrapt(void)
{
if(countUART > 0){
ptrUART++;
UDR0 = *ptrUART;
countUART--;
}
else { PORTC &= ~CS2; // отключить передатчик
UCSR0B |= 0x10;// разрешить приём
}
}
UCSR1B = 0xd8; // разрешение приёма и передачи 1 канала, прерывание приёма и передачи,передача 9 бита
UCSR0B = 0xd8; // разрешение приёма и передачи 0канала, прерывание приёма и передачи
UBRR0 = 23; // скорость 19200
UBRR1 = 23; // скорость 19200
UBRRHI = 0;// старшие биты скорости передачи =0
TCCR1B |= 5; // коэффициент деления частоты генератора
TIMSK |= 0x80;// разрешить прерывания переполнения Таймера 1
TCNT1 = constDivTimer1; // зададим константу счёта
_SEI(); // разрешить прерывания
metka:
ft0 = 0;
UCSR0B &= ~0x10;// запретить приём
countUART = 3;// передать только три байта
ptrUART = &bufferUART.Adres;
PORTC |= CS2; // включить передатчик 0 канала
UDR0 = *ptrUART;
PORTC |= CS1; // включить передатчик 1 канала
UDR1 = 0xaa;
}
goto metka;
}
Ответы