Страница 1 из 2

приёмник USART в AVR

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

Установки USART:
UCSRA=0b00000000
UCSRB=0b00010000
UCSRC=0b00000110
UBRRH=0b00000010
UBRRL=0b00110011

Re: приёмник USART в AVR

Добавлено: Ср апр 09, 2014 12:40:04
ibiza11
все правильно, функция getchar() ждет прихода символа :)))

Re: приёмник USART в AVR

Добавлено: Ср апр 09, 2014 12:47:39
eduardo
Т.е. когда передатчик отключен,на линии RXD сигналов нет,остальная часть программы работать не будет?

Re: приёмник USART в AVR

Добавлено: Ср апр 09, 2014 12:50:23
ibiza11
да)

Re: приёмник USART в AVR

Добавлено: Ср апр 09, 2014 16:40:04
eduardo
:dont_know: А что тогда делать в этом случае?

Re: приёмник USART в AVR

Добавлено: Ср апр 09, 2014 16:56:37
igor-x
программа ждет символа , значение символа присваивается в переменную lev.
после приема символа, программа переходит дальше.

Re: приёмник USART в AVR

Добавлено: Ср апр 09, 2014 17:18:22
ibiza11
eduardo писал(а):А что тогда делать в этом случае?
использовать другую функцию, которая не ждет прихода символа)

Re: приёмник USART в AVR

Добавлено: Ср апр 09, 2014 18:29:49
pyzhman
Можно не функцию. Можно настроить прерывание по приему байта - приняли и взвели флаг. А в теле программы проверять этот флаг.

Re: приёмник USART в AVR

Добавлено: Чт апр 10, 2014 11:31:21
eduardo
pyzhman писал(а):Можно не функцию. Можно настроить прерывание по приему байта - приняли и взвели флаг. А в теле программы проверять этот флаг.
А как оно будет делаться это прерывание,если принятого байта нет,передатчик-то выключен. Нужно чтобы при выключенном передатчике
часть программы не связанная с USART продолжала работать.

Re: приёмник USART в AVR

Добавлено: Чт апр 10, 2014 13:09:05
Engineer_Keen
Какой передатчик? Который в контроллер байт передает? Так в том и смысл прерывания, чтобы программа работала независимо от того, что с приемником в данный момент происходит. Нет байта - нет прерывания, прога крутится. Есть байт - прошло прерывания, флаг взвели, прога крутится и смотрит что флаг взведен - делаем что надо. Все.

Re: приёмник USART в AVR

Добавлено: Сб апр 12, 2014 03:11:59
eduardo
А как правильно организовать прерывание "регистр данных пуст"?
Пишу:
interrupt[USART_UDRE]void usart_udre_isr(void)
{
}
CV AVR выдает ошибку: не определён символ USART_UDRE.

Re: приёмник USART в AVR

Добавлено: Сб апр 12, 2014 13:14:38
uk8amk
Mega8.H :

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

// Interrupt vectors definitions
#define USART_RXC 12
#define [b]USART_DRE[/b] 13
#define USART_TXC 14

Re: приёмник USART в AVR

Добавлено: Вс апр 13, 2014 00:23:31
eduardo
interrupt[USART_DRE] прокатило.

Re: приёмник USART в AVR

Добавлено: Пн апр 14, 2014 23:43:23
eduardo
Переписал прогу,сделал через прерывания--заработало(в протеусе).Всем спасибо за помощь.

Re: приёмник USART в AVR

Добавлено: Пт апр 18, 2014 23:59:50
eduardo
Зашил в железо появилась другая проблема. Через усарт передаются 3 переменных.

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

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

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

В протеусе,естественно,такого не было. :solder:

Re: приёмник USART в AVR

Добавлено: Сб апр 19, 2014 00:08:13
ИС-пытатель
prav=getchar();diskr=getchar();lev=getchar(); // приёмник :)))
Ищите, где накошачили

Re: приёмник USART в AVR

Добавлено: Сб апр 19, 2014 00:15:04
Engineer_Keen
Значения передаются по кругу? Скорее всего один из контроллеров стартует позднее, пропускает одну переменную и все сбивается. Передающий должен просто подождать подольше перед первой посылкой.

Re: приёмник USART в AVR

Добавлено: Сб апр 19, 2014 01:12:43
eduardo
Вообще,в дальнейшем планирую контроллеры запитать от разных источников,а сигналы передавать по радиоканалу.
Может старт-стоп битами можно что нить сделать?

Re: приёмник USART в AVR

Добавлено: Чт апр 24, 2014 02:14:04
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.

Ну вобщем как-то так.Как думаете,прокатит?Сейчас пока радиоканала нет,данные передаются по проводу. Результат очень даже приемлемый,сбоев не наблюдалось.Как сделаю радиоканал,о результатах отпишусь.Спасибо.

Re: приёмник USART в AVR

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

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