Помогите начинающему (atmega161)
(«Телесистемы»: «Конференция «Микроконтроллеры и их применение»»)

миниатюрный аудио-видеорекордер mAVR

Отправлено SergMel 23 апреля 2003 г. 06:18

Написал пробную программу, которая 1 раз в 20мс по прерыванию таймера должна передавать пакет из 3-х байтов - не работает, передаётся только 1 байт. Прерывание от UART возникает, но при этом сразу происходит выключение передатчика, как будто счётчик переданных байтов уже досчитал до 0.
Привожу текст, может я что-то не понимаю, смотрел всё осциллографом.

#include
#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;
}

// прерывание передачи по 1 каналу
#pragma vector = UART1_TX_vect
__interrupt void UART1_TX_interrapt(void)
{
PORTC &= ~CS1;// выключить передатчик
UCSR1B |= 0x10;// разрешить приём
}

// прерывание передачи по 0 каналу
#pragma vector = UART0_TX_vect
__interrupt void UART0_TX_interrapt(void)
{
if(countUART > 0){
ptrUART++;
UDR0 = *ptrUART;
countUART--;
}
else { PORTC &= ~CS2; // отключить передатчик
UCSR0B |= 0x10;// разрешить приём
}
}

void main(void) {

// Программируем UART
UCSR1B = 0xd8; // разрешение приёма и передачи 1 канала, прерывание приёма и передачи,передача 9 бита
UCSR0B = 0xd8; // разрешение приёма и передачи 0канала, прерывание приёма и передачи
UBRR0 = 23; // скорость 19200
UBRR1 = 23; // скорость 19200
UBRRHI = 0;// старшие биты скорости передачи =0

// программирование Таймера 1 - на тактовую частоту 138,8 мкс - период 20 мс
TCCR1B |= 5; // коэффициент деления частоты генератора
TIMSK |= 0x80;// разрешить прерывания переполнения Таймера 1
TCNT1 = constDivTimer1; // зададим константу счёта
_SEI(); // разрешить прерывания


metka:

if(ft0) {
ft0 = 0;
UCSR0B &= ~0x10;// запретить приём
countUART = 3;// передать только три байта
ptrUART = &bufferUART.Adres;
PORTC |= CS2; // включить передатчик 0 канала
UDR0 = *ptrUART;

UCSR1B &= ~0x10; // запретить приём
PORTC |= CS1; // включить передатчик 1 канала
UDR1 = 0xaa;
}

goto metka;
}

Очень буду благодарен за помощь.

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

Ответы



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

E-mail: info@telesys.ru