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

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

1 2

Вчера весь вечер ковырялся, так ничего и не вышло. Стало ясно только одно - ошибка FRAMING_ERROR.
Это предложили сделать так на другом форуме (надеюсь я не нарушаю правил приличия публикуя свой вопрос в разных форумах)

Я попробывал менять местами A и B, но результат один и тот же. PORTB.7 у меня сконфигурирован выходом и отрабатывает.

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

Я его не модифицировал. Строка PORTB.7=1 конечно находится в скобках. Это я здесь забыл их поставить.
Мне интересно вот что, это условие (if ....) проверяется после приема всего пакета данных?

chav1961: Проект выложите. Или, по крайней мере, инициализацию USART.
Проекта как такого нет. Есть сгенерированный CVAVR код:

// 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)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}

И вставляя строчку PORTB.7=1, я хочу понять, принимаются ли данные и корректны ли они.
Их обработкой я хочу заняться потом.

 

Подцепите ваш девайс к Винде, сделайте в обработчике прерываний UDR=UDR (т.е. пересылка полученного символа обратно на передающую сторону), и попробуйте в гипертерминале понабирать что-нибудь на клаве. Не забудьте сначала настроить COM-порт компа на требуемую скорость. Если все работает правильно, на экране должен с небольшой задержкой появляться клавиатурный ввод. Отпишитесь по результатам. Пока никаких других идей нет.

 

Прораб счастья: Мне интересно вот что, это условие (if ....) проверяется после приема всего пакета данных?
Условие у вас в прерывании, а прерывание возникает после приёма байта (флаг RXC).
Вот что у Трамперта написано "Флаг FE(Framing Error) устанавливается в лог.1 при обнаружении ошибки кадрирования. Это происходит, если при трёх сканированиях стоп-бита был более одного раза обнаружен лог.0, и тем самым стоп-бит был распознан как сигнал низкого уровня. Флаг FE сбраывается, когда стоп-биту соответствует сигнал высокого уровня."
Так что скорее всего у вас несоответствие скоростей приёма.
Попробуйте для начала из МК передавать в комп в гипертерминале, передача проще чем приём. Мой код для передачи ниже.
UDR=var_PA;
while (!(UCSRA &(1TXC)));
UCSRA |= (1TXC);
UDR=13;
while (!(UCSRA &(1TXC)));
UDR=10;
UCSRA |= (1TXC);
Передаёт переменную var_PA, или можете напрямую кидать символы, например UDR='G'.Затем ждёт конца передачи символа, сбрасывает флаг TXC. Затем переход на следующую строку.
Если в гипертерминале будут не кракозябрики, переходите к приёму, как chav1961 вас посоветовал, или я дам пример моего кода, правда я выкинул буфер приёма.

 

chav1961

gan

Спасибо, на выходных попробую!
Что-то у меня этот форум подключивает - то войти не могу, то выйти не могу, то добалять комментарии не получается! На стартовой странице нахожусь, форум меня узнает. Перехожу к этой теме, и как будто не залогинился... Ничего не понимаю

 

Всё! Я его победил
В общем, все банально - не правильно были выставлены фьюзы. Генератор работал не на 8МГц, а на 4. Отсюда и FRAMING ERROR.
Выяснилось это при попытках передачи на комп. Так что действительно легче настроить сначала передатчик, а затем приемник.
Спасибо всем за участие!

 
1 2