управление нагрузкой (RF модули)
Добавлено: Чт авг 08, 2013 21:12:34
Здравствуйте не подскажете по поводу 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 мигает
};
};
}

КОД ПРОГРАММЫ
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 мигает
};
};
}