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

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

Добавлено: Чт авг 08, 2013 21:12:34
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:

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

Добавлено: Пт авг 09, 2013 11:35:30
shads
Думаю, на приемной стороне вообще не получится держать контроллер в режиме сна... т.к. он должен постоянно анализировать получаемые данные...

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

Так что не легкая это задача... особенно для первой программы...

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

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

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

А насчет простых модулей с ООК посмотрите записи о моих экспериментах прошлых лет. Обратите внимание на 10-импульсный протокол передачи байта. Из-за малых длительностей импульсов, излучаемых передатчиком, жизнь батарейки существенно продлевается. Хотя, для управления светом (редкие посылки) это и не так важно.
http://mcs.uwsuper.edu/sb/Electronics/RF/

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

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

Вот исходники, может, пригодятся:
RF.rar
(38.72 КБ) 237 скачиваний

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

Добавлено: Пт авг 09, 2013 18:11:15
Vovchik.fva
нет режим сна на передатчике. приемник постоянно от сети 220в через выпрямитель питается то есть ждет приема.
программы передатчика и приемника моделировал в протеусе все работает должным образом.
радиус действия 10м максимум. по этому ошибка возникнуть не должна а если возникнет то повторно команда посылается через 50мс и на приемной части есть индикатор который покажет режим работы устройства.
интересует именно вопрос. когда передатчик отключен на выходе приемника присутствует изменяющийся сигнал то есть приемник принимает все подряд, а это будет вызывать прерывание постоянно и не даст основной программе выполняться. я не знаю как схемотехнически или программно решить этот вопрос. подскажите если можнте

:roll: :roll: :roll:

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

Добавлено: Пт авг 09, 2013 18:34:15
da-nie
я не знаю как схемотехнически или программно решить этот вопрос. подскажите если можнте
Как уже говорилось, нужно менять идеологию передачи. Требуется что-то считать за начало передачи данных. Свой вариант я вам предложил. Работает стабильно.

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

Добавлено: Пт авг 09, 2013 20:41:22
shads
И вот еще вариант http://asis-kbr.ru/forum/viewtopic.php?f=11&t=122

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

В данном декодере принцип чуть другой, там нет заголовка по которому определяется начало пакета... вместо этого идет постоянный контроль поступающих импульсов, если импульсы вписываются по параметрам и длительности в определенные рамки, то прием продолжается до накопления необходимого количества битов, после чего ожидается определенная пауза (ввиду того что АРУ приемника еще какое то время работает, шум эфира в теч этого периода не проходят). Если все вышеупомянутые условия исполнены - серия считается принятой.

Ищу алгоритм передачи данных по каналу АМ 433.92МГц

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



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

aen

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

Добавлено: Вт авг 13, 2013 19:24:07
shads
Ссылочку выше вашего поста гляньте, там как раз декодирование посылки радиобрелка идет, останется только передающую часть запрограммировать на аналогичный код.

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

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

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



пытался разобраться но с ассемблером очень туго начал изучать программирование с СV avr, если не сложно можете объяснить как организовать прием-передачу. Если я правильно понимаю то прием осуществляется через прерывание мк по пину, можете разъяснить как грамотно его организовать чтоб оно не мешало основной программе?

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

Добавлено: Ср авг 14, 2013 20:24:40
da-nie
пытался разобраться но с ассемблером очень туго
С ассемблером? Нет, исходники на Си. :)
Если я правильно понимаю то прием осуществляется через прерывание мк по пину, можете разъяснить как грамотно его организовать чтоб оно не мешало основной программе?
Нет. Приём осуществляется непрерывным анализом порта, к которому подключён приёмник. А прерывание там используется только для таймера, чтобы отмерять интервалы между сменами уровня.

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

Добавлено: Ср авг 14, 2013 20:59:45
Vovchik.fva
сори не тот файл открыл.

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

Добавлено: Ср авг 14, 2013 21:16:23
Vovchik.fva
da-nie писал(а):

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

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

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

Добавлено: Чт авг 15, 2013 05:22:43
da-nie
Смысл вот в чём. Измеряется длительность интервала времени между любыми перепадами сигнала. Посылка состоит из пилот-тона, синхросигнала и данных. Каждый из них кодируется разной длительностью сигнала. Так вот, анализируя порт, измеряется интервал смены состояния порта, который затем сравнивается с заданным набором длительностей. Дальше выполняется анализ того, чего ждали и что пришло. Когда весь пакет собран, проверяется контрольная сумма. Совпало - выполняем команду. Команды двухбайтные.

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

Добавлено: Чт авг 15, 2013 21:24:37
Vovchik.fva
а если мне нужно паралельнно опрашивать ацп то структуру программы писать:
анализ команды -если принята то ее обработка затем опрос ацп; а в случае если не принята то сразу опрос ацп и все вцикле?

:write: :write:

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

Добавлено: Пт авг 16, 2013 05:12:54
da-nie
Опрос нужно делать в функции GetSignalLength_Single внутри while(1). Главное, чтобы не занять им слишком большое время. Впрочем, можно и вначале этой функции делать опрос. Но тогда между опросами будет проходить несколько миллисекунд. А можно опрос АЦП на отдельное прерывание поставить.

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

Добавлено: Вс авг 18, 2013 20:51:15
Vovchik.fva
da-nie писал(а): А можно опрос АЦП на отдельное прерывание поставить.

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

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

Добавлено: Вс авг 18, 2013 21:02:13
Vovchik.fva
и если так это работает не подскажете с кодом как настроить ацп?

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

Добавлено: Пн авг 19, 2013 17:54:29
da-nie
Да, если у вас будет режим непрерывного преобразования. Честно говоря, если память мне не изменяет, я никогда не использовал АЦП с прерыванием. В книжке "Микроконтроллеры Tiny и Mega фирмы ATMEL" Евстифеев А.В. описано, как настраивать АЦП, попробуйте. Должно получиться.

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

Добавлено: Пн авг 19, 2013 18:20:15
Vovchik.fva
спасибо буду разбераться :write: