roboforum.ru

Технический форум по робототехнике.

UDR0=0; -запрещенная комманда???

UDR0=0; -запрещенная комманда???

wolly » 02 дек 2007, 21:42

Код: Выделить всёРазвернуть
UDR0=0; // передать 0 в USART0 если передача разрешена - avr123.nm.ru 


По ходу процесса необходимо что бы пришедший в USART0 символ (команда) выполнил свое действие и канул в небытие, не мешая выполнению дальнейшего кода.
Попробовал следующее:
Код: Выделить всёРазвернуть
char rx_data=0;           //инициализация переменной
//... в самом теле цикла программы...
rx_data=UDR0;            //присвоение переменной пришедшего символа (если он пришел)
UDR0=0;                     //стирание регистра приема
//... в следующем цикле если нет символа в регистре приема, то в переменной 0.
rx_data=UDR0;
//Далее цикл крутится в ожидании команды.


При симуляции в VMLab выходит следующее сообщение:
Код: Выделить всёРазвернуть
[PC = $04FE, Time =    1.85 ms, {PER}]: UART write overrun: UDR not yet transmitted (status bit UDRE = 0)

Что это?
UDR0=0; --- запрещенная комманда??? :(
Последний раз редактировалось avr123.nm.ru 06 дек 2007, 12:51, всего редактировалось 3 раз(а).
Причина: не забываем оформлять тегами [code] текст программ

Re: UDR0=0; -запрещенная комманда???

avr123.nm.ru » 02 дек 2007, 22:15

Нужно прочитать про устройство регистра UDR0 - его двойственность.

Re: UDR0=0; -запрещенная комманда???

Myp » 03 дек 2007, 10:53

avr123.nm.ru писал(а):"nЭто до прочитать устройство регистра UDR0 - его двойственность.

мммм
я так понимаю ты посоветовал почитать про устройство регистра UDR0
в частности про его двойственность??
ато я не совсем уверен что правильно прочитал твою реплику =/
если АВР начнёт ещё и буквы пропускать...
наступит конец света

Re: UDR0=0; -запрещенная комманда???

wolly » 04 дек 2007, 12:02

avr123.nm.ru писал(а):Нужно прочитать про устройство регистра UDR0 - его двойственность.

Читаю источник:
www.gaw.ru писал(а):Если выполнять запись по адресу регистра UDRn, то записываемые данные помещаются в буферный регистр данных передатчика TXBn. При чтении регистра UDRn извлекается содержимое буферного регистра данных приемника RXBn.

Исходя из прочитанного непонятно, как очищается двойственный регистр UDR0? Или принятый символ висит в RXB0 до тех пор пока на его место не будет принят следующий?
Судя по Watch так и выходило :(
Дрянь дело :o
Дело в том, что по алгоритму МК должен выполнять опр. действие до тех пор, пока извне приходят управляющие символы, когда же они не поступают МК должен "молотить" по поставленной задаче и ожидать дальнейшей команды.
По аналогии: жму кнопку - "идет", отпустил - "стоит".
Не подскажите, как в этом случае можно организовать подобное управление

Re: UDR0=0; -запрещенная комманда???

Master » 04 дек 2007, 12:27

А что не ясно.
Цикл While(1)
в нем постоянно опрашиваем USART на предмет поступления нового символа, если поступли обробатываем его.

Добавлено спустя 3 минуты 36 секунд:
Код: Выделить всёРазвернуть
while (1)
      {
       x=getchar();   
       itoa(x, stx);
       lcd_puts(stx);}
      };

Вот код ждем символ из usart, когда его получаем выводим на LCD код символа.

Re: UDR0=0; -запрещенная комманда???

wolly » 04 дек 2007, 13:59

Master писал(а):А что не ясно.
Цикл While(1) в нем постоянно опрашиваем USART на предмет поступления нового символа, если поступли обробатываем его

C While(1) все ясно...
Но! Программа не должна сидеть в While(1){опрос USART}, она должна выполнять и иные более полезные действия :oops: Обращение к USART у меня лишь одна из многих операций в довольно большом цикле While(1) поскольку внешние команды лишь изменяют режимы работы устройства на МК.
Я хочу добиться того, что бы УПРАВЛЕНИЕ устройства кнопками на панели, или поступающими извне командами, для оператора НЕ ОТЛИЧАЛОСЬ.
Внешняя команда все равно, как импульс опрокидывания триггера - пришла, переключила и ушла... Сейчас же поступившая команда висит в UDR0 до тех пор пока ее не сменит другая.
Вот поэтому я ее наивно хотел сбросить в конце While(1)...
проблема однако...:RTFM:

Re: UDR0=0; -запрещенная комманда???

Master » 04 дек 2007, 14:28

Так сделай прерывание по получению USARTом символа или опришивай USART 10 раз в сек к примеру, на предмет нового символа.
Вот как-то так.

Re: UDR0=0; -запрещенная комманда???

avr123.nm.ru » 04 дек 2007, 14:36

Пример прерывания и буфера приема в http://www.avr123.nm.ru/z5.htm

конфигурирует мастер CVAVR

Re: UDR0=0; -запрещенная комманда???

wolly » 04 дек 2007, 16:04

Master писал(а):Так сделай прерывание... или опрашивай 10 раз в сек...

Прерывание, это один из возможных вариантов, но в моем случае он годится только для части команд, того же перехода к другому режиму например.
В начале моей программе необходимо вывести устройство в начало координат. Кнопками оно выводится так - пока жму "Влево" движется влево, пока "Вправо" - вправо. Вывел и ... "Поехали" - система начала барабанить в авто-режиме пока я ее не опрокинул "Стоп"-ом.
Вот эти команды вправо-влево-вверх-вниз должны выполняться и командами удаленного управления, т.е. пока поступают символы - движение, перстали поступать - стоим, ждем-с...
Если сделать их через предложенную CVAR функцию с прерыванием, то будет выполнено столько шагов, сколько (в штуках))) было получено символов.... неудобно :(
Оттого-то и вся морока с зависшим в UDR0 символом который не дает системе перейти к следующему действию.

Добавлено спустя 8 минут 26 секунд:
avr123.nm.ru писал(а):прерывания и буфера приема конфигурирует мастер CVAVR

Насколько я понял из того, что мне сконфигурировал мастер-CVAVR, до поступления символа в UDR0, прог-а будет "молотить" в закрытом цикле откликаясь только на прерывания. Это не есть хорошо. Удобнее если вместо While(пока нет символа) у меня будет стоять if(если пришел символ){делай то-то;}
Ведь команды приходят время от времени, а про-га молотит постоянно, зачем ей постоянно ждать в While(пока нет символа)?

Re: UDR0=0; -запрещенная комманда???

Master » 04 дек 2007, 16:14

Ну хорошо с порта пришла команда влево случилось прерывание и в переменную движение DVIJ записалось влево, в осоновном цикле while (1) просиходит обработка того что содержится в DVIJ, там содержится влево и он молотит влево, потом ты нажал пробел типа стоп и в DVIJ записалось стоп, обработка в основном цикле на стоп в переменной DVIJ дало команду стоять двигателям.

Re: UDR0=0; -запрещенная комманда???

wolly » 09 дек 2007, 20:54

Спасибо Master. Не мытьем ее взял, так катаньем :Yahoo!: Так и сделал: символ "f" вперед, "s" соответственно стой!

Re: UDR0=0; -запрещенная комманда???

Master » 10 дек 2007, 00:43

:oops: да ладно, чего уж там.
:D


Rambler\'s Top100 Mail.ru counter