Помогите пожалуйста разобраться:
Как только пишу в программе строку 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 раз.
pyzhman писал(а):Можно не функцию. Можно настроить прерывание по приему байта - приняли и взвели флаг. А в теле программы проверять этот флаг.
А как оно будет делаться это прерывание,если принятого байта нет,передатчик-то выключен. Нужно чтобы при выключенном передатчике
часть программы не связанная с USART продолжала работать.
Какой передатчик? Который в контроллер байт передает? Так в том и смысл прерывания, чтобы программа работала независимо от того, что с приемником в данный момент происходит. Нет байта - нет прерывания, прога крутится. Есть байт - прошло прерывания, флаг взвели, прога крутится и смотрит что флаг взведен - делаем что надо. Все.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
А как правильно организовать прерывание "регистр данных пуст"?
Пишу:
interrupt[USART_UDRE]void usart_udre_isr(void)
{
}
CV AVR выдает ошибку: не определён символ USART_UDRE.
Оба контроллера запитаны от одного источника,но все 3 переменные в приёмнике меняются местами.Значение
lev присваивается в diskr , а diskr идёт в prav.Ну как-то так в общем. Подскажите пожалуйста как это можно исправить?
Значения передаются по кругу? Скорее всего один из контроллеров стартует позднее, пропускает одну переменную и все сбивается. Передающий должен просто подождать подольше перед первой посылкой.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Вообще,в дальнейшем планирую контроллеры запитать от разных источников,а сигналы передавать по радиоканалу.
Может старт-стоп битами можно что нить сделать?
Ну вот,если долго мучицца,чё-нить да получицца... Решил попробовать перед отправкой переменной отправлять переменную-код:
передатчик:
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.
Ну вобщем как-то так.Как думаете,прокатит?Сейчас пока радиоканала нет,данные передаются по проводу. Результат очень даже приемлемый,сбоев не наблюдалось.Как сделаю радиоканал,о результатах отпишусь.Спасибо.
Коль речь пошла про радиоканал, то может потребоваться более хитрая обработка.
В простейшем случае:
[Маркер пакета/синхронизация][Данные пакета][Контрольная сумма][Пауза перед следующим пакетом]
По паузе в передаче можно однозначно определить начало посылки.
Если данные приходят битые, то пакет выбрасывается/перезапрашивается.
Если пакет приходит не полностью(помеха, слабый сигнал и т.д.), то срабатывает таймаут, пакет выбрасывается/перезапрашивается.
То как есть скорее всего не прокатит. Если конечно приемник-передатчик не имеют встроенные механизмы коррекции ошибок.