Свежие обсуждения
Микроконтроллеры

Проблема с приемом данных USART в ATtiny2313

1 2

Добрый день!

Есть проблема, которую я никак не могу решить.

Спаял схему, в которой данные в МК должны поступать по протоколу Модбас через ADM1485.
В CodeVisionAVR создаю проект, в котором настраиваю все параметры МК. Снизу часть сгенерированного текста, относящаяся к обработке прерывания:

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status= UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
...

Все вроде бы собрано правильно, но МК не хочет воспринимать данные. Для проверки срабатывания прерывания я включил в текст строку:

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status= UCSRA;
data=UDR;
PORTB.7=1
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
...

После прихода на МК посылки, PORTB.7 меняет свое состояние, что говорит об срабатывании прерывания. Но если я включаю строчку после проверки if:

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status= UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
PORTB.7=1
...

, то МК перестает реагировать на пакеты.
Скорость передатчика и приемника выставлены одинаковыми. Я пробывал с разными скоростями. Пробывал и от внешнего кварца и от внутреннего генератора.
Где-то я прочел, что в этом условии проверяется наличие аппаратной ошибки. Получается, что МК плохой? Или еще какая-то другая причина может быть?

 

PB7 настроен выходом ? Советую помоделировать в PROTEUS 7.4 и лучше весь проект сюда архивом прицепить.

 

axuliya: Поменяйте НИК! ... здесь вам не тут!

 

Прораб счастья: if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
PORTB.7=1
...
, то МК перестает реагировать на пакеты.

Похоже просто if (ложь) у вас - т.е. некоторые параметры FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN равны "1" и потому строка PORTB.7=1 не выполняется.

 

Проект выложите. Или, по крайней мере, инициализацию USART.

 

Я тоже пытался разобраться с этим RX-буфером, потом его выкинул и принимал по-байтно.
Эта строка if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
проверяет принят ли байт без ошибок (см.регистр UCSRA, 2-й[PE], 3-й[DOR],4-й[FE] биты). Если без ошибок, байт записывается в следующую ячейку буфера (массива) rx_buffer[rx_wr_index]=data;
А вы эту строку PORTB.7=1 в блок поставили? а то непонятно по тому, как вы показали.

 

gan: А вы эту строку PORTB.7=1 в блок поставили?

блок - имеется ввиду скобки {}

 

gan: пытался разобраться с этим RX-буфером, потом его выкинул

Буфер прекрасно работает после создания его мастером кода CVAVR. А переставет работать после неосознаной модификации.

 

Ну да.
Попробуйте поставить PORTB.7=1 перед последней в этой функции usart_rx_isr скобкой, потом подымайтесь.

Tapshtezi: Буфер прекрасно работает после создания его мастером кода CVAVR.
То есть, если я правильно понял, по прерыванию заполняется буфер, потом функцией
char getchar(void) он считывется? Я в принципе всё там понимаю, кроме #pragma used+ и #pragma used-

 

gan: если я правильно понял, по прерыванию заполняется буфер, потом функцией
char getchar(void) он считывется?

В прерывании символ заносится в буфер. но буфер не должен заполняться так как символы будут теряться. Вы должны успевать считывать символы. Для этого и есть выбор размера бувера - он должен быть таким что бы не переполняться.

gan: там понимаю, кроме #pragma used+ и #pragma used-

Это указания препроцессору что использовать а что нет. Возможно в хелпе CVAVR 2 есть толклование. Но по проге нваверняка видно для чего они.