[an error occurred while processing this directive] [an error occurred while processing this directive]
Вопрос вокруг UART Pic16F874. Не дайте крыше совсем съехать!
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Xan 15 мая 2002 г. 10:51

Передатчик работает по прерываниям, прерывания изначально/большую часть времени запрещены.

Имеется софтовый буфер для передатчика на один байт и флаг его занятости.

Чтоб передать байт, функция Send_Byte проверяет флаг занятости этого буфера и,
если буфер занят, ждёт его освобождения (и при этом на всякий случай устанавливает разрешение прерываний передатчика).
Если буфер свободен/освободился, Send_Byte кладёт байт в буфер, устанавливает флаг занятости буфера и разрешает прерывания передатчика.

Подпрограмма обработки прерываний передатчика первым делом проверяет занятость буфера. Если буфер пуст, то запрещает прерывания передатчика и завершается.
Если буфер не пуст, суёт данные в железо передатчика и сбрасывает флаг занятости буфера.

Есть ещё приёмник со своим буфером. И есть MainLoop, в которой байты из буфера приёмника обрабатываются и отправляются обратно…
Пробовал на скорости 115200 и 4800.

Вроде, должно работать. Однако:
1. Принятый от компа байт отправляется обратно (на компе ГиперТерминал от M$). = Ок.
2. Принятый байт отправляется обратно два раза подряд. = Никакой реакции, «и тишина...».
3. Обратно отправляется один байт, пауза 40мс, другой байт. = Оба доходят.
4. Первый, пауза 20мс, второй, пауза 20мс, третий. = Когда как. На низкой скорости иногда доходит только второй, иногда все три. На высокой – все.
5. С компа посылаются байты с частотой 30 Гц. На большой скорости доходят только вторые байты (из трёх). Осцилограф показывает, что вслед за одним (вторым?) байтом иногда следует другой, но чтоб три штуки разом – никогда.


------------------------

void Send_Byte(char byte)
{
while (Tx_Flag) TXIE = 1;

Tx_Byte = byte;
Tx_Flag = 1;
TXIE = 1;
}

------------------------

void Usart_Tx_Irq(void)
{
if (Tx_Flag == 0)
{
TXIE = 0;
return;
}

Usart_Data = Tx_Byte;
Get_Parity();
if (Usart_Parity == 1) TX9D = 0;
else TX9D = 1;
TXREG = Usart_Data;
Tx_Flag = 0;
}

------------------------

void Init_Usart(void)
{
SPBRG = 0x07; // baud rate = 115200 @ 14.7456MHz
BRGH = 1; // High speed
SYNC = 0; // asynchronous mode
SPEN = 1; // serial port enable
TX9 = 1; // 9 bits
RX9 = 1; // 9 bits
TXEN = 1; // Tx enable
CREN = 1; // Continuous receive enable

RCIE = 1; // Enable Reciver Interrupt
TXIE = 0; // NOT enable Transmitter Interrupt
PEIE = 1; // Enable Periferal Interrupt
}

RTFM не предлагать, уже всяких обчитался по самое... :-(
Надеюсь, кто-нить глянет "набитым глазом" и сразу ткнёт носом :-)

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru