управление нагрузкой (RF модули)

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Аватара пользователя
Сообщения: 43
Зарегистрирован: Чт фев 28, 2013 00:08:02
Откуда: Украина

Сообщение Vovchik.fva »

Здравствуйте не подскажете по поводу RF модулей хочу сделать управление на 2 команды для включения и выключения света. Посылку передаваемую посылаю: стартовый бит, код команды. По стартовому биту происходит прерывание мк в приемнике и он переходит в режим приема посылки. Так вот при реализации в железе думаю, что когда передатчик уйдет в сон то на выходе приемника будет помеха, которая как я думаю будет вызывать постоянное прерывание мк (из-за изменения уровня напряжения на ножке) и остальная часть программы работать не будет. подскажите как переделать программу если это так, в програмировании не очень силен это первая программа.


КОД ПРОГРАММЫ


unsigned char Rx_coun; //переменая счетчика бит
unsigned char Rx_byte; //принятый байт
unsigned char Led_ON; //бит состояния led

unsigned char read_adc(unsigned char adc_input) //вызов функции ацп
{
ADMUX=adc_input|ADC_VREF_TYPE; //инициализация входа АЦП
delay_us(10); //задержка стабилизации входного напряжения
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH; //результат АЦП

//подготовляем АЦП к следующему циклу работы
ADCSRA=0xc6;
ADMUX=ADC_VREF_TYPE;
}

interrupt [PC_INT0] void pin_change_isr(void) //прерывание для приема бит
{
GIMSK=0x00; //выключить прерывание по пинам
PCMSK=0x00; //прерывание установлено на 5 вход

delay_ms(1.3); //задержка перед приемом кадра
for (Rx_coun=8;Rx_coun>0;Rx_coun--) //подсчет пренимаемых бит (их восемь)
{
if (PINB.0 & 0b00000001==0b00000001) //выделение первого бита из байта числа
{
Rx_byte|=0b00000001;
if (Rx_coun>1) Rx_byte=Rx_byte<<1; //подготовка к приему следующего бита
}
else
{
if (Rx_coun>1) Rx_byte=Rx_byte<<1; //подготовка к приему следующего бита
};
delay_ms(1); //задержка между принимаемыми битами
};

GIMSK=0x20; //включить прерывание по пинам
PCMSK=0x01; //прерывание установлено на 5 вход
}

void Led_init(unsigned char Led) //функция "обработки led"
{
switch (Led)
{
case 1: //вкл. led
{
PORTB.2=1; //led горит
}
break;
case 2: //мигает led
{
PORTB.2=1; //led горит
delay_ms(500); //задержка на выключение
PORTB.2=0; //led потушен
delay_ms(500); //задержка на включение
}
break;
case 3: //выкл. led
{
PORTB.2=0; //led потушен
}
};
}

void main(void) //главная функция
{

// RC цепочка выставлена на 9,6 мГц
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Инициализация портов вход/выход
PORTB=0x01;
DDRB=0x06;
/*
0 - вход с логической единицей (Rx)
4 - вход с логической единицей (защита по напряжению)
3 - вход с логической единицей (защита от перегрузки и КЗ по току)
1 - выход нагрузка
2 - выход led
*/

// инициализация прерывания
GIMSK=0x20; //включить прерывание по пинам
MCUCR=0x00; //обработка прерываний по высокому, низкому уровню, по нарастанию, спаду
PCMSK=0x01; //прерывание установлено на 5 вход
GIFR=0x20; //флаг прерывания

// инициализация АЦП
DIDR0&=0x03;
DIDR0|=0x18;
ADMUX=ADC_VREF_TYPE; //8-бит АЦП
ADCSRA=0xc6; //вкл. АЦП, установка тактовой частоты АЦП

Rx_byte=0x00; //обнуляем принятый байт

#asm ("sei") //разрешить глобальные прерывания

while (1) //безконечный цикл

{
if (read_adc(3)>153) //проверка датчика тока (перегрузка)
{
delay_ms(80); //задержка проверки ложного срабатывания
if (read_adc(3)>153) //проверка датчика тока (повторно)
{
PORTB.1=0; //выкл. нагрузка
if (Rx_byte==0b10001010)
{
Led_ON=1; //led мигает сработал датчик
Rx_byte=0x00; //сброс принятого байта
};
};
};

if (read_adc(2)>204 || ADCH<102) //проверка датчика напряжения
{
PORTB.1=0; //выкл. нагрузка
if (Rx_byte==0b10001010)
{
Led_ON=1; //led мигает сработал датчик
Rx_byte=0x00; //сброс принятого байта
};
}

if (Rx_byte==0b10001010) //выполнение команды с кодом 01010001 (вкл. нагрузки)
{
PORTB.1=1; //вкл. нагрузки
Led_ON=0; //мигание led отключено
Led_init(1); //вызов функции вкл. led
};

if (Rx_byte==0b01000110) //выполнение команды с кодом 01100010 (выкл. нагрузки)
{
PORTB.1=0; //выкл. нагрузки
Led_ON=0; //мигание led отключено
Rx_byte=0x00; //сброс принятого байта
Led_init(3); //вызов функции выкл. led
};

if (Led_ON==1) //проверка led мигает?
{
Led_init(2); //вызов функции led мигает
};
};
}

:dont_know:
Вложения
komplekt-rf-moduley-433-mhz (1).jpg
(68.42 КБ) 756 скачиваний
Реклама
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Думаю, на приемной стороне вообще не получится держать контроллер в режиме сна... т.к. он должен постоянно анализировать получаемые данные...

Сложность обмена данными по радиоканалу в том, что надо радиопосылку начинать каким то заранее оговоренным загловком, потом в конце передавать контрольную сумму. Причем приемный контроллер должен уметь выделять из мусора именно этот известный заголовок и уже потом начинать прием всей серии...

Так что не легкая это задача... особенно для первой программы...
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3785
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Полностью согласен с shads, что для первого проекта запрограммировать надежный протокол связи сложновато. Проще применить более продвинутые радиомодули с аппаратной поддержкой пакетов данных, например как здесь:
http://radiokot.ru/circuit/analog/receiv_transmit/33/

Для борьбы с помехами можно применить watchdog, который будет отслеживать прием нужного количества импульсов за определенный промежуток времени, включая их длительности и паузы между ними. 100% -й надежности при этом не получится, т.к. ничто не мешает помехе быть такой-же как и полезный сигнал, но вероятность такой помехи будет практически нулевой. Это особенно верно при небольшом уровне помех. Еще можно поиграть с порогом чувствительности приемника.

А насчет простых модулей с ООК посмотрите записи о моих экспериментах прошлых лет. Обратите внимание на 10-импульсный протокол передачи байта. Из-за малых длительностей импульсов, излучаемых передатчиком, жизнь батарейки существенно продлевается. Хотя, для управления светом (редкие посылки) это и не так важно.
http://mcs.uwsuper.edu/sb/Electronics/RF/
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

Я для радиопередачи использовал частотную модуляцию: пилот-тон, синхросигнал, и нолик и единица разными частотами. Практически как на спектруме при загрузке сделано. Поскольку управлял я гусеничным шасси, то команд 5. Вперёд-назад, лево-право и "огонь". Ну и если какое-то время передатчик ничего не посылает (сбой, например), то чтобы не было рывков последняя команда выполняется ещё какое-то время.

Вот исходники, может, пригодятся:
RF.rar
(38.72 КБ) 237 скачиваний
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Аватара пользователя
Сообщения: 43
Зарегистрирован: Чт фев 28, 2013 00:08:02
Откуда: Украина

Сообщение Vovchik.fva »

нет режим сна на передатчике. приемник постоянно от сети 220в через выпрямитель питается то есть ждет приема.
программы передатчика и приемника моделировал в протеусе все работает должным образом.
радиус действия 10м максимум. по этому ошибка возникнуть не должна а если возникнет то повторно команда посылается через 50мс и на приемной части есть индикатор который покажет режим работы устройства.
интересует именно вопрос. когда передатчик отключен на выходе приемника присутствует изменяющийся сигнал то есть приемник принимает все подряд, а это будет вызывать прерывание постоянно и не даст основной программе выполняться. я не знаю как схемотехнически или программно решить этот вопрос. подскажите если можнте

:roll: :roll: :roll:
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

я не знаю как схемотехнически или программно решить этот вопрос. подскажите если можнте
Как уже говорилось, нужно менять идеологию передачи. Требуется что-то считать за начало передачи данных. Свой вариант я вам предложил. Работает стабильно.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

И вот еще вариант http://asis-kbr.ru/forum/viewtopic.php?f=11&t=122

Правда, алгоритм декодирования может показатся сложноватым.... (о чем я и говорил, что эта тема не для первой поделки).

В данном декодере принцип чуть другой, там нет заголовка по которому определяется начало пакета... вместо этого идет постоянный контроль поступающих импульсов, если импульсы вписываются по параметрам и длительности в определенные рамки, то прием продолжается до накопления необходимого количества битов, после чего ожидается определенная пауза (ввиду того что АРУ приемника еще какое то время работает, шум эфира в теч этого периода не проходят). Если все вышеупомянутые условия исполнены - серия считается принятой.
Прорезались зубы
Аватара пользователя
Сообщения: 210
Зарегистрирован: Ср янв 06, 2010 22:02:25
Откуда: Уфа сити

Сообщение Ромыч »

День добрый! Есть необходимость избавиться от провода путем передачи его сигналов по беспроводу. Бьюсь уже вторую неделю, результат очень не устраивает. В арсенале есть приемник и передатчик 433МГц, есть 2 меги8 (на приемнике и передатчике), есть пакетик из одного байта данных, скорость передачи не знаю - на сбор байта тратится 16мкс (+ n мкс на передачу пакета), но судя по всему не очень большая. И главное - не могу найти нормальный алгоритм передачи/приема этого байта! Уже даже пробовал приспособить алгоритмы передачи CAME и KEELOQ, но они больно медлительны и при уменьшении таймингов прием очень ухудшается. Может есть какие еще решения?



Сюда перенес.
Здесь как раз про алгоритмах идет речь.

aen
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Ссылочку выше вашего поста гляньте, там как раз декодирование посылки радиобрелка идет, останется только передающую часть запрограммировать на аналогичный код.
Открыл глаза
Аватара пользователя
Сообщения: 43
Зарегистрирован: Чт фев 28, 2013 00:08:02
Откуда: Украина

Сообщение Vovchik.fva »

da-nie писал(а):Я для радиопередачи использовал частотную модуляцию: пилот-тон, синхросигнал, и нолик и единица разными частотами. Практически как на спектруме при загрузке сделано. Поскольку управлял я гусеничным шасси, то команд 5. Вперёд-назад, лево-право и "огонь". Ну и если какое-то время передатчик ничего не посылает (сбой, например), то чтобы не было рывков последняя команда выполняется ещё какое-то время.

Вот исходники, может, пригодятся:
RF.rar



пытался разобраться но с ассемблером очень туго начал изучать программирование с СV avr, если не сложно можете объяснить как организовать прием-передачу. Если я правильно понимаю то прием осуществляется через прерывание мк по пину, можете разъяснить как грамотно его организовать чтоб оно не мешало основной программе?
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

пытался разобраться но с ассемблером очень туго
С ассемблером? Нет, исходники на Си. :)
Если я правильно понимаю то прием осуществляется через прерывание мк по пину, можете разъяснить как грамотно его организовать чтоб оно не мешало основной программе?
Нет. Приём осуществляется непрерывным анализом порта, к которому подключён приёмник. А прерывание там используется только для таймера, чтобы отмерять интервалы между сменами уровня.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 43
Зарегистрирован: Чт фев 28, 2013 00:08:02
Откуда: Украина

Сообщение Vovchik.fva »

сори не тот файл открыл.
Открыл глаза
Аватара пользователя
Сообщения: 43
Зарегистрирован: Чт фев 28, 2013 00:08:02
Откуда: Украина

Сообщение Vovchik.fva »

da-nie писал(а):

Приём осуществляется непрерывным анализом порта.

то есть проверили есть ли команда на ножке, затем если приняли посылку обрабатываем основную программу.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

Смысл вот в чём. Измеряется длительность интервала времени между любыми перепадами сигнала. Посылка состоит из пилот-тона, синхросигнала и данных. Каждый из них кодируется разной длительностью сигнала. Так вот, анализируя порт, измеряется интервал смены состояния порта, который затем сравнивается с заданным набором длительностей. Дальше выполняется анализ того, чего ждали и что пришло. Когда весь пакет собран, проверяется контрольная сумма. Совпало - выполняем команду. Команды двухбайтные.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 43
Зарегистрирован: Чт фев 28, 2013 00:08:02
Откуда: Украина

Сообщение Vovchik.fva »

а если мне нужно паралельнно опрашивать ацп то структуру программы писать:
анализ команды -если принята то ее обработка затем опрос ацп; а в случае если не принята то сразу опрос ацп и все вцикле?

:write: :write:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

Опрос нужно делать в функции GetSignalLength_Single внутри while(1). Главное, чтобы не занять им слишком большое время. Впрочем, можно и вначале этой функции делать опрос. Но тогда между опросами будет проходить несколько миллисекунд. А можно опрос АЦП на отдельное прерывание поставить.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 43
Зарегистрирован: Чт фев 28, 2013 00:08:02
Откуда: Украина

Сообщение Vovchik.fva »

da-nie писал(а): А можно опрос АЦП на отдельное прерывание поставить.

то есть ацп измеряет не зависимо от выполнения основной программы, и обрабатывает данные после возникновения прерывания (окончание цикла измерения ацп) далее снова выполняется основная программа, а ацп в этот момент измеряет. (ацп и основная программа работают параллельно и не зависимо друг от друга, а в момент прерывания основная программа останавливается и обрабатывает данные из ацп. а затем выполняется основная программа).
Последний раз редактировалось Vovchik.fva Вс авг 18, 2013 21:05:10, всего редактировалось 2 раза.
Открыл глаза
Аватара пользователя
Сообщения: 43
Зарегистрирован: Чт фев 28, 2013 00:08:02
Откуда: Украина

Сообщение Vovchik.fva »

и если так это работает не подскажете с кодом как настроить ацп?
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

Да, если у вас будет режим непрерывного преобразования. Честно говоря, если память мне не изменяет, я никогда не использовал АЦП с прерыванием. В книжке "Микроконтроллеры Tiny и Mega фирмы ATMEL" Евстифеев А.В. описано, как настраивать АЦП, попробуйте. Должно получиться.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 43
Зарегистрирован: Чт фев 28, 2013 00:08:02
Откуда: Украина

Сообщение Vovchik.fva »

спасибо буду разбераться :write:
Ответить

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