Вопрос по прерыванию.

Обсуждаем контроллеры компании Atmel.
Ответить
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Сообщение Pika4u »

Вопрос-насколько затормозит контроллер выполнение следующей функции прерывания:

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

#pragma vector=USART_RXC_vect 
__interrupt void Uart_RX(void)
{
receive[rec]=UDR;
switch (rec)
{
case 0:
{
switch(receive[rec])
case 248:back_back();
case 252:back_forward();
case 249:back_back_and_turn_left();
case 250:back_back_and_turn_right();
case 253:back_forward_and_turn_left();
case 254:back_forward_and_turn_right();
case 255:brake();
}
case 1:
engine_power=receive[rec];
}
rec++;
if(rec==2)
rec=0;
}
Каждая вызываемая функция что-то типа:

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

PORTD_Bit5=0;
PORTD_Bit6=1;
PORTD_Bit7=0;
Контроллер ATMega8,частота 10 МГц,скорость UART 9600. Критична ли будет такая функция прерывания? Или лучше скорость снизить? В принципе,мне гонять в одну сторону 2 байта,в другую 3 раз в секунду. :)
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Реклама
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

может опишите что за устройство планируется? switch
Контактная информация:
Реклама
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

После case еще break нехудо бы ставить.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Там есть "один на всех" адвансед брак-бряк-мутант...

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

case 255:brake();
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
Эиком - электронные компоненты и радиодетали
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

дело даже не в брейках - и не в том, что не проверяется отсутствие стопового бита и переполнение буфера приема - дело в излишней доверчивости.
С ком порта может придти все, что угодно - передернули разъем, щелкнули питание - а вы всему верите и что-то выполняете...
Верить ком-порту нужно тогда, когда контрольная сумма пакета сойдется.
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

+ таймаут. Истёк - сброс счётчика байтов и приём заного, игнорируя то, что приняли.
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

HHIMERA писал(а):Там есть "один на всех" адвансед брак-бряк-мутант...

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

case 255:brake();
Если кто не в курсе brake это тормоз, видать моделька должна остановиться при этой команде.

Вообще не сильно затормозит, если всего три команды, но лучше в прерывании принимать в буфер и обрабатывать в основном цикле.
Затем можно помещать в очередь команд либо сразу выполнять.
Выполнять так же можно по таймеру.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Сообщение Pika4u »

vitalik_1984 писал(а):
HHIMERA писал(а):Там есть "один на всех" адвансед брак-бряк-мутант...

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

case 255:brake();
Если кто не в курсе brake это тормоз, видать моделька должна остановиться при этой команде.

Вообще не сильно затормозит, если всего три команды, но лучше в прерывании принимать в буфер и обрабатывать в основном цикле.
Затем можно помещать в очередь команд либо сразу выполнять.
Выполнять так же можно по таймеру.
Да действительно,вы угадали,что это будет моделька)) просто в основном цикле будет еще и опрос датчиков,а 18b20 опрашивается около секунды. Поэтому решил повесить управление двигателями на прерывания. Ах да,про break я забыл( сейчас поставлю)
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

если семи значений скорости достаточно можно оставить один байт
примерно так
Спойлер

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

typedef union
{
struct
        {
         unsigned char  reserv1:3;
         unsigned char all:5;

        };      
struct
        {
         unsigned char  reserv2:3; 
         unsigned char forward:1;
         unsigned char    back:1;
         unsigned char    left:1;
         unsigned char   right:1;
         unsigned char    stop:1;
         
        };    
        }struct_upravl;
#define upravl  (*((struct_upravl*)&PORTD)) 


#pragma vector=USART_RXC_vect
__interrupt void Uart_RX(void)
{
unsigned char temp;
temp=UDR;// 
upravl.all = temp;
engine_power=temp&0xE0;

}
или даже так
Спойлер

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

#pragma vector=USART_RXC_vect
__interrupt void Uart_RX(void)
{
unsigned char temp;
temp=UDR;
engine_power=temp&0xE0;
temp &= 0x1F;
PORTD &= temp | 0xE0;
PORTD  |= temp ;
}
возвращаясь к вашем коду, если вдруг порядок байтов (мощности и команд )во время приема будет случайно нарушен(помехи контакт ) тогда что?
правильно советуют, задействуйте таймер (прерывание по сравнению например ), а на момент опроса датчика температуры будете запрещать прерывания. при этом заданные интервалы времени можно использовать для определения тайм аута приемника и ожидания конвертации датчика температуры.
насчет необходимости защиты передаваемой информации тоже согласен.простенький избыточный код не повредит.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Сообщение Pika4u »

А вы ведь правы))) Хорошо,простенькую защиту поставлю. А ведь мне хватит 10 значений скорости. В первом байте направление определяют последние 3 бита. А остальные 5 можно задействовать для скорости. Спасибо огромное!))Даже счетчик байт оказался не нужен :)
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

в место

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

switch (rec)
{
case.....
если три бита, то можно написать 8 байт в массив кодов состояний (0,вперед, назад, вперед+влево, вперед+вправо, назад+влево, назад+вправо, стоп)
и отправлять значение по принятому адресу в регистр порта с некоторыми манипуляциями(если остальные ножки порта используется для других целей ).
что то вроде ентого

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


__flash unsigned char code[8]={0,x,x,x,x,x,x,x};//состояние пинов порта
#pragma vector=USART_RXC_vect
__interrupt void Uart_RX(void)
{
unsigned char temp;
temp=UDR;
PORTD = code[(temp&0x07)];//если пины порта  не задействованы для других операций
/*
PORTD &= code[(temp&0x07)] | X; //если пины порта задействованы для других операций, Х- маска остальных бит порта
PORTD |= code[(temp&0x07)];
*/
engine_power=temp&0xF8;
}
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Сообщение Pika4u »

Спасибо! В engine_power у меня хранится значение ШИМ для двигателя. Добавлю switch и все окей будет :))
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

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

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

engine_power=temp&0xF8;
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Сообщение Pika4u »

О,даже так можно))) Спасибо большое!)))
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Сообщение ut1wpr »

phanis писал(а):Не совсем понимаю зачем нужен switch , если все будет передаваться одним байтом
Вот непонимаха! Ну как же на один байт контрольную сумму прилепишь? А urry ее требует! Иначе все рухнет. :) :) :) :)
Ну, а если серьезно, то в распоряжении программиста всегда есть контроль над регистром статуса порта коммуникации и можно (скорее нужно) проверять флаги ошибок. А сам обмен организовать с обязательным квитированием. Даже если он однобайтовый. Вообще-то, организация обмена без зависаний и без ошибок по USART-у не так тривиальна, как кажется.
С уважением,
Виктор.
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

Ну еще можно например так
приняли 2 одинаковых байта подряд значит это команда а не мусор.

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


#pragma vector=USART_RXC_vect
__interrupt void Uart_RX(void)
{
static unsigned char old_byte;
unsigned char temp;
temp=UDR;
if (old_byte==temp)
{
действия
}
old_byte=temp;
}
urry о регистрах статуса тож упоминал.
По поводу квитирования, как это можно здесь использовать?
Контактная информация:
Ответить

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