приёмник USART в AVR

Обсуждаем контроллеры компании Atmel.
Ответить
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Сообщение eduardo »

Помогите пожалуйста разобраться:
Как только пишу в программе строку lev=getchar(); //принять данные из буфера приёмника и присвоить в переменную lev,
вся программа виснет. В программе ещё АЦП работает. Без этой строки прога работает нормально. Контроллер Mega 8.
Применена библиотека stdio.h.Пишу в CV AVR. Спасибо.

Установки USART:
UCSRA=0b00000000
UCSRB=0b00010000
UCSRC=0b00000110
UBRRH=0b00000010
UBRRL=0b00110011
Последний раз редактировалось eduardo Ср апр 09, 2014 12:44:30, всего редактировалось 1 раз.
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

все правильно, функция getchar() ждет прихода символа :)))
Ставим плюсы: )
Реклама
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Сообщение eduardo »

Т.е. когда передатчик отключен,на линии RXD сигналов нет,остальная часть программы работать не будет?
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

да)
Ставим плюсы: )
Реклама
Эиком - электронные компоненты и радиодетали
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Сообщение eduardo »

:dont_know: А что тогда делать в этом случае?
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1817
Зарегистрирован: Пн ноя 29, 2010 15:58:43

Сообщение igor-x »

программа ждет символа , значение символа присваивается в переменную lev.
после приема символа, программа переходит дальше.
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

eduardo писал(а):А что тогда делать в этом случае?
использовать другую функцию, которая не ждет прихода символа)
Ставим плюсы: )
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Можно не функцию. Можно настроить прерывание по приему байта - приняли и взвели флаг. А в теле программы проверять этот флаг.
Docendo discimus
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Сообщение eduardo »

pyzhman писал(а):Можно не функцию. Можно настроить прерывание по приему байта - приняли и взвели флаг. А в теле программы проверять этот флаг.
А как оно будет делаться это прерывание,если принятого байта нет,передатчик-то выключен. Нужно чтобы при выключенном передатчике
часть программы не связанная с USART продолжала работать.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Какой передатчик? Который в контроллер байт передает? Так в том и смысл прерывания, чтобы программа работала независимо от того, что с приемником в данный момент происходит. Нет байта - нет прерывания, прога крутится. Есть байт - прошло прерывания, флаг взвели, прога крутится и смотрит что флаг взведен - делаем что надо. Все.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Сообщение eduardo »

А как правильно организовать прерывание "регистр данных пуст"?
Пишу:
interrupt[USART_UDRE]void usart_udre_isr(void)
{
}
CV AVR выдает ошибку: не определён символ USART_UDRE.
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Mega8.H :

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

// Interrupt vectors definitions
#define USART_RXC 12
#define [b]USART_DRE[/b] 13
#define USART_TXC 14
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Сообщение eduardo »

interrupt[USART_DRE] прокатило.
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Сообщение eduardo »

Переписал прогу,сделал через прерывания--заработало(в протеусе).Всем спасибо за помощь.
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Сообщение eduardo »

Зашил в железо появилась другая проблема. Через усарт передаются 3 переменных.

putchar(lev);putchar(prav);putchar(diskr); // передатчик

lev=getchar();prav=getchar();diskr=getchar(); // приёмник

Оба контроллера запитаны от одного источника,но все 3 переменные в приёмнике меняются местами.Значение
lev присваивается в diskr , а diskr идёт в prav.Ну как-то так в общем. Подскажите пожалуйста как это можно исправить?

В протеусе,естественно,такого не было. :solder:
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

prav=getchar();diskr=getchar();lev=getchar(); // приёмник :)))
Ищите, где накошачили
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Значения передаются по кругу? Скорее всего один из контроллеров стартует позднее, пропускает одну переменную и все сбивается. Передающий должен просто подождать подольше перед первой посылкой.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Сообщение eduardo »

Вообще,в дальнейшем планирую контроллеры запитать от разных источников,а сигналы передавать по радиоканалу.
Может старт-стоп битами можно что нить сделать?
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Сообщение eduardo »

Ну вот,если долго мучицца,чё-нить да получицца... Решил попробовать перед отправкой переменной отправлять переменную-код:
передатчик:
putchar(85); //отправляем код
putchar(lev); //отправляем переменную

putchar(84);
putchar(prav);

putchar(83);
putchar(diskr);

приёмник:

unsigned char kodtx; // объявим переменную,куда будем сохранять переменную-код передатчика.
kodtx=getchar();// принять код для переменной lev
if(kodtx==85)lev=getchar();// если код верен,принять переменную lev

kodtx=getchar();// принять код для переменной prav
if(kodtx==84)prav=getchar();// если код верен,принять переменную prav

kodtx=getchar();// принять код для переменной diskr
if(kodtx==83)diskr=getchar();// если код верен,принять переменную diskr.

Ну вобщем как-то так.Как думаете,прокатит?Сейчас пока радиоканала нет,данные передаются по проводу. Результат очень даже приемлемый,сбоев не наблюдалось.Как сделаю радиоканал,о результатах отпишусь.Спасибо.
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Коль речь пошла про радиоканал, то может потребоваться более хитрая обработка.
В простейшем случае:
[Маркер пакета/синхронизация][Данные пакета][Контрольная сумма][Пауза перед следующим пакетом]
По паузе в передаче можно однозначно определить начало посылки.
Если данные приходят битые, то пакет выбрасывается/перезапрашивается.
Если пакет приходит не полностью(помеха, слабый сигнал и т.д.), то срабатывает таймаут, пакет выбрасывается/перезапрашивается.

То как есть скорее всего не прокатит. Если конечно приемник-передатчик не имеют встроенные механизмы коррекции ошибок.
Ответить

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