/***************************************************** This program was produced by the CodeWizardAVR V1.25.7 beta 5 Professional Automatic Program Generator © Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 18.06.2010 Author : }{вост {лона Company : zoo Comments: Работает на трех каналах одновременно 1) Как обычный индикатор, только без несущей и с индикацией каждой минуты 2) Тональные посылки с увеличивающейся мощностью. 3) Цифровые посылки Chip type : ATmega8 Clock frequency : 8,00000 MHz Memory model : Tiny External SRAM size : 0 Data Stack size : 16 *****************************************************/ #include #include #include #define u8 unsigned char #define u16 unsigned int #define s16 signed int #define NSEL PORTB.2 #define SHUTDOWN PORTB.1 #define IRQ PIND.7 /////////// Добавил ST - начало #define PUSK PIND.3 //Датчик старта #define LED PORTD.4 //Светодиод /////////// Добавил ST - конец #define SN 1 #define CH_BATT 433.550 #define CH_FIND 434.550 #define CH_DIGI 866.700 #define spi8x spi bit time=0; char tx_buf[64]; unsigned int u_battery = 512; flash char RfSettingsA []={0x3B, 0x34, 0x02, 0x75, 0x25, 0x05, 0xEA, 0x4E, 0xA5, 0x28, 0x06, 0x00, 0x80}; //DR: 4.8kbps, DEV: +-4kHz, BBBW: 25.3kHz // Timer 1 overflow interrupt service routine interrupt [TIM1_OVF] void timer1_ovf_isr(void) { static u16 tmp; // каждые 65 535 микросекунд // 1 секунда = 1 000 000 / 65535 = 15.26 // 1 минута = 15.26*60=915 tmp++; if (tmp== 915 ) { tmp=0; time=1; } } #define ADC_VREF_TYPE 0x40 // Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } /* // программный ЭСПИАЙ void spi8x (char a) {char n; for (n=0;n<8;n++) { delay_us(2); if (a & 0x80) MOSI=1; else MOSI=0; a<<=1; delay_us(2); SCK=1; delay_us(2); SCK=0; delay_us(2); } } */ // char RFXX_WRT_CMD(unsigned int aCmd) { char spi_data; NSEL=0; spi_data=(char) (aCmd>>8); spi_data=spi_data | 0x80; spi8x( spi_data ); spi8x((char)(aCmd & 0x00FF)); NSEL=1; return 1; } char RFXX_READ_CMD(unsigned int aCmd) { char spi_data; NSEL=0; spi( (char) (aCmd>>8) ); spi_data=spi((char)(aCmd & 0x00FF)); NSEL=1; return spi_data; } void set_power ( char power) { // ONLY RFM 42 !!!!!!!!!!!!!!! if (power>3)power=3; RFXX_WRT_CMD(0x6D00+(int)power); } /* void beep (char tone, char len) { char a; RFXX_WRT_CMD(0x0701); // выключить передатчик RFXX_WRT_CMD(0x6e00+(int)tone); // + tx data rate 0x2752*1000/2097152=4.8 kbit RFXX_WRT_CMD(0x6fff); // + tx data rate RFXX_WRT_CMD(0x3e00); // paket lendht 0 byte RFXX_WRT_CMD(0x3080); //data acess control No CRC No TX handling RFXX_WRT_CMD(0x3308); // header control No header, fix pkt len RFXX_WRT_CMD(0x7206); // deviation 6*625=3750 hz RFXX_WRT_CMD(0x3400+(int)len); //preamble lenght *4 period RFXX_WRT_CMD(0x0701); for (a=0;a<3;a++) {RFXX_WRT_CMD(0x7FAA);} RFXX_WRT_CMD(0x0709); // начать передачу режим TX // watch=1; // для контроля за зависанием // while (IRQ){} //ждем окончания передачи // RFXX_WRT_CMD(0x0701); // выключить передатчик } */ void beep (char tone, int len) { int a; RFXX_WRT_CMD(0x0701); // выключить передатчик RFXX_WRT_CMD(0x7122); // modulation mode control !!!!!!22!!!!!!!! RFXX_READ_CMD(0x0300); // сбросить прерывания RFXX_READ_CMD(0x0400); RFXX_WRT_CMD(0x6e00+(int)tone); // tx data rate - частота тона 0x2752*1000/2097152=4.8 kbit //RFXX_WRT_CMD(0x6e0A); // tx data rate - частота тона 0x2752*1000/2097152=4.8 kbit RFXX_WRT_CMD(0x6fff); // + tx data rate RFXX_WRT_CMD(0x3e01); // paket lendht 0 byte //RFXX_WRT_CMD(0x3080); //data acess control No CRC No TX handling //RFXX_WRT_CMD(0x3308); // header control No header, fix pkt len RFXX_WRT_CMD(0x308C); //data acess control No CRC No TX handling RFXX_WRT_CMD(0x3318); // header control No header, fix pkt len RFXX_WRT_CMD(0x7203); // deviation 6*625=3750 hz //RFXX_WRT_CMD(0x3400+(int)len); //preamble lenght *4 period RFXX_WRT_CMD(0x3400+(unsigned int)len); //preamble lenght *4 period RFXX_WRT_CMD(0x0803); // clear fifo rx + tx RFXX_WRT_CMD(0x0800); // RFXX_WRT_CMD(0x0504); // irq - after send packet for (a=0;a<3;a++) {RFXX_WRT_CMD(0x7FAA);} RFXX_WRT_CMD(0x0709); // начать передачу режим TX // watch=1; // для контроля за зависанием while (IRQ){} //ждем окончания передачи //for (a=0; a>8); tx_buf[6]=(char)u_battery; // f_hi=(unsigned int)baroalt; // tx_buf[7]=(char)(f_hi>>8); // tx_buf[8]=(char)f_hi; RFXX_WRT_CMD(0x0701); // выключить передатчик RFXX_READ_CMD(0x0300); RFXX_READ_CMD(0x0400); RFXX_WRT_CMD(0x3e08); // paket lendht 8 byte RFXX_WRT_CMD(0x308F); //data acess control ПРОВЕРИТЬ old 8c (hand enable RX+TX crc OFF) RFXX_WRT_CMD(0x3310); // header control (18) ПРОВЕРИТЬ old 42 1 byte header 1 byte sync fix pkt lenght RFXX_WRT_CMD(0x6e00+RfSettingsA[7]); // + tx data rate 0x2752*1000/2097152=4.8 kbit RFXX_WRT_CMD(0x6f00+RfSettingsA[8]); // + tx data rate RFXX_WRT_CMD(0x7000+RfSettingsA[9]); // + modulation mode control RFXX_WRT_CMD(0x7122); // modulation mode control !!!!!!22!!!!!!!! RFXX_WRT_CMD(0x7200+RfSettingsA[0x0A]); // deviation 48 - 40khz 0x48*625=45000 hz 8*625=5000 hz RFXX_WRT_CMD(0x3464); //preamble lenght *4 period = 8 байт RFXX_WRT_CMD(0x3e00+50); // set paket lendht RFXX_WRT_CMD(0x0803); // clear fifo rx + tx RFXX_WRT_CMD(0x0800); // crc=0; for (f = 0; f<50; f++){RFXX_WRT_CMD(0x7f00+tx_buf[f]); crc=crc^tx_buf[f];} // забить в модуль собраный пакет RFXX_WRT_CMD(0x7f00+crc); // TEST RFXX_WRT_CMD(0x0504); // irq - after send packet RFXX_WRT_CMD(0x0709); // начать передачу режим TX // watch=1; // для контроля за зависанием while (IRQ){} //ждем окончания передачи RFXX_WRT_CMD(0x0701); // выключить передатчик } // ------------------------------------------------------------------------------ // ????????? ??????? ? ???? 433.920, ????????????? ??????? ? ????????, ???????? void set_full_freq(float freq) { u8 reg75,reg76, reg77,reg75out; u16 tmp; if (freq <480) {reg75=(freq/10)-24; reg75out=reg75; } else {reg75=(freq/20)-24; reg75out=reg75 | 0x20;} if ( freq < 480 ) tmp=(u16)(((freq/10)-reg75-24)*64000); else tmp=(u16)(((freq/20)-reg75-24)*64000); reg76= (u8)(tmp>>8); reg77= (u8)(tmp & 0x00FF); RFXX_WRT_CMD(0x7500+reg75out); RFXX_WRT_CMD(0x7600+reg76); // carrier freq 310 + (0x6400/64000) =314.000 mhz RFXX_WRT_CMD(0x7700+reg77); // carrier freq ((a*256)+b)/64000=0,4 } //-------------------------------------------------------------------------------- // ????????? ????? ? ???????? ???????? (??? ?? ??????) ?? ?????? (???? 43 ??? -18) ???????? void set_offset_freq (s16 offset) { if (offset != 0) offset=(offset*32)/10; if (offset > 512) offset= 512; // 512*0.3125 khz = 160 khz if (offset < -512) offset=-512; RFXX_WRT_CMD(0x7400+((offset >> 8)& 0x00FF) ); // freq offset RFXX_WRT_CMD(0x7300+( offset & 0x00FF) ); // freq offset //RFXX_READ_CMD(0x7300); // freq offset //RFXX_READ_CMD(0x7400); // freq offset } //---------------------------------------------------------------------------------- void main(void) { // Declare your local variables here char set, i,u,n_lipo; unsigned int batt; // Input/Output Ports initialization // Port B initialization // Func7=In Func6=In Func5=Out Func4=In Func3=Out Func2=Out Func1=In Func0=In // State7=T State6=T State5=0 State4=T State3=0 State2=0 State1=T State0=T PORTB=0x00; DDRB=0x2C; // Port C initialization // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00; // Port D initialization ТУТ тоже изменения!!! // Func7=In Func6=In Func5=In Func4=Out Func3=In Func2=In Func1=In Func0=In // State7=P State6=T State5=T State4=0 State3=P State2=T State1=T State0=T PORTD=0x88; DDRD=0x10; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped TCCR0=0x00; TCNT0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 1000,000 kHz // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: On // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x02; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off MCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x04; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // ADC initialization // ADC Clock frequency: 250,000 kHz // ADC Voltage Reference: AREF pin ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x85; // SPI initialization // SPI Type: Master // SPI Clock Rate: 2000,000 kHz // SPI Clock Phase: Cycle Half // SPI Clock Polarity: Low // SPI Data Order: MSB First SPCR=0x50; SPSR=0x00; // Global enable interrupts #asm("sei") /////////// Добавил ST - начало if(PUSK!) // Проверим, для начала, работает ли прошивка и состояние датчика { LED=1; delay_ms(300); LED=0; LED=1; delay_ms(300); LED=0; LED=1; delay_ms(300); LED=0; } /////////// Добавил ST - конец NSEL=1; SHUTDOWN=1; delay_ms(500); SHUTDOWN=0; delay_ms(200); ///Далее проверим, проходят ли настройки Добавил ST RFXX_WRT_CMD(0x0600); // disable 2-nd interrupt RFXX_WRT_CMD(0x0701); // set ready mode RFXX_WRT_CMD(0x0900+116); // capacitor zq RFXX_WRT_CMD(0x0a05); // clock for cpu RFXX_WRT_CMD(0x0bf4); // rxdata on gpio0 RFXX_WRT_CMD(0x0cef); // gpio RFXX_WRT_CMD(0x0d00); // gpio RFXX_WRT_CMD(0x0e00); // io RFXX_WRT_CMD(0x0f70); //adc RFXX_WRT_CMD(0x1000); // adc RFXX_WRT_CMD(0x1200); // temp RFXX_WRT_CMD(0x1300); // temp // handler RFXX_WRT_CMD(0x308C); //data acess control old 8c (hand enable RX+TX crc OFF) RFXX_WRT_CMD(0x3318); // header control (18) old 42 1 byte header 1 byte sync fix pkt lenght RFXX_WRT_CMD(0x34ff); //preamble lenght old 40 теперь 20 бит RFXX_WRT_CMD(0x3520); //preamble detection control RFXX_WRT_CMD(0x362d); //sync word RFXX_WRT_CMD(0x37d4); //sync word !! 37-й регистр это будет серийник передатчика RFXX_WRT_CMD(0x3800); //sync word RFXX_WRT_CMD(0x3900); //sync word RFXX_WRT_CMD(0x3a31); //header RFXX_WRT_CMD(0x3b32); //header RFXX_WRT_CMD(0x3c33); //header RFXX_WRT_CMD(0x3d34); //header RFXX_WRT_CMD(0x3e02); // paket lendht 12 byte RFXX_WRT_CMD(0x6a0b); //agc override RFXX_WRT_CMD(0x6d07); // tx power - 03 - full RFXX_WRT_CMD(0x6e00+RfSettingsA[7]); // + tx data rate 0x2752*1000/2097152=4.8 kbit RFXX_WRT_CMD(0x6f00+RfSettingsA[8]); // + tx data rate //RFXX_WRT_CMD(0x6e05); // + tx data rate 0x2752*1000/2097152=4.8 kbit //RFXX_WRT_CMD(0x6fff); // + tx data rate RFXX_WRT_CMD(0x7000+RfSettingsA[9]); // + modulation mode control RFXX_WRT_CMD(0x7122); // modulation mode control !!!!!!22!!!!!!!! RFXX_WRT_CMD(0x7200+RfSettingsA[0x0A]); // deviation 48 - 40khz 0x48*625=45000 hz 8*625=5000 hz RFXX_WRT_CMD(0x7553); // band select 73 for 868 mhz RFXX_WRT_CMD(0x7900); //+ hopping channel RFXX_WRT_CMD(0x7a00); //+ hopping step 10 khz delay_ms(1000); //=========================================================================================================================== //=================================================================================================================== // установка режимов передачи //RFXX_WRT_CMD(0x7100); // modulation mode control 20 -unmod 21 -ook 22 - fifo 23 -pn9 00 - mod via GPIO pin, unmod carrier RFXX_WRT_CMD(0x7122); // 22 - fifo RFXX_WRT_CMD(0x308C); //data acess control old 8c (hand enable RX+TX crc OFF) //RFXX_WRT_CMD(0x3211); // header control check 0 byte 0 byte RFXX_WRT_CMD(0x3318); // header control (18) old 42 1 byte header 1 byte sync fix pkt lenght RFXX_WRT_CMD(0x34ff); //preamble lenght old 40 теперь 20 бит RFXX_WRT_CMD(0x3520); //preamble detection control RFXX_WRT_CMD(0x362d); //sync word RFXX_WRT_CMD(0x37d4); //sync word !! RFXX_WRT_CMD(0x3800); //sync word RFXX_WRT_CMD(0x3900); //sync word RFXX_WRT_CMD(0x3a31); //header RFXX_WRT_CMD(0x3b32); //header RFXX_WRT_CMD(0x3c33); //header RFXX_WRT_CMD(0x3d34); //header RFXX_WRT_CMD(0x3e02); // paket lendht 12 byte RFXX_WRT_CMD(0x0701); set_full_freq (CH_DIGI); RFXX_WRT_CMD(0x0702); RFXX_WRT_CMD(0x7100); // modulation mode control 20 -unmod 21 -ook 22 - fifo 23 -pn9 00 - mod via GPIO pin, unmod carrier RFXX_WRT_CMD(0x0709); delay_ms(5000); RFXX_WRT_CMD(0x0701); set_full_freq (CH_BATT); RFXX_WRT_CMD(0x0702); RFXX_WRT_CMD(0x7100); // modulation mode control 20 -unmod 21 -ook 22 - fifo 23 -pn9 00 - mod via GPIO pin, unmod carrier RFXX_WRT_CMD(0x0709); delay_ms(5000); RFXX_WRT_CMD(0x0701); /// Тут закончилась инициализация RFM22, если светодиод горит - то хорошо - Добавил ST LED=1; u_battery=(unsigned int)(((float)read_adc(7))*0.818); batt=(unsigned int)(((float)read_adc(7))*2.985); // ???????????, ?????????? ? ????????? ???? ??????? if (batt > (420*5) ) n_lipo=6; // 6 ???? else if (batt > (420*4) ) n_lipo=5; // 5 ???? else if (batt > (420*3) ) n_lipo=4; // 4 ???? else if (batt > (420*2) ) n_lipo=3; // 3 ???? else if (batt > (320*2) ) n_lipo=2; // 2 ???? else if (batt > (420*1) ) n_lipo=0; // 5 ????? ???? else n_lipo=1; // 1 ???? ??? 3 ?????? set_full_freq (CH_BATT); set_power (3); if (n_lipo) { for (i=0;i