;/***************************************************** ;сейчас GPS, скорость в ;ток GPS+RFM12=67mA ;ток GPS+RFM12+VT1rf=90mA ;RFM12B максимальный размер данных кадра 128 bytes max message length ;===================================================== ;This program was produced by the ;CodeWizardAVR V2.05.3 Standard & CodeWizardAVR 3.12 Advanced ; ;Project : Tiny2313 ;Version : 1.0 ;Date : 22.04.2014 ;Date : 31.12.2014 ;Author : MartKot ;Company : Tornado ;Comments: ;GPS-Tiny2313-RFM12B ;SPI Register&Counter=USICLK ;USI Counter Overflow Interrupt-NO ;Universal Serial Interface initialization ;Mode: Three Wire (SPI), программное тактирование ;// Clock source: Register & Counter=USICLK / NO ;// USI Counter Overflow Interrupt: Off ;//f=490кГц, 2,04мкс, 30такт ;//f=1,05МГц, 880Kbit/sec ;f=7,1МГц 7,142Мбит/сек; 8бит скорость 2,31Мбит/сек; 16бит-скорость 1,918Мбит/сек ;======================================= ;// USART initialization ;// Communication Parameters: 8 Data, 1 Stop, No Parity ;// USART Receiver: On ;// USART Transmitter: On ;// USART Mode: Asynchronous ;// USART Baud Rate: Kbit/sec ; ;Chip type : ATtiny2313A ;AVR Core Clock frequency: 14,745600 MHz ;Memory model : Tiny ;External RAM size : 0 ;Data Stack size : 32 ;Flash(Кбайт) : 2 ;SRAM(Байт) : 128 ;EEPROM(Байт) : 128 ; ;27.09.2014 ;03.02.2015 ;EEPROM usage: 0 byte(s), 0,0% of EEPROM ;Program size: 819 words (1638 bytes), 80,0% of FLASH ;90 words (180 bytes), 9,9% reduced by Code Compression ;*****************************************************/ ; ;#include ;PCODE: $00000000 VOL: 0 #ifndef __SLEEP_DEFINED__ ;PCODE: $00000001 VOL: 0 #define __SLEEP_DEFINED__ ;PCODE: $00000002 VOL: 0 .EQU __se_bit=0x20 ;PCODE: $00000003 VOL: 0 .EQU __sm_mask=0x50 ;PCODE: $00000004 VOL: 0 .EQU __sm_powerdown=0x10 ;PCODE: $00000005 VOL: 0 .EQU __sm_standby=0x40 ;PCODE: $00000006 VOL: 0 .SET power_ctrl_reg=mcucr ;PCODE: $00000007 VOL: 0 #endif ;PCODE: $00000008 VOL: 0 ;PCODE: $00000009 VOL: 0 ;#include ;#include ;#include ; ;//==== tiny2313 INTERFACE ====// ;//#define NIRQ 2 // PORTD.2 прерывание от rfm12b ;//#define SCK PORTB.7 // SPI clock ;//#define SDI PORTB.6 // SPI RFM12B data input ;//#define SDO PORTB.5 // SPI RFM12B data output ;//#define nSEL PORTB.4 // SPI nSEL (chip select) ;//#define NIRQ PORTD.2 //прерывание от rfm12b - low ; ;#define DCLK PINB.1 //вход прерывания от FIFO, если заполнен до указанного порога ;#define FSK PORTB.2 //выход, FIFO select 0-при включении внутреннего приемного регистра ;#define nINT PINB.3 //вход детектора действительных данных ;#define nSEL 4 // PORTB.4 SPI nSEL (chip select) ;//#define SDI PINB.5 // PORTB.5 SPI DI input (SPI RFM12B data output) ;#define SDO PORTB.6 // PORTB.6 SPI DO otput (SPI RFM12B data input) ;#define nIRQ_LOW PIND.2 //прерывание от nIRQ, ждём low флага окончания передачи ; /* IO CONTROL */ ;#define HI(x) PORTB |= (1<<(x)) //установить бит (х) в "1" ;#define LO(x) PORTB &= ~(1<<(x)) //сбросить бит (х) в "0" ;//===========================// ; ;//(14,745600 MHz) ;//#define BAUDRATE UBRRL=0x5F; //для Baud Rate: 9600bps ;#define BAUDRATE UBRRL=0x3F; //USART Baud Rate: 14400bps ;//#define BAUDRATE UBRRL=0x2F; //47 для Baud Rate: 19200bps ;//#define BAUDRATE UBRRL=0x17; //23 для Baud Rate: 38400bps ;//#define BAUDRATE UBRRL=0x0F; //USART Baud Rate: 57600bps ;//#define BAUDRATE UBRRL=0x07; // 7 Baud Rate: 115200bps ;//======!!! После инициализации GPS Baud Rate: 14400bps !!! ; ;//#define nIRQ_LOW PIND.2 //ждём PIND.2=0 флага окончания передачи ;//#define nIRQ_LOW() while(PIND&(1<> 8; //1.0sec, 0.25sec ;PCODE: $00000017 VOL: 0 ;PCODE: $00000018 VOL: 0 ; 0000 00FF TCNT1L=0x1F00 & 0xff;//1.0sec, 0.25sec ;PCODE: $00000019 VOL: 0 ;PCODE: $0000001A VOL: 0 ; 0000 0100 //============================= ; 0000 0101 //TCNT1H=0x3580 >> 8; //0.9sec ; 0000 0102 //TCNT1L=0x3580 & 0xff; ; 0000 0103 //============================= ; 0000 0104 //TCNT1H=0xA600 >> 8; //0.1sec ; 0000 0105 //TCNT1L=0xA600 & 0xff;//0.1sec ; 0000 0106 //============================= ; 0000 0107 //секундный таймер ; 0000 0108 flag_1s ^=1; //переодическое переключение 1сек ;PCODE: $0000001B VOL: 0 ;PCODE: $0000001C VOL: 0 ;PCODE: $0000001D VOL: 0 ;PCODE: $0000001E VOL: 0 ;PCODE: $0000001F VOL: 0 ;PCODE: $00000020 VOL: 0 ;PCODE: $00000021 VOL: 0 ;PCODE: $00000022 VOL: 0 ;PCODE: $00000023 VOL: 0 ;PCODE: $00000024 VOL: 0 ;PCODE: $00000025 VOL: 0 ;PCODE: $00000026 VOL: 0 ; 0000 0109 if (flag_rfSend_K) { //если данные кнопки отосланы, защита от повторов ;PCODE: $00000027 VOL: 0 ;PCODE: $00000028 VOL: 0 ;PCODE: $00000029 VOL: 0 ; 0000 010A //тогда разрешаем int1 flag_KN1 && ; 0000 010B flag_rfSend_K=0; ;PCODE: $0000002A VOL: 0 ;PCODE: $0000002B VOL: 0 ; 0000 010C GIMSK=0x80; //разрешить прерывания int1, разрешение работы кнопки К1 ;PCODE: $0000002C VOL: 0 ;PCODE: $0000002D VOL: 0 ; 0000 010D }; ;PCODE: $0000002E VOL: 0 ; 0000 010E ; 0000 010F PORTB.0=0; //выкл.выход B.0 через 1сек ;PCODE: $0000002F VOL: 0 ;PCODE: $00000030 VOL: 0 ; 0000 0110 //PORTD.4=0; //выкл. через 1сек ; 0000 0111 ; 0000 0112 if (PIND.4==1) { //если включен выход D.4 ;PCODE: $00000031 VOL: 0 ;PCODE: $00000032 VOL: 0 ;PCODE: $00000033 VOL: 0 ; 0000 0113 TickTimer1s++; ;PCODE: $00000034 VOL: 0 ; 0000 0114 if (TickTimer1s == 5){ ;PCODE: $00000035 VOL: 0 ;PCODE: $00000036 VOL: 0 ;PCODE: $00000037 VOL: 0 ; 0000 0115 PORTD.4=0; //выкл.выход D.4 через 5сек, независимо от перемычки ;PCODE: $00000038 VOL: 0 ;PCODE: $00000039 VOL: 0 ; 0000 0116 TickTimer1s = 0; //обнуляем через 5сек ;PCODE: $0000003A VOL: 0 ; 0000 0117 }; ;PCODE: $0000003B VOL: 0 ; 0000 0118 }; ;PCODE: $0000003C VOL: 0 ; 0000 0119 ; 0000 011A //PORTD.4^=1; //для теста, пикаем с периодом 1сек ; 0000 011B if (PIND.5==1) //перемычка "Контакт Подъёма", можно GPS вкл. в режим постоянной передачи. ;PCODE: $0000003D VOL: 0 ;PCODE: $0000003E VOL: 0 ;PCODE: $0000003F VOL: 0 ; 0000 011C { ; 0000 011D PORTD.4=0; //выкл.выход D.4 зв. излучатель, воспламенитель. ;PCODE: $00000040 VOL: 0 ;PCODE: $00000041 VOL: 0 ; 0000 011E TickTimer5s++; ;PCODE: $00000042 VOL: 0 ; 0000 011F if (TickTimer5s == 5) { //период 5сек ;PCODE: $00000043 VOL: 0 ;PCODE: $00000044 VOL: 0 ;PCODE: $00000045 VOL: 0 ; 0000 0120 //flag5s_Timer^= 1; //переодическое переключение ; 0000 0121 flag_5s ^= 1; //флаг таймера 5сек ;PCODE: $00000046 VOL: 0 ;PCODE: $00000047 VOL: 0 ;PCODE: $00000048 VOL: 0 ;PCODE: $00000049 VOL: 0 ;PCODE: $0000004A VOL: 0 ;PCODE: $0000004B VOL: 0 ;PCODE: $0000004C VOL: 0 ;PCODE: $0000004D VOL: 0 ;PCODE: $0000004E VOL: 0 ;PCODE: $0000004F VOL: 0 ;PCODE: $00000050 VOL: 0 ;PCODE: $00000051 VOL: 0 ; 0000 0122 //PORTD.4=0; //выкл.выход D.4 на зв. излучатель и воспламенитель ; 0000 0123 //PORTD.4^=1; //пикаем с периодом 5сек ; 0000 0124 //PORTB.0=0; //выкл.выход B.0 при размыкании перемычки, через 5сек ; 0000 0125 TickTimer5s = 0; //обнуляем через 5сек ;PCODE: $00000052 VOL: 0 ; 0000 0126 if (TickTimer_delay<=T_delay) { //формирование задержки 120=10минут ;PCODE: $00000053 VOL: 0 ;PCODE: $00000054 VOL: 0 ;PCODE: $00000055 VOL: 0 ; 0000 0127 if (TickTimer_delay == T_delay) //максимальная задержка 254=21минут ;PCODE: $00000056 VOL: 0 ;PCODE: $00000057 VOL: 0 ;PCODE: $00000058 VOL: 0 ; 0000 0128 flag_delay=1; ;PCODE: $00000059 VOL: 0 ;PCODE: $0000005A VOL: 0 ; 0000 0129 TickTimer_delay++; //если TickTimer_delay=121 (T_delay=120), сюда больше не заходим ;PCODE: $0000005B VOL: 0 ;PCODE: $0000005C VOL: 0 ; 0000 012A }; ;PCODE: $0000005D VOL: 0 ; 0000 012B }; ;PCODE: $0000005E VOL: 0 ; 0000 012C }; ;PCODE: $0000005F VOL: 0 ; 0000 012D ; 0000 012E //формирование 8-10сек пауз TX //в одной пачке от 3 до 7 пакетов ; 0000 012F if (flag_delay && flag_TickCounter_rfTX) {//если задержка кончилась и передано 5 пачек, формируем паузы ;PCODE: $00000060 VOL: 0 ;PCODE: $00000061 VOL: 0 ;PCODE: $00000062 VOL: 0 ;PCODE: $00000063 VOL: 0 ;PCODE: $00000064 VOL: 0 ;PCODE: $00000065 VOL: 0 ;PCODE: $00000066 VOL: 0 ;PCODE: $00000067 VOL: 0 ;PCODE: $00000068 VOL: 0 ;PCODE: $00000069 VOL: 0 ; 0000 0130 TickTimer10s++; ;PCODE: $0000006A VOL: 0 ; 0000 0131 if (TickTimer10s==8) { //5=10+2(период 12сек); 4=8+2(период 10сек); 3=6+2(период 8сек) ;PCODE: $0000006B VOL: 0 ;PCODE: $0000006C VOL: 0 ;PCODE: $0000006D VOL: 0 ; 0000 0132 flag_TickCounter_rfTX=0; ;PCODE: $0000006E VOL: 0 ;PCODE: $0000006F VOL: 0 ; 0000 0133 TickCounter_rfTX = 0; //обнуляем счётчик ;PCODE: $00000070 VOL: 0 ; 0000 0134 TickTimer10s = 0; //обнуляем через 10сек ;PCODE: $00000071 VOL: 0 ; 0000 0135 ; 0000 0136 }; ;PCODE: $00000072 VOL: 0 ; 0000 0137 }; ;PCODE: $00000073 VOL: 0 ; 0000 0138 } ;PCODE: $00000074 VOL: 0 ;PCODE: $00000075 VOL: 0 ;PCODE: $00000076 VOL: 0 ; ;//==== External Interrupt 0 ==== программа обрабобтки прерывания ;/* ;interrupt [EXT_INT0] void ext_int0_isr(void) //сейчас выключено в init_ATtiny ;{ ;// Place your code here ; ;} ;*/ ; ;// External Interrupt 1 service routine ;interrupt [EXT_INT1] void ext_int1_isr(void) ; 0000 0145 { ;PCODE: $00000077 VOL: 0 ;PCODE: $00000078 VOL: 0 ; 0000 0146 // код кнопки 1 ; 0000 0147 //rfSend_K(1); //посылаем по RF код кнопки 1 ; 0000 0148 flag_KN1=1; //флаг срабатывания кнопки 1 ;PCODE: $00000079 VOL: 0 ;PCODE: $0000007A VOL: 0 ; 0000 0149 GIMSK=0x00; //запретить прерывания int1 ;PCODE: $0000007B VOL: 0 ;PCODE: $0000007C VOL: 0 ; 0000 014A //GIFR=0x00; //для запрета передачи данных кнопки1 ; 0000 014B } ;PCODE: $0000007D VOL: 0 ;PCODE: $0000007E VOL: 0 ;PCODE: $0000007F VOL: 0 ; ;//работа UART с прерыванием Rx и буфером //******************************** ;#define DATA_REGISTER_EMPTY (1< R17 ; data -> R16 ;PCODE: $00000083 VOL: 0 ;PCODE: $00000084 VOL: 0 ; 0000 0164 data=UDR; ;PCODE: $00000085 VOL: 0 ;PCODE: $00000086 VOL: 0 ; 0000 0165 if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) // Если нет ошибки при приеме байта ;PCODE: $00000087 VOL: 0 ;PCODE: $00000088 VOL: 0 ;PCODE: $00000089 VOL: 0 ; 0000 0166 { ; 0000 0167 rx_buffer[rx_wr_index++]=data; //сохраняем байт в буфере ;PCODE: $0000008A VOL: 0 ;PCODE: $0000008B VOL: 0 ;PCODE: $0000008C VOL: 0 ;PCODE: $0000008D VOL: 0 ; 0000 0168 ; 0000 0169 if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; ;PCODE: $0000008E VOL: 0 ;PCODE: $0000008F VOL: 0 ;PCODE: $00000090 VOL: 0 ;PCODE: $00000091 VOL: 0 ; 0000 016A if (++rx_counter == RX_BUFFER_SIZE) ;PCODE: $00000092 VOL: 0 ;PCODE: $00000093 VOL: 0 ;PCODE: $00000094 VOL: 0 ;PCODE: $00000095 VOL: 0 ;PCODE: $00000096 VOL: 0 ; 0000 016B { ; 0000 016C rx_counter=0; ;PCODE: $00000097 VOL: 0 ; 0000 016D rx_buffer_overflow=1; //флаг переполнения буфера ;PCODE: $00000098 VOL: 0 ;PCODE: $00000099 VOL: 0 ; 0000 016E } ; 0000 016F } ;PCODE: $0000009A VOL: 0 ; 0000 0170 //status=0; ; 0000 0171 ; 0000 0172 /* ; 0000 0173 if (flag_init==1) { ; 0000 0174 LED_ON(6); //вкл. светодиод и усилитель мощности ; 0000 0175 writeCmd(0x8239); //вкл. передатчик TX ; 0000 0176 FSK=0; //выкл. перед. регистр (0-вкл. приёмного региста) ; 0000 0177 while (PIND.5==0) { ; 0000 0178 rfSend_GPS(); //flag_1s==0 передача, flag_1s==1 приём ; 0000 0179 if ((dataGPS==0x0A)&&(flag_1s==1)) {//если равно и таймер кончился, можно выходить отсюда ; 0000 017A //if (dataGPS==0x0A) { ; 0000 017B flag_GPS=0; ; 0000 017C break; ; 0000 017D }; ; 0000 017E }; ; 0000 017F //rfSend_GPS(); ; 0000 0180 }; */ ; 0000 0181 } ;PCODE: $0000009B VOL: 0 ;PCODE: $0000009C VOL: 0 ;PCODE: $0000009D VOL: 0 ;PCODE: $0000009E VOL: 0 ;PCODE: $0000009F VOL: 0 ; ; ;//#ifndef _DEBUG_TERMINAL_IO_ ;//// Get a character from the USART Receiver buffer ;//#define _ALTERNATE_GETCHAR_ ;//#pragma used+ ;char getchar_Tout(void) //================================================= ; 0000 0189 { ;PCODE: $000000A0 VOL: 0 ;PCODE: $000000A1 VOL: 0 ; 0000 018A char data; ; 0000 018B //while (rx_counter==0); ; 0000 018C //ждём когда вбуфере появятся данные и время ожидания не истекло ; 0000 018D StartTimer0_init(); //запуск таймера ;PCODE: $000000A2 VOL: 0 ; data -> R17 ;PCODE: $000000A3 VOL: 0 ;PCODE: $000000A4 VOL: 0 ;PCODE: $000000A5 VOL: 0 ;PCODE: $000000A6 VOL: 0 ;PCODE: $000000A7 VOL: 0 ;PCODE: $000000A8 VOL: 0 ;PCODE: $000000A9 VOL: 0 ;PCODE: $000000AA VOL: 0 ;PCODE: $000000AB VOL: 0 ;PCODE: $000000AC VOL: 0 ;PCODE: $000000AD VOL: 0 ;PCODE: $000000AE VOL: 0 ;PCODE: $000000AF VOL: 0 ;PCODE: $000000B0 VOL: 0 ;PCODE: $000000B1 VOL: 0 ;PCODE: $000000B2 VOL: 0 ; 0000 018E while ((rx_counter==0) && timeout_T0); ;PCODE: $000000B3 VOL: 0 ;PCODE: $000000B4 VOL: 0 ;PCODE: $000000B5 VOL: 0 ;PCODE: $000000B6 VOL: 0 ;PCODE: $000000B7 VOL: 0 ;PCODE: $000000B8 VOL: 0 ;PCODE: $000000B9 VOL: 0 ;PCODE: $000000BA VOL: 0 ;PCODE: $000000BB VOL: 0 ;PCODE: $000000BC VOL: 0 ;PCODE: $000000BD VOL: 0 ;PCODE: $000000BE VOL: 0 ; 0000 018F // if (rx_counter!=0) { //return; //&&(rx_counter!=0) ; 0000 0190 if (timeout_T0) { //если время ожидания истекло, уходим ;PCODE: $000000BF VOL: 0 ;PCODE: $000000C0 VOL: 0 ;PCODE: $000000C1 VOL: 0 ; 0000 0191 //goto end_getchar_Tout; ; 0000 0192 data=rx_buffer[rx_rd_index++]; ;PCODE: $000000C2 VOL: 0 ;PCODE: $000000C3 VOL: 0 ;PCODE: $000000C4 VOL: 0 ;PCODE: $000000C5 VOL: 0 ; 0000 0193 if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0; ;PCODE: $000000C6 VOL: 0 ;PCODE: $000000C7 VOL: 0 ;PCODE: $000000C8 VOL: 0 ;PCODE: $000000C9 VOL: 0 ; 0000 0194 #asm("cli") // глобально запретить прерывания ;PCODE: $000000CA VOL: 0 ;PCODE: $000000CB VOL: 0 cli ;PCODE: $000000CC VOL: 0 ; 0000 0195 --rx_counter; ;PCODE: $000000CD VOL: 0 ; 0000 0196 #asm("sei") // глобально разрешить прерывания ;PCODE: $000000CE VOL: 0 sei ;PCODE: $000000CF VOL: 0 ; 0000 0197 return data; ;PCODE: $000000D0 VOL: 0 ;PCODE: $000000D1 VOL: 0 ;PCODE: $000000D2 VOL: 0 ; 0000 0198 }; ;PCODE: $000000D3 VOL: 0 ; 0000 0199 //end_getchar_Tout: //выход по истечению времени ; 0000 019A } ;PCODE: $000000D4 VOL: 0 ;PCODE: $000000D5 VOL: 0 ;PCODE: $000000D6 VOL: 0 ;//#pragma used- ;//#endif ;//*******************************************************************/ ;//== конец UART по прерыванию Rx ===// ; ; ; ; ;//======== Описания функций =========// ;void LED_Blink(unsigned char blink, unsigned int timeb) //мигаем светодиодом blink раз, timeb мимлисекунд ; 0000 01A5 { ;PCODE: $000000D7 VOL: 0 ;PCODE: $000000D8 VOL: 0 ; 0000 01A6 char i; ; 0000 01A7 for(i = 0; i < blink; i++) ;PCODE: $000000D9 VOL: 0 ;PCODE: $000000DA VOL: 0 ; blink -> Y+3 ; timeb -> Y+1 ; i -> R17 ;PCODE: $000000DB VOL: 0 ;PCODE: $000000DC VOL: 0 ;PCODE: $000000DD VOL: 0 ;PCODE: $000000DE VOL: 0 ;PCODE: $000000DF VOL: 0 ;PCODE: $000000E0 VOL: 0 ;PCODE: $000000E1 VOL: 0 ;PCODE: $000000E2 VOL: 0 ;PCODE: $000000E3 VOL: 0 ; 0000 01A8 { ; 0000 01A9 LED_ON(6); //вкл. светодиод PORTD.6 ;PCODE: $000000E4 VOL: 0 ;PCODE: $000000E5 VOL: 0 ; 0000 01AA delay_ms(timeb); ;PCODE: $000000E6 VOL: 0 ;PCODE: $000000E7 VOL: 0 ; 0000 01AB LED_OFF(6); //выкл. светодиод PORTD.6 ;PCODE: $000000E8 VOL: 0 ;PCODE: $000000E9 VOL: 0 ; 0000 01AC delay_ms(timeb); ;PCODE: $000000EA VOL: 0 ;PCODE: $000000EB VOL: 0 ; 0000 01AD } ;PCODE: $000000EC VOL: 0 ;PCODE: $000000ED VOL: 0 ;PCODE: $000000EE VOL: 0 ;PCODE: $000000EF VOL: 0 ;PCODE: $000000F0 VOL: 0 ; 0000 01AE } ;PCODE: $000000F1 VOL: 0 ;PCODE: $000000F2 VOL: 0 ;PCODE: $000000F3 VOL: 0 ;PCODE: $000000F4 VOL: 0 ;PCODE: $000000F5 VOL: 0 ; ;/* ;void LED_Blink_D4(unsigned char blink, unsigned int timeb) //мигаем светодиодом blink раз, timeb мимлисекунд ;{ ; char i; ; for(i = 0; i < blink; i++) ; { ; LED_ON(4); //вкл. светодиод PORTD.4 ; delay_ms(timeb); ; LED_OFF(4); //выкл. светодиод PORTD.4 ; delay_ms(timeb); ; } ;} */ ; ; ; ; ;//====== USI - SPI //программный SPI//========// ;//инициализация портов, SPI в init_ATtiny ;//функция передачи-приёма 2-х байт(16bit) по USI с max скоростью (до Fclk/2) ;//такт 7,1МГц, 0,14мкс(7,142Мбит/сек), время передачи 16bit 5,49мкс(2,9Mbit/sec), ;//полное время передачи одной команды 16bit-8,34мкс или 1,918Мбит/сек (40 тактов) ;unsigned int writeCmd(unsigned int cmd) ; 0000 01C6 { ;PCODE: $000000F6 VOL: 0 ;PCODE: $000000F7 VOL: 0 ; 0000 01C7 unsigned int recv_16b=0; //16bit полученные из USIDR ; 0000 01C8 LO(nSEL); // PORTB.4 SPI nSEL (chip select ENABLE) ;PCODE: $000000F8 VOL: 0 ;PCODE: $000000F9 VOL: 0 ; cmd -> Y+2 ; recv_16b -> R16,R17 ;PCODE: $000000FA VOL: 0 ;PCODE: $000000FB VOL: 0 ;PCODE: $000000FC VOL: 0 ;PCODE: $000000FD VOL: 0 ; 0000 01C9 //USIDR = data_w;//передаваемые данные в сдвиговый регисть ; 0000 01CA USIDR =cmd>>8;//16bit->8bit старший разряд, передаваемые данные в сдвиговый регистр ;PCODE: $000000FE VOL: 0 ;PCODE: $000000FF VOL: 0 ;PCODE: $00000100 VOL: 0 ; 0000 01CB USICR = 0b00010001;//и формируем тактирующие импульсы программно ;PCODE: $00000101 VOL: 0 ;PCODE: $00000102 VOL: 0 ; 0000 01CC USICR = 0b00010011; ;PCODE: $00000103 VOL: 0 ;PCODE: $00000104 VOL: 0 ; 0000 01CD USICR = 0b00010001; ;PCODE: $00000105 VOL: 0 ;PCODE: $00000106 VOL: 0 ; 0000 01CE USICR = 0b00010011; ;PCODE: $00000107 VOL: 0 ;PCODE: $00000108 VOL: 0 ; 0000 01CF USICR = 0b00010001; ;PCODE: $00000109 VOL: 0 ;PCODE: $0000010A VOL: 0 ; 0000 01D0 USICR = 0b00010011; ;PCODE: $0000010B VOL: 0 ;PCODE: $0000010C VOL: 0 ; 0000 01D1 USICR = 0b00010001; ;PCODE: $0000010D VOL: 0 ;PCODE: $0000010E VOL: 0 ; 0000 01D2 USICR = 0b00010011; ;PCODE: $0000010F VOL: 0 ;PCODE: $00000110 VOL: 0 ; 0000 01D3 USICR = 0b00010001; ;PCODE: $00000111 VOL: 0 ;PCODE: $00000112 VOL: 0 ; 0000 01D4 USICR = 0b00010011; ;PCODE: $00000113 VOL: 0 ;PCODE: $00000114 VOL: 0 ; 0000 01D5 USICR = 0b00010001; ;PCODE: $00000115 VOL: 0 ;PCODE: $00000116 VOL: 0 ; 0000 01D6 USICR = 0b00010011; ;PCODE: $00000117 VOL: 0 ;PCODE: $00000118 VOL: 0 ; 0000 01D7 USICR = 0b00010001; ;PCODE: $00000119 VOL: 0 ;PCODE: $0000011A VOL: 0 ; 0000 01D8 USICR = 0b00010011; ;PCODE: $0000011B VOL: 0 ;PCODE: $0000011C VOL: 0 ; 0000 01D9 USICR = 0b00010001; ;PCODE: $0000011D VOL: 0 ;PCODE: $0000011E VOL: 0 ; 0000 01DA USICR = 0b00010011; ;PCODE: $0000011F VOL: 0 ;PCODE: $00000120 VOL: 0 ; 0000 01DB ; 0000 01DC recv_16b = USIDR<<8; //сохраняем старший байт из USIDR ;PCODE: $00000121 VOL: 0 ;PCODE: $00000122 VOL: 0 ;PCODE: $00000123 VOL: 0 ; 0000 01DD USIDR = cmd&0x00FF;//оставляем младший 8бит разряд (вместо FF) ;PCODE: $00000124 VOL: 0 ;PCODE: $00000125 VOL: 0 ;PCODE: $00000126 VOL: 0 ; 0000 01DE //USIDR =cmd<<8;//16bit->8bit младший разряд, передаваемые данные в сдвиговый регистр ; 0000 01DF ; 0000 01E0 USICR = 0b00010001;//и формируем тактирующие импульсы программно ;PCODE: $00000127 VOL: 0 ;PCODE: $00000128 VOL: 0 ; 0000 01E1 USICR = 0b00010011; ;PCODE: $00000129 VOL: 0 ;PCODE: $0000012A VOL: 0 ; 0000 01E2 USICR = 0b00010001; ;PCODE: $0000012B VOL: 0 ;PCODE: $0000012C VOL: 0 ; 0000 01E3 USICR = 0b00010011; ;PCODE: $0000012D VOL: 0 ;PCODE: $0000012E VOL: 0 ; 0000 01E4 USICR = 0b00010001; ;PCODE: $0000012F VOL: 0 ;PCODE: $00000130 VOL: 0 ; 0000 01E5 USICR = 0b00010011; ;PCODE: $00000131 VOL: 0 ;PCODE: $00000132 VOL: 0 ; 0000 01E6 USICR = 0b00010001; ;PCODE: $00000133 VOL: 0 ;PCODE: $00000134 VOL: 0 ; 0000 01E7 USICR = 0b00010011; ;PCODE: $00000135 VOL: 0 ;PCODE: $00000136 VOL: 0 ; 0000 01E8 USICR = 0b00010001; ;PCODE: $00000137 VOL: 0 ;PCODE: $00000138 VOL: 0 ; 0000 01E9 USICR = 0b00010011; ;PCODE: $00000139 VOL: 0 ;PCODE: $0000013A VOL: 0 ; 0000 01EA USICR = 0b00010001; ;PCODE: $0000013B VOL: 0 ;PCODE: $0000013C VOL: 0 ; 0000 01EB USICR = 0b00010011; ;PCODE: $0000013D VOL: 0 ;PCODE: $0000013E VOL: 0 ; 0000 01EC USICR = 0b00010001; ;PCODE: $0000013F VOL: 0 ;PCODE: $00000140 VOL: 0 ; 0000 01ED USICR = 0b00010011; ;PCODE: $00000141 VOL: 0 ;PCODE: $00000142 VOL: 0 ; 0000 01EE USICR = 0b00010001; ;PCODE: $00000143 VOL: 0 ;PCODE: $00000144 VOL: 0 ; 0000 01EF USICR = 0b00010011; ;PCODE: $00000145 VOL: 0 ;PCODE: $00000146 VOL: 0 ; 0000 01F0 recv_16b |=USIDR; //(побитовая ИЛИ) добовляем младший байт из USIDR ;PCODE: $00000147 VOL: 0 ;PCODE: $00000148 VOL: 0 ;PCODE: $00000149 VOL: 0 ;PCODE: $0000014A VOL: 0 ; 0000 01F1 HI(nSEL); //PORTB.4 SPI nSEL (chip select DISALBE) ;PCODE: $0000014B VOL: 0 ;PCODE: $0000014C VOL: 0 ; 0000 01F2 return recv_16b; //возврашаем 16bit полученные из USIDR ;PCODE: $0000014D VOL: 0 ;PCODE: $0000014E VOL: 0 ;PCODE: $0000014F VOL: 0 ;PCODE: $00000150 VOL: 0 ; 0000 01F3 } ;PCODE: $00000151 VOL: 0 ; ;//********************************************** ;//8bit функция передачи по USI 7,1МГц 0,14мкс и RF ;//3,46мкс 19тактов или 2,31Мбит/сек ;void rfSend_Byte(unsigned char rf_byte) //Передача байта по SPI с опросом освобождения прд. регистра RF ; 0000 01F9 { ;PCODE: $00000152 VOL: 0 ;PCODE: $00000153 VOL: 0 ; 0000 01FA //LO(2); //вкл. тест светодиод PORTB.2 ; 0000 01FB //wait for previously TX over PIND.2=0 ; 0000 01FC while(nIRQ_LOW); //передающий регистр готов к приёму след. байта ;PCODE: $00000154 VOL: 0 ; rf_byte -> Y+0 ;PCODE: $00000155 VOL: 0 ;PCODE: $00000156 VOL: 0 ;PCODE: $00000157 VOL: 0 ;PCODE: $00000158 VOL: 0 ;PCODE: $00000159 VOL: 0 ;PCODE: $0000015A VOL: 0 ; 0000 01FD USIDR = rf_byte;//8bit отправляем байт в сдвиговый регистр ;PCODE: $0000015B VOL: 0 ;PCODE: $0000015C VOL: 0 ; 0000 01FE USICR = 0b00010001;//и формируем тактирующие импульсы программно ;PCODE: $0000015D VOL: 0 ;PCODE: $0000015E VOL: 0 ; 0000 01FF USICR = 0b00010011; ;PCODE: $0000015F VOL: 0 ;PCODE: $00000160 VOL: 0 ; 0000 0200 USICR = 0b00010001; ;PCODE: $00000161 VOL: 0 ;PCODE: $00000162 VOL: 0 ; 0000 0201 USICR = 0b00010011; ;PCODE: $00000163 VOL: 0 ;PCODE: $00000164 VOL: 0 ; 0000 0202 USICR = 0b00010001; ;PCODE: $00000165 VOL: 0 ;PCODE: $00000166 VOL: 0 ; 0000 0203 USICR = 0b00010011; ;PCODE: $00000167 VOL: 0 ;PCODE: $00000168 VOL: 0 ; 0000 0204 USICR = 0b00010001; ;PCODE: $00000169 VOL: 0 ;PCODE: $0000016A VOL: 0 ; 0000 0205 USICR = 0b00010011; ;PCODE: $0000016B VOL: 0 ;PCODE: $0000016C VOL: 0 ; 0000 0206 USICR = 0b00010001; ;PCODE: $0000016D VOL: 0 ;PCODE: $0000016E VOL: 0 ; 0000 0207 USICR = 0b00010011; ;PCODE: $0000016F VOL: 0 ;PCODE: $00000170 VOL: 0 ; 0000 0208 USICR = 0b00010001; ;PCODE: $00000171 VOL: 0 ;PCODE: $00000172 VOL: 0 ; 0000 0209 USICR = 0b00010011; ;PCODE: $00000173 VOL: 0 ;PCODE: $00000174 VOL: 0 ; 0000 020A USICR = 0b00010001; ;PCODE: $00000175 VOL: 0 ;PCODE: $00000176 VOL: 0 ; 0000 020B USICR = 0b00010011; ;PCODE: $00000177 VOL: 0 ;PCODE: $00000178 VOL: 0 ; 0000 020C USICR = 0b00010001; ;PCODE: $00000179 VOL: 0 ;PCODE: $0000017A VOL: 0 ; 0000 020D USICR = 0b00010011; ;PCODE: $0000017B VOL: 0 ;PCODE: $0000017C VOL: 0 ; 0000 020E //HI(2); //выкл. тест светодиод PORTB.2 ; 0000 020F //USISR |= (1<медленный, ручной-быстрый) ;PCODE: $0000018F VOL: 0 ;PCODE: $00000190 VOL: 0 ; 0000 0249 //writeCmd(0xC2AC); //AL,!ml,DIG,DQD4(авт.режим быстрый->медленный)этот лучше ; 0000 024A //writeCmd(0xC26C); //!AL,ml,DIG,DQD4(ручной, быстрый) ; 0000 024B //writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR 81-заполнение FIFO-буфера не по шаблону синхронизации ; 0000 024C writeCmd(0xCA83); //FIFO8,SYNC,ff,DR ==83заполнение FIFO-буфера по шаблону синхронизации ;PCODE: $00000191 VOL: 0 ;PCODE: $00000192 VOL: 0 ; 0000 024D //writeCmd(0xCAE3); ; 0000 024E writeCmd(0xCED6); //SYNC=2DD4(D4 по умолчанию) синхробайт ;PCODE: $00000193 VOL: 0 ;PCODE: $00000194 VOL: 0 ; 0000 024F //writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN ; 0000 0250 writeCmd(0xC49B); //@PWR,YES RSTRIC,st,!fi,OE,EN настройки АПЧ ;PCODE: $00000195 VOL: 0 ;PCODE: $00000196 VOL: 0 ; 0000 0251 //=== настройка модуляции и выходной мощности === !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; 0000 0252 //writeCmd(0x9850); //!mp,90kHz(57.6kbps),MAX Pout (полярность,полоса модуляции; Pвых) ; 0000 0253 //writeCmd(0x9852); //!mp,90kHz(57.6kbps),-6дБ Pout (полярность,полоса модуляции; Pвых)!!! ; 0000 0254 writeCmd(0x9855); //!mp,90kHz(57.6kbps),-15дБ OUT (полярность,полоса модуляции; Pвых) ;PCODE: $00000197 VOL: 0 ;PCODE: $00000198 VOL: 0 ; 0000 0255 //writeCmd(0x9857); //!mp,90kHz(57.6kbps),-21дБ OUT (полярность,полоса модуляции; Pвых) ; 0000 0256 //writeCmd(0x9870); //!mp,120kHz(115,2kbps),MAX OUT (120kHz зависит от скорости передачи) ; 0000 0257 //=============================================== ; 0000 0258 writeCmd(0xCC77); //OB1, OB0, LPX, 0-ddy, 1-DDIT, 1, 0-CBW0 =77 регистр настройки ФАПЧ ;PCODE: $00000199 VOL: 0 ;PCODE: $0000019A VOL: 0 ; 0000 0259 writeCmd(0xE000); //NOT USED ;PCODE: $0000019B VOL: 0 ;PCODE: $0000019C VOL: 0 ; 0000 025A writeCmd(0xC800); //NOT USED ;PCODE: $0000019D VOL: 0 ;PCODE: $0000019E VOL: 0 ; 0000 025B writeCmd(0xC000); //1.0MHz,2.2V NOT USED ;PCODE: $0000019F VOL: 0 ;PCODE: $000001A0 VOL: 0 ; 0000 025C ; 0000 025D //====================================================== ; 0000 025E //LO(nSEL); // PORTB.4 SPI nSEL (chip select ENABLE) ; 0000 025F //HI(nSEL); //PORTB.4 SPI nSEL (chip select DISALBE) ; 0000 0260 //writeCmd(0x8219); //включен только кварцевый генератор ; 0000 0261 //writeCmd(0x8218); //включен синтезатор, кварцевый генератор ; 0000 0262 //writeCmd(0x8259); //вкл демодулятора ; 0000 0263 //writeCmd(0x8221); // et-вкл. всего тракта передатчика,dc ; 0000 0264 //writeCmd(0x8281); // et-вкл. всего тракта приёмника,dc ; 0000 0265 } ;PCODE: $000001A1 VOL: 0 ;PCODE: $000001A2 VOL: 0 ; ; ; ;//================= GPS ======================// ;/* ;//Сообщения начинаются символом «$» и заканчиваются символом «*», за которым ;//последовательно идут две шестнадцатеричные цифры контрольной суммы «hh», ;//символы возврата каретки и перевода строки . ;//В качестве разделителя полей данных используется символ «,» ;//Контрольная сумма равна восьмибитному «исключающему ИЛИ» (HOR) всех ;//символов между символами «$» и «*» (не включая их). Передается в виде двух ;//шестнадцатеричных цифр (символов) старшей тетрадой вперед. ;//Максимальное общее количество символов в любом предложении 82; ;//максимум 79 символов между разделителем "$" и ;//The maximum total number of characters in any sentence is 82; ;//maximum of 79 characters between the starting delimiter "$" and the terminating . ;//====== СЕЙЧАС ВКЛЮЧЕН!!! ;//Меняем заводские установи GPS на более быстрые и убираем ненужные данные в NMEA: ;//set NMEA out RMS,GGA,GSA,GSV(1раз в 5циклов) ;//DGPS correction data source mode, disable ;//set EASY, disable (для высоких скоростей) ;//Set GPS baud rate: bps ;//USART Baud Rate: bps ;//Set Update Rate: Hz USART Baud Rate: 14400bps, Update Rate: 2Hz ;*/ ;//============================================// ; ;//==== инициализация модуля GPS ==== ;void init_GPS(void) //инициализация GPS проверкой преамбулы '$GP' ; 0000 0283 { ;PCODE: $000001A3 VOL: 0 ;PCODE: $000001A4 VOL: 0 ; 0000 0284 bit flag_GPSinit = 1; //флаг инициализации GPS, если не нужна инициализация ставим 0 ; 0000 0285 bit flag_setNMEA = 0; //Для теста, флаг разрешения изменения параметров GPS после проверки,0-запрет. ; 0000 0286 unsigned char i = 0; ; 0000 0287 ; 0000 0288 while(flag_GPSinit) //если флаг сброшен, выходим отсюда ;PCODE: $000001A5 VOL: 0 ; flag_GPSinit -> R15.0 ; flag_setNMEA -> R15.1 ; i -> R17 ;PCODE: $000001A6 VOL: 0 ;PCODE: $000001A7 VOL: 0 ;PCODE: $000001A8 VOL: 0 ;PCODE: $000001A9 VOL: 0 ;PCODE: $000001AA VOL: 0 ;PCODE: $000001AB VOL: 0 ;PCODE: $000001AC VOL: 0 ;PCODE: $000001AD VOL: 0 ; 0000 0289 { ; 0000 028A unsigned char chk_S, chk_G, chk_P; ; 0000 028B //char string_chk[]; ; 0000 028C //string_chk[]= "$GP"; ; 0000 028D //=========== restore!!! ======================= ; 0000 028E //putsf("$PMTK104*37\r\n"); //restore GPS default setting!!! ; 0000 028F //Set restore the GPS system default factory setting ; 0000 0290 //#asm("sei")// глобально разрешить прерывания ; 0000 0291 chk_S = getchar_Tout(); ;PCODE: $000001AE VOL: 0 ; flag_GPSinit -> R15.0 ; flag_setNMEA -> R15.1 ; chk_S -> Y+2 ; chk_G -> Y+1 ; chk_P -> Y+0 ;PCODE: $000001AF VOL: 0 ;PCODE: $000001B0 VOL: 0 ; 0000 0292 //putchar(chk_S);//тестовое сообщение для отладки ; 0000 0293 if(chk_S=='$') { ;PCODE: $000001B1 VOL: 0 ;PCODE: $000001B2 VOL: 0 ;PCODE: $000001B3 VOL: 0 ; 0000 0294 chk_G = getchar_Tout(); ;PCODE: $000001B4 VOL: 0 ;PCODE: $000001B5 VOL: 0 ; 0000 0295 chk_P = getchar_Tout(); ;PCODE: $000001B6 VOL: 0 ;PCODE: $000001B7 VOL: 0 ; 0000 0296 if(chk_G=='G' && chk_P=='P') { ;PCODE: $000001B8 VOL: 0 ;PCODE: $000001B9 VOL: 0 ;PCODE: $000001BA VOL: 0 ;PCODE: $000001BB VOL: 0 ;PCODE: $000001BC VOL: 0 ;PCODE: $000001BD VOL: 0 ;PCODE: $000001BE VOL: 0 ;PCODE: $000001BF VOL: 0 ;PCODE: $000001C0 VOL: 0 ;PCODE: $000001C1 VOL: 0 ; 0000 0297 //if ((PIND.5 == 0)&&(flag_setNMEA == 1)) { //опрос перемычки и флага ; 0000 0298 if (flag_setNMEA == 1) { ;PCODE: $000001C2 VOL: 0 ;PCODE: $000001C3 VOL: 0 ;PCODE: $000001C4 VOL: 0 ; 0000 0299 goto line_setNMEA; //установка новых параметров ;PCODE: $000001C5 VOL: 0 ; 0000 029A }; ;PCODE: $000001C6 VOL: 0 ; 0000 029B ; 0000 029C flag_GPSinit = 0; //GPS настроен правильно ;PCODE: $000001C7 VOL: 0 ;PCODE: $000001C8 VOL: 0 ;PCODE: $000001C9 VOL: 0 ; 0000 029D LED_Blink(3, 100);//мигаем 3 раза быстро ;PCODE: $000001CA VOL: 0 ;PCODE: $000001CB VOL: 0 ;PCODE: $000001CC VOL: 0 ;PCODE: $000001CD VOL: 0 ;PCODE: $000001CE VOL: 0 ; 0000 029E //putsf("GOOD\r\n");//тестовое сообщение для отладки ; 0000 029F break; ;PCODE: $000001CF VOL: 0 ;PCODE: $000001D0 VOL: 0 ; 0000 02A0 }; ;PCODE: $000001D1 VOL: 0 ; 0000 02A1 //LED_Blink(3, 200);//мигаем 3 раза быстро для отладки ; 0000 02A2 }; ;PCODE: $000001D2 VOL: 0 ; 0000 02A3 // else { ; 0000 02A4 //LO(2); //вкл. тест светодиод PORTB.2 ; 0000 02A5 //putsf("ERROR\r\n"); //тестовое сообщение, для отладки ; 0000 02A6 if(i==82) { //кол-во циклов, для достоверного распознавания символов ;PCODE: $000001D3 VOL: 0 ;PCODE: $000001D4 VOL: 0 ;PCODE: $000001D5 VOL: 0 ; 0000 02A7 //кол-во символов в кадре NMEA = $+79+CR+LF =82 ; 0000 02A8 //инициализация GPS ; 0000 02A9 //ВНИМАНИЕ! Для установки нового Baud Rate в программе, скорость GPS должна быть 9,6kbps ; 0000 02AA //для этого отключить батарейку или сделать программный сброс GPS ; 0000 02AB //#asm("cli") // глобально запретить прерывания, во время установки параметров модуля GPS ; 0000 02AC UBRRL=0x5F; //USART Baud Rate: 9600 если у GPS начальная скорость 9,6kbps ;PCODE: $000001D6 VOL: 0 ;PCODE: $000001D7 VOL: 0 ; 0000 02AD //UBRRL=0x3F; //63 USART Baud Rate: 14400bps ; 0000 02AE //UBRRL=0x2F; //47 USART Baud Rate: 19200bps ; 0000 02AF //UBRRL=0x17; //23 USART Baud Rate: 38400bps ; 0000 02B0 //UBRRL=0x0F; //15 USART Baud Rate: 57600bps и 14,745600 MHz ; 0000 02B1 //=========== restore!!! ======================= ; 0000 02B2 //putsf("$PMTK104*37\r\n"); //restore GPS default setting!!! ; 0000 02B3 //Set restore the GPS system default factory setting ; 0000 02B4 //заводские настройки 9600, 1Гц, заполнение 53,7% VTG(1)-GSA(1)-RMC(1)-GGA(1)-GSV(5) ; 0000 02B5 ; 0000 02B6 delay_ms(100); ;PCODE: $000001D8 VOL: 0 ;PCODE: $000001D9 VOL: 0 ;PCODE: $000001DA VOL: 0 ; 0000 02B7 line_setNMEA: ;PCODE: $000001DB VOL: 0 ; 0000 02B8 #asm("cli") // глобально запретить прерывания, во время установки параметров модуля GPS ;PCODE: $000001DC VOL: 0 cli ;PCODE: $000001DD VOL: 0 ; 0000 02B9 //=========== set NMEA out ====================== ; 0000 02BA putsf("$PMTK314,0,1,0,1,1,5,0,0,0,0,0,0,0,0,0,0,0,0,0*2C\r\n"); //set NMEA out: RMS,GGA,GSA,GSV(1раз в 5циклов) ;PCODE: $000001DE VOL: 0 ;PCODE: $000001DF VOL: 0 ;PCODE: $000001E0 VOL: 0 ; 0000 02BB putsf("$PMTK301,0*2C\x0D\x0A"); //DGPS correction data source mode, disable. Для нас не нужен. ;PCODE: $000001E1 VOL: 0 ;PCODE: $000001E2 VOL: 0 ;PCODE: $000001E3 VOL: 0 ; 0000 02BC putsf("$PMTK869,1,0*34\r\n"); //set EASY disable (для update-rate 2Гц и выше). ;PCODE: $000001E4 VOL: 0 ;PCODE: $000001E5 VOL: 0 ;PCODE: $000001E6 VOL: 0 ; 0000 02BD ; 0000 02BE //=========!!! GPS Baudrate setting должен соответствовать UART !!!========= ; 0000 02BF //Baudrate setting : 9600,14400,19200,38400,57600,115200 ; 0000 02C0 // $PMTK251,38400*27 Change the baud rate 38400 bps ; 0000 02C1 //putsf("$PMTK251,9600*17\x0D\x0A"); //Set GPS baud rate 9600bps ; 0000 02C2 putsf("$PMTK251,14400*29\x0D\x0A"); //Set GPS baud rate 14400bps ;PCODE: $000001E7 VOL: 0 ;PCODE: $000001E8 VOL: 0 ;PCODE: $000001E9 VOL: 0 ; 0000 02C3 //putsf("$PMTK251,19200*22\x0D\x0A"); //Set GPS baud rate 19200bps ; 0000 02C4 //putsf("$PMTK251,38400*27\x0D\x0A"); //Set GPS baud rate 38400bps ; 0000 02C5 //putsf("$PMTK251,57600*2C\x0D\x0A"); //Set GPS baud rate 57600bps ; 0000 02C6 //putsf("$PMTK251,115200*1F\x0D\x0A"); //Set GPS baud rate 115200bps ; 0000 02C7 delay_ms(100); ;PCODE: $000001EA VOL: 0 ;PCODE: $000001EB VOL: 0 ;PCODE: $000001EC VOL: 0 ; 0000 02C8 ; 0000 02C9 //========= USART Baud Rate должен соответствовать GPS!!!=================== ; 0000 02CA //BAUDRATE; //USART Baud Rate задаём в define ; 0000 02CB //UBRRL=0x5F; //USART Baud Rate: 9600 ; 0000 02CC UBRRL=0x3F; //USART Baud Rate: 14400bps ;PCODE: $000001ED VOL: 0 ;PCODE: $000001EE VOL: 0 ; 0000 02CD //UBRRL=0x2F; //23 для Baud Rate: 19200bps ; 0000 02CE //UBRRL=0x17; //23 для Baud Rate: 38400bps ; 0000 02CF //UBRRL=0x0F; //USART Baud Rate: 57600bps ; 0000 02D0 delay_ms(500);//занимает 1,3% памяти ;PCODE: $000001EF VOL: 0 ;PCODE: $000001F0 VOL: 0 ; 0000 02D1 ; 0000 02D2 //========= GPS Update Rate ======================== ; 0000 02D3 // putsf("$PMTK220,1000*1F\r\n"); //Set Update Rate-1Hz ; 0000 02D4 putsf("$PMTK220,500*2B\r\n"); //Set Update Rate-2Hz ;PCODE: $000001F1 VOL: 0 ;PCODE: $000001F2 VOL: 0 ;PCODE: $000001F3 VOL: 0 ; 0000 02D5 //putsf("$PMTK220,250*29\r\n"); //Set Update Rate-4Hz ; 0000 02D6 //putsf("$PMTK220,200*2C\r\n"); //Set Update Rate-5Hz ; 0000 02D7 //putsf("$PMTK220,100*2F\r\n"); //Set Update Rate-10Hz ; 0000 02D8 ; 0000 02D9 LED_Blink(1, 500);//мигаем 1 раз ;PCODE: $000001F4 VOL: 0 ;PCODE: $000001F5 VOL: 0 ;PCODE: $000001F6 VOL: 0 ;PCODE: $000001F7 VOL: 0 ; 0000 02DA //HI(2); //вЫкл. тест светодиод PORTB.2 ; 0000 02DB flag_setNMEA=0; ;PCODE: $000001F8 VOL: 0 ;PCODE: $000001F9 VOL: 0 ;PCODE: $000001FA VOL: 0 ; 0000 02DC i=0;//сброс счётчика ;PCODE: $000001FB VOL: 0 ;PCODE: $000001FC VOL: 0 ; 0000 02DD #asm("sei")// глобально разрешить прерывания ;PCODE: $000001FD VOL: 0 sei ;PCODE: $000001FE VOL: 0 ; 0000 02DE //break; ; 0000 02DF //return; ; 0000 02E0 } ; 0000 02E1 else { ;PCODE: $000001FF VOL: 0 ;PCODE: $00000200 VOL: 0 ; 0000 02E2 i++; //счётчик ;PCODE: $00000201 VOL: 0 ;PCODE: $00000202 VOL: 0 ; 0000 02E3 }; ;PCODE: $00000203 VOL: 0 ; 0000 02E4 ; 0000 02E5 ; 0000 02E6 //}; ; 0000 02E7 }; ;PCODE: $00000204 VOL: 0 ;PCODE: $00000205 VOL: 0 ;PCODE: $00000206 VOL: 0 ; 0000 02E8 ; 0000 02E9 //#asm("sei")// глобально разрешить прерывания ; 0000 02EA //LED_Blink(4, 1000);//мигаем 3 раза через 1сек. ; 0000 02EB } //конец инициализации GPS ============================================// ;PCODE: $00000207 VOL: 0 ;PCODE: $00000208 VOL: 0 ;PCODE: $00000209 VOL: 0 ;//********// ;//GPS ВКЛЮЧЕН!!!******************************// ; ;//===================== перенос железа из main в init_ATtiny2313 ==============================// ;void init_ATtiny(void) ; 0000 02F1 { ;PCODE: $0000020A VOL: 0 ;PCODE: $0000020B VOL: 0 ; 0000 02F2 // Crystal Oscillator division factor: 1 ; 0000 02F3 #pragma optsize- ; 0000 02F4 CLKPR=0x80; ;PCODE: $0000020C VOL: 0 ;PCODE: $0000020D VOL: 0 ; 0000 02F5 CLKPR=0x00; ;PCODE: $0000020E VOL: 0 ;PCODE: $0000020F VOL: 0 ; 0000 02F6 #ifdef _OPTIMIZE_SIZE_ ; 0000 02F7 #pragma optsize+ ; 0000 02F8 #endif ; 0000 02F9 ; 0000 02FA // Input/Output Ports initialization ; 0000 02FB // Port A initialization ; 0000 02FC // Func2=In Func1=In Func0=In ; 0000 02FD // State2=P State1=T State0=T ; 0000 02FE PORTA=0x04; ;PCODE: $00000210 VOL: 0 ;PCODE: $00000211 VOL: 0 ; 0000 02FF DDRA=0x00; ;PCODE: $00000212 VOL: 0 ;PCODE: $00000213 VOL: 0 ; 0000 0300 ; 0000 0301 // Port B initialization ; 0000 0302 // Function: Bit7=Out Bit6=Out Bit5=In Bit4=Out Bit3=In Bit2=Out Bit1=In Bit0=Out ; 0000 0303 //DDRB=(1< ; 0000 03F8 // if ((dataGPS==0x0A)&&(timeout_T0==0)) //если приняли последний символ пакета ; 0000 03F9 // { //и таймер кончился, выходим отсюда (для подстраховки) ; 0000 03FA // //flag_GPS=0; //перенесено в rfSend_GPS для анализа начала нового пакета с символа "$", ; 0000 03FB // break; //здесь теряет первый символ начала пакета ; 0000 03FC // }; ; 0000 03FD ; 0000 03FE ; 0000 03FF // if ((dataGPS==0x0A)&&(timeout_T0==0)) //если приняли последний символ пакета ; 0000 0400 // { //и таймер кончился, выходим отсюда ; 0000 0401 // flag_GPS=0; //в rfSend_GPS для анализа начала нового пакета с символа "$" ; 0000 0402 // //break; ; 0000 0403 // }; ; 0000 0404 ; 0000 0405 //if (!timeout_T0) break; //если время ожидания данных закончилось, выходим из цикла ; 0000 0406 // if ((dataGPS==0x0A)&& flag_delay) //если приняли последний символ пакета ; 0000 0407 // { //и таймер кончился, выходим отсюда ; 0000 0408 // flag_GPS=0; //в rfSend_GPS для анализа начала нового пакета с символа "$" ; 0000 0409 // break; ; 0000 040A // }; ; 0000 040B ; 0000 040C // if ((dataGPS==0x0A)&&((flag_2s_10s==0)&& flag_delay)) //если приняли последний символ пакета ; 0000 040D // { //и таймер кончился, выходим отсюда ; 0000 040E // flag_GPS=0; //в rfSend_GPS для анализа начала нового пакета с символа "$" ; 0000 040F // break; ; 0000 0410 // }; ; 0000 0411 ; 0000 0412 //if ((dataGPS==0x0A)&&(flag_1s==1)) {//если равно и таймер кончился, можно выходить отсюда ; 0000 0413 //PORTD.4^=1; //пикаем для теста ; 0000 0414 //FIFOReset(); //Disable,Enable FIFO, сброс буфера ; 0000 0415 // delay_ms(350); ; 0000 0416 ***************************************************/ ; 0000 0417 ; 0000 0418 /*********** ; 0000 0419 //режим полёта, TX постоянно =================================================================== ; 0000 041A while (PIND.5==1 && flag_delay==0) { ; 0000 041B rfSend_GPS(); //крутимся здесь, пока не закончится время задержки (10мин) ; 0000 041C }; ; 0000 041D ************/ ; 0000 041E ; 0000 041F //=== режем приёма между пакетами GPS, и режим передачи раз в 10(7)сек ============================ ; 0000 0420 //ожидание RX UART и режим приёма RF RX flag_TickCounter_rfTX=1; ; 0000 0421 //выполняем цикл, если буфер RX UART пустой или таймер истёк ; 0000 0422 ; 0000 0423 if (flag_delay && (flag_TickCounter_rfTX==0)) { //&& (flag_GPS==0) наверно нужен ;PCODE: $00000267 VOL: 0 ;PCODE: $00000268 VOL: 0 ;PCODE: $00000269 VOL: 0 ;PCODE: $0000026A VOL: 0 ;PCODE: $0000026B VOL: 0 ;PCODE: $0000026C VOL: 0 ;PCODE: $0000026D VOL: 0 ;PCODE: $0000026E VOL: 0 ;PCODE: $0000026F VOL: 0 ;PCODE: $00000270 VOL: 0 ; 0000 0424 TickCounter_rfTX++; ;PCODE: $00000271 VOL: 0 ; 0000 0425 if (TickCounter_rfTX == 6) { //6 если передано 5 пачек (6или7) ;PCODE: $00000272 VOL: 0 ;PCODE: $00000273 VOL: 0 ;PCODE: $00000274 VOL: 0 ; 0000 0426 //PORTB.0 ^=1; //для теста светодиод ; 0000 0427 flag_TickCounter_rfTX=1; ;PCODE: $00000275 VOL: 0 ;PCODE: $00000276 VOL: 0 ; 0000 0428 //TickTimer10s = 0; ; 0000 0429 //TickCounter_rfTX = 0; //обнуляем счётчик в прерывании таймера T1 ; 0000 042A }; ;PCODE: $00000277 VOL: 0 ; 0000 042B }; ;PCODE: $00000278 VOL: 0 ; 0000 042C //ждем приема байта while( ( UCSRA & ( 1 << RXC ) ) == 0 ); ; 0000 042D //UCSRA UDRE bit5 Data Register Empty (1< ;PCODE: $00000378 VOL: 0 ;PCODE: $00000379 VOL: 0 ;PCODE: $0000037A VOL: 0 ; 0000 04D9 flag_GPS=0; //в rfSend_GPS для анализа начала нового пакета с символа "$" ;PCODE: $0000037B VOL: 0 ;PCODE: $0000037C VOL: 0 ; 0000 04DA }; ;PCODE: $0000037D VOL: 0 ; 0000 04DB ; 0000 04DC //end_rfSend_GPS: //точка выхода ; 0000 04DD } ;PCODE: $0000037E VOL: 0 ;PCODE: $0000037F VOL: 0 ; ;//вариант 2 ;/* ;void rfSend_GPS(void) //передача байта GPS с UART ;{ ;// while (flag_1s==0) { ;//if (flag_1s==0) { ; dataGPS = getchar_Tout(); ;// }; ; if ((dataGPS=='$')||(flag_GPS==1)) { ; //goto end_rfSend_GPS; ; //dataGPS = 0; ; flag_GPS=1; ; //writeCmd(0x8239); //вкл. передатчик TX ; //FSK=0; //выкл. перед. регистр (0-вкл. приёмного региста) ; FSK=1; //1-вкл. перед. регистр ; writeCmd(0x0000);//читать регистр состояния перед каждым кадром ; //FSK=1; //1-вкл. перед. регистр здесь не работает ; //writeCmd(0x8239); //вкл. передатчик TX ================================ ; ; LO(nSEL); // PORTB.4 SPI nSEL (chip select ENABLE) ; //FSK=1; //1-вкл. перед. регистр здесь не работает ; rfSend_Byte(0xB8); // вкл. Передающий регистр ; rfSend_Byte(0xAA); // PREAMBLE SYNC byte, рекомендованная длина 8бит-12бит ; //rfSend_Byte(0xAA); // SYNC byte, необязателен на скорости 14400 не успевает передавать ; //========= Шаблон действительных данных ; rfSend_Byte(0x2D); // SYNC HI byte ; rfSend_Byte(0xD6); // SYNC LOW byte, (D4) программируется ; //========= передача данных ; rfSend_Byte(dataGPS); // передача по радиоканалу ; //rfSend_Byte(0x0D); //CR (Carriage Return) ; //rfSend_Byte(0x0A); //LF (Line Feed) ; //========= конец данных ; //rfSend_Byte(ChkSum); // контрольная сумма ; rfSend_Byte(0x00); // DUMMY BYTES хорошо ; //rfSend_Byte(0xAA); // DUMMY BYTES плохо ; //delay_ms(1); ; FSK=0; //0-выкл. перед. регистр(вкл. приёмный регистр) ; HI(nSEL); //PORTB.4 SPI nSEL (chip select DISALBE) ; //===== передача окончена ; //LED_OFF(6); //выкл. усилитель, светодиод ; //end_rfSend_GPS: //точка выхода ; }; ;} ;*/ ; ; ;void rfSend_K(char kb) //передача кода кнопки ; 0000 050E { ;PCODE: $00000380 VOL: 0 ;PCODE: $00000381 VOL: 0 ; 0000 050F bit flag_rx; ; 0000 0510 //char K1, K2; ; 0000 0511 //#asm("cli") // глобально запретить прерывания ; 0000 0512 //GIMSK=0x00; //запретить прерывания int1 ; 0000 0513 ; 0000 0514 //если был включен режим приёма(PIND.6=0), переключаемся на передачу ; 0000 0515 if (PIND.6==0) { ;PCODE: $00000382 VOL: 0 ; kb -> Y+0 ; flag_rx -> R15.0 ;PCODE: $00000383 VOL: 0 ;PCODE: $00000384 VOL: 0 ;PCODE: $00000385 VOL: 0 ; 0000 0516 flag_rx=1; //запоминаем, какой был режим до переключения ;PCODE: $00000386 VOL: 0 ;PCODE: $00000387 VOL: 0 ;PCODE: $00000388 VOL: 0 ; 0000 0517 LED_ON(6); //вкл. светодиод и усилитель мощности (PIND.6==1) ;PCODE: $00000389 VOL: 0 ;PCODE: $0000038A VOL: 0 ; 0000 0518 //FSK=1; //1-вкл. перед. регистр ; 0000 0519 writeCmd(0x8239); //вкл. передатчик TX ;PCODE: $0000038B VOL: 0 ;PCODE: $0000038C VOL: 0 ; 0000 051A }; ;PCODE: $0000038D VOL: 0 ; 0000 051B FSK=1; //1-вкл. перед. регистр ;PCODE: $0000038E VOL: 0 ;PCODE: $0000038F VOL: 0 ; 0000 051C writeCmd(0x0000);//читать(сбрасывать) регистр состояния перед каждым кадром ;PCODE: $00000390 VOL: 0 ;PCODE: $00000391 VOL: 0 ;PCODE: $00000392 VOL: 0 ; 0000 051D LO(nSEL); // PORTB.4 SPI nSEL (chip select ENABLE) ;PCODE: $00000393 VOL: 0 ;PCODE: $00000394 VOL: 0 ; 0000 051E ; 0000 051F rfSend_Byte(0xB8); // вкл. Передающий регистр ;PCODE: $00000395 VOL: 0 ;PCODE: $00000396 VOL: 0 ; 0000 0520 rfSend_Byte(0xAA); // PREAMBLE SYNC byte, рекомендованная длина 8бит-12бит ;PCODE: $00000397 VOL: 0 ;PCODE: $00000398 VOL: 0 ; 0000 0521 //rfSend_Byte(0xAA); // SYNC byte, необязателен ; 0000 0522 //========= Шаблон действительных данных ; 0000 0523 rfSend_Byte(0x2D); // SYNC HI byte ;PCODE: $00000399 VOL: 0 ;PCODE: $0000039A VOL: 0 ; 0000 0524 rfSend_Byte(0xD6); // SYNC LOW byte, (D4) программируется ;PCODE: $0000039B VOL: 0 ;PCODE: $0000039C VOL: 0 ; 0000 0525 //========= передача данных ; 0000 0526 rfSend_Byte(knb); // передача символа кнопки ;PCODE: $0000039D VOL: 0 ;PCODE: $0000039E VOL: 0 ;PCODE: $0000039F VOL: 0 ;PCODE: $000003A0 VOL: 0 ; 0000 0527 if (kb==1) { ;PCODE: $000003A1 VOL: 0 ;PCODE: $000003A2 VOL: 0 ;PCODE: $000003A3 VOL: 0 ; 0000 0528 rfSend_Byte(k1b1); // передача byte1 кнопки1 ;PCODE: $000003A4 VOL: 0 ;PCODE: $000003A5 VOL: 0 ;PCODE: $000003A6 VOL: 0 ;PCODE: $000003A7 VOL: 0 ; 0000 0529 rfSend_Byte(k1b2); // передача byte2 ;PCODE: $000003A8 VOL: 0 ;PCODE: $000003A9 VOL: 0 ;PCODE: $000003AA VOL: 0 ;PCODE: $000003AB VOL: 0 ; 0000 052A rfSend_Byte(k1b3); // передача byte3 ;PCODE: $000003AC VOL: 0 ;PCODE: $000003AD VOL: 0 ;PCODE: $000003AE VOL: 0 ;PCODE: $000003AF VOL: 0 ; 0000 052B rfSend_Byte(k1b4); // передача byte4 ;PCODE: $000003B0 VOL: 0 ;PCODE: $000003B1 VOL: 0 ;PCODE: $000003B2 VOL: 0 ;PCODE: $000003B3 VOL: 0 ; 0000 052C //rfSend_Byte(k1b5); // передача byte5 ; 0000 052D //rfSend_Byte(codeK1); // передача codeK1 кнопки1 ; 0000 052E }; ;PCODE: $000003B4 VOL: 0 ; 0000 052F ; 0000 0530 // if (kb==2) { ; 0000 0531 // rfSend_Byte(k2b1); // передача byte1 кнопки2 ; 0000 0532 // rfSend_Byte(k2b2); // передача byte2 ; 0000 0533 // rfSend_Byte(k2b3); // передача byte3 ; 0000 0534 // rfSend_Byte(k2b4); // передача byte4 ; 0000 0535 // //rfSend_Byte(k2b5); // передача byte5 ; 0000 0536 // //rfSend_Byte(codeK2); // передача codeK2 кнопки2 ; 0000 0537 // }; ; 0000 0538 //========= конец данных ; 0000 0539 rfSend_Byte(0x00); // DUMMY BYTES ;PCODE: $000003B5 VOL: 0 ;PCODE: $000003B6 VOL: 0 ; 0000 053A //rfSend_Byte(0xAA); // DUMMY BYTES ; 0000 053B FSK=0; //0-выкл.перед.регистр, вкл. приёмный регистр ;PCODE: $000003B7 VOL: 0 ;PCODE: $000003B8 VOL: 0 ; 0000 053C HI(nSEL); //PORTB.4 SPI nSEL (chip select DISALBE) ;PCODE: $000003B9 VOL: 0 ;PCODE: $000003BA VOL: 0 ; 0000 053D delay_ms(10); ;PCODE: $000003BB VOL: 0 ;PCODE: $000003BC VOL: 0 ;PCODE: $000003BD VOL: 0 ; 0000 053E //===== передача окончена ; 0000 053F //=== режем приёма =========================== ; 0000 0540 if (flag_rx==1) { //восстанавливаем режим, который был до переключения ;PCODE: $000003BE VOL: 0 ;PCODE: $000003BF VOL: 0 ;PCODE: $000003C0 VOL: 0 ; 0000 0541 writeCmd(0x82D9); //вкл. приёмник RX ;PCODE: $000003C1 VOL: 0 ;PCODE: $000003C2 VOL: 0 ; 0000 0542 LED_OFF(6); //выкл. усилитель мощности и светодиод, вкл ант. усилитель ;PCODE: $000003C3 VOL: 0 ;PCODE: $000003C4 VOL: 0 ; 0000 0543 } ; 0000 0544 //#asm("sei")// глобально разрешить прерывания ; 0000 0545 //GIMSK=0x80; //разрешить прерывания int1 ; 0000 0546 } ;PCODE: $000003C5 VOL: 0 ;PCODE: $000003C6 VOL: 0 ;PCODE: $000003C7 VOL: 0 ;PCODE: $000003C8 VOL: 0 ; ; ; ; ;//========== МУСОР =============//////////////////////////////////////////////////////////////// ;/* ;код для приёмника, режим передачи кнопки для RX ;ChkSum=0; ;writeCmd(0x0000);//читать регистр состояния перед каждым кадром ;LO(nSEL); // PORTB.4 SPI nSEL (chip select ENABLE) ;rfSend_Byte(0xB8); // вкл. Передающий регистр ;rfSend_Byte(0xAA); // PREAMBLE SYNC byte ;rfSend_Byte(0xAA); // SYNC byte ; //rfSend_Byte(0xAA); // SYNC byte для GPS не нужна ;//========= Шаблон действительных данных ;rfSend_Byte(0x2D); // SYNC HI byte ;rfSend_Byte(0xD4); // SYNC LOW byte ;//========= передача данных ;rfSend_Byte(b1); //data byte1 ;ChkSum+=b1; ;rfSend_Byte(b2); //data byte2 ;ChkSum+=b2; ;rfSend_Byte(b3); //data byte3 ;ChkSum+=b3; ;rfSend_Byte(b4); //data byte4 ;ChkSum+=b4; ;rfSend_Byte(b5); //data byte5 ;ChkSum+=b5; ;rfSend_Byte(b6); //data byte6 ;ChkSum+=b6; ;rfSend_Byte(b7); //data byte7 ;ChkSum+=b7; ;rfSend_Byte(b8); //data byte8 ;ChkSum+=b8; ;rfSend_Byte(ChkSum); //передача контрольной суммы ;//========= конец данных ;rfSend_Byte(0x00); // DUMMY BYTES хорошо ; //rfSend_Byte(0xAA); // DUMMY BYTES плохо ;HI(nSEL); //PORTB.4 SPI nSEL (chip select DISALBE) ; ; ; ; ;#asm("nop") // Пауза в 1 такт процессора ;============================================= ;void Check_JumperT1(void) //здесь будем проверять перемычку на разрешение запуска таймера ;{ //проверку перемычки можно перенести в прерывание ; if((PIND.5==1)&&(flag_start_T1==0)){ ; TCCR1B=0x0C; //start timer ; flag_start_T1=1; //больше не проверяем ; }; ;} ;============================================== ; ; if (flag_TX) { ; LED_ON(6); //вкл. светодиод и усилитель мощности ; writeCmd(0x8238); //вкл. передатчик TX ; //flag_delay==1 ; while(flag_TX && PIND.5==1 || flag_delay==0 || flag5s_Timer==1) { ; ; dataGPS = getchar_Tout(); ; writeCmd(0x0000);//читать регистр состояния перед каждым кадром ; LO(nSEL); // PORTB.4 SPI nSEL (chip select ENABLE) ; rfSend_Byte(0xB8); // вкл. Передающий регистр ; rfSend_Byte(0xAA); // PREAMBLE SYNC byte ; rfSend_Byte(0xAA); // SYNC byte ; //rfSend_Byte(0xAA); // SYNC byte для GPS не нужна ; //========= Шаблон действительных данных ; rfSend_Byte(0x2D); // SYNC HI byte ; rfSend_Byte(0xD4); // SYNC LOW byte ; //========= передача данных ; rfSend_Byte(dataGPS); // передача по радиоканалу ; //rfSend_Byte(0x0D); //CR (Carriage Return) ; //rfSend_Byte(0x0A); //LF (Line Feed) ; //========= конец данных ; //rfSend_Byte(ChkSum); // контрольная сумма ; rfSend_Byte(0x00); // DUMMY BYTES хорошо ; //rfSend_Byte(0xAA); // DUMMY BYTES плохо ; HI(nSEL); //PORTB.4 SPI nSEL (chip select DISALBE) ; //===== передача окончена ; //LED_OFF(6); //выкл. усилитель, светодиод ; }; ; writeCmd(0x82D9); //вкл. приёмник RX ; LED_OFF(6); //выкл. усилитель и светодиод ; }; ; ; //////////////////////////////////////////////////////////// ; if (flag_delay) //если задержка кончилась, формируем паузы ; { ; //============= вариант 1 ===================================== ; ;// if (flag_5s && flag_stop2s==0) { //2sec + 8сек пауза ;// TickTimer2s++; ;// flag_2s_10s=1; ;// if (TickTimer2s == 3) { //2-передача 1сек, 3-передача 2сек ;// flag_2s_10s=0; ;// flag_stop2s=1; ;// TickTimer2s = 0; //обнуляем через 2сек ;// }; ;// ;// }; ;// ;// if (flag_5s==0) { ;// flag_stop2s=0; ;// //flag_2s=0; ;// }; ; //============= вариант 2 ===================================== ; if (flag_5s && TickTimer2s < 3) { //2: 2сек передача + 8сек пауза ; TickTimer2s++; //3: 3сек передача + 7сек пауза ; flag_2s_10s=1; //3сек передача ("1"), 7сек приём ("0") ; } ; else { ; flag_2s_10s=0; ; if (flag_5s==0) TickTimer2s=0; ; }; ; }; ; ; ;*/