ATTiny167 UART problem

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Доброго времени суток всем котам! Кто запускал UART на ATTiny167 подскажите пожалуйста: не могу принять данные. Передача со стороны контроллера идет без проблем:

Код: Выделить всё

LINDAT = data;
while (!(LINSIR & (1 << LTXOK)));
А приема нету:

Код: Выделить всё

while (( LINSIR & (1 << LBUSY)) );
BYTE i = LINDAT;
Данные на линии физически есть (проверялось осциллографом).
Инициализация UART:

Код: Выделить всё

LINBTR = (1 << LDISR) | SAMPLES_PER_BIT; // set 9600 bod
LINBRR = ((F_CPU / SAMPLES_PER_BIT) / BAUD_RATE) - 1; // set 9600 bod
LINCR = 0x0F; // UART is enable, Tx and Rx are enabled too
Данные на пин поступают, а регистр данных пуст, т.е. uart не принимает. Почему?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

1) почему проверяете LBUSY, а не LRXOK? Я с LIN/UART не работал, только с чистым UART, просто интересно...
2) где сброс флагов?
3) и вообще, лучше весь код приводить, а то не понятно как расположены относительно друг друга строки приема и передачи...
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Насчет LBUSY и LRXOK согласен. Но сейчас я вообще запихнул прием в прерывание. При инициализации добавил строчку:

Код: Выделить всё

LINENIR = 0x01; // Receive interrupt is enable
Код, конечно, могу выкинуть, но там уже очень много всего помимо uart. Только будет сбивать...
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Может кому-то пригодится. Инициализируется UART следующим образом:

Код: Выделить всё

#define SAMPLES_PER_BIT  8
#define BAUD_RATE        9600

LINCR = (1<<LCMD0)|(1<<LCMD1)|(1<<LCMD2); // enable UART Full Duplex mode
LINBTR = (1 << LDISR) | SAMPLES_PER_BIT; // set 9600 bod
LINBRR = ((F_CPU / SAMPLES_PER_BIT) / BAUD_RATE) - 1; // set 9600 bod
LINENIR = 0x01; // Receive interrupt is enable
LINCR |= (1<<LENA); // UART is enable, Tx and Rx are enabled too
прерывание по приему:

Код: Выделить всё

ISR (LIN_TC_vect)
{
}
передача байта:

Код: Выделить всё

void UART_write(BYTE data)
{
	LINDAT = data;
	while (!(LINSIR & (1 << LTXOK)));
}
Всем спасибо за помощь!
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «AVR»