#include #include //////////////////////////////////////////////////////////////////////////////////////////// // ATmega128: // RC -8 МHz; //////////////////////////////////////////////////////////////////////////////////////////// // nRF24L01: преамбула -1, адрес -5, Data -32, CRC16 -2 // скорость: 250kbps; 0,001.280с. // 32 пак/c. цикл 0,031.25c. //////////////////////////////////////////////////////////////////////////////////////////// // OLED 1: SSD1309 // OLED 2: SH1106 //////////////////////////////////////////////////////////////////////////////////////////// // Data пульт // IP/частота/мощность/кнопки/кнопки1/обдув/помпа/0/ //8 // АЦП/АЦП1/АЦП2/АЦП3/АЦП4/АЦП5/АЦП6/АЦП7 //8 // kor0/kor1/kor2/kor3/kor4/kor5/kor6/kor7 //8 // 0/0/0/0/0/0/CRC16/CRC16 //8 // IP - модель: 0...255 -начальное 1 // ch - частота: 2.400GHz...2.525GHz. (0)...(125) -начальное 0 // pw - мощность: TX -11 10 01 00 -начальное 3 // k - кнопки: // (.......1) 0- меню вниз // (......1.) 1- меню + // (.....1..) 2- меню - // (....1...) 3- меню вверх // (...1....) 4- Нагрузка // (..1.....) 5- Нагрузка // (.1......) 6- Нагрузка // (1.......) 7- Нагрузка // kn - кнопки1: // (.......1) 0- // (......1.) 1- // (.....1..) 2- // (....1...) 3- // (...1....) 4- без фиксации // (..1.....) 5- без фиксации // (.1......) 6- без фиксации // (1.......) 7- // obduv - обдув: // (.......1) 0- // (......1.) 1- // (.....1..) 2- // (....1...) 3- // (...1....) 4- // (..1.....) 5- // (.1......) 6- обдув // (1.......) 7- обдув1 // pompa - помпа: // (.......1) 0- // (......1.) 1- // (.....1..) 2- // (....1...) 3- // (...1....) 4- // (..1.....) 5- помпа // (.1......) 6- // (1.......) 7- // - : // u - АЦП: 0...255 MOTOR 1 // u1 - АЦП1: 0...255 Руль // u2 - АЦП2: 0...255 MOTOR 2 // u3 - АЦП3: 0...255 BUNKER_L // u4 - АЦП4: 0...255 ШИМ 3 // u5 - АЦП5: 0...255 BUNKER_R // u6 - АЦП6: 0...255 // u7 - АЦП7: 0...255 // kor0: 0...255 // kor1: 0...255 // kor2: 0...255 // kor4: 0...255 // kor5: 0...255 // kor6: 0...255 // kor7: 0...255 // - : // - : // - : // - : // - : // - : // CRC16 // CRC16 //////////////////////////////////////////////////////////////////////////////////////////// // Data модель // IP/вода/температура/температура1/температура2/температура3/0/0 //8 // АЦП/АЦП1/АЦП2/АЦП3/АЦП4/АЦП5/АЦП6/АЦП7 //8 // _0/_1/_2/_3/_4/_5/_6/_7 //8 // 0/0/0/0/0/0/CRC16/CRC16 //8 // IP - модель: 0...255 -начальное 1 // v - вода: // (.......1) 1 - вода модель // (......1.) 1 - // (.....1..) 1 - // (....1...) 1 - // (...1....) 1 - // (..1.....) 1 - // (.1......) 1 - // (1.......) 1 - // t - температура: ds18b20: 0 C^...128 C^(начальное 85 C^ - 01010101) // t1 - температура1: ds18b20: 0 C^...128 C^(начальное 85 C^ - 01010101) // t2 - температура2: ds18b20: 0 C^...128 C^(начальное 85 C^ - 01010101) // t3 - температура3: ds18b20: 0 C^...128 C^(начальное 85 C^ - 01010101) // - : // - : // u - АЦП: 0...255 g -аккум модель // u1 - АЦП1: 0...255 BUNKER_L // u2 - АЦП2: 0...255 BUNKER_R // u3 - АЦП3: 0...255 // u4 - АЦП4: 0...255 // u5 - АЦП5: 0...255 // u6 - АЦП6: 0...255 // u7 - АЦП7: 0...255 // ASCII _0: 0...255 // ASCII _1: 0...255 // ASCII _2: 0...255 // ASCII _4: 0...255 // ASCII _5: 0...255 // ASCII _6: 0...255 // ASCII _7: 0...255 // - : // - : // - : // - : // - : // - : // CRC16 // CRC16 //////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////// crc unsigned int crc; // crc unsigned int bcrc; // crc буфер /////////////////////////////////////////////// счёт unsigned int a; // a - счёт unsigned int b; // b - счёт unsigned char x; // x - счёт unsigned char z; // z - счёт /////////////////////////////////////////////// связь unsigned char IP = 1; // IP модель -начальное 1 unsigned char ch; // частота запроса unsigned char chb; // частота буфер // 2.400GHz. (0) - вызывной канал unsigned char pw; // мощность unsigned char pwb; // буфер мощность /////////////////// цикл unsigned int c; // с - цикл //////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////// пульт /////////////////// кнопки unsigned char k; // кнопки /////////////////// /////////////////// кнопки2/обдув unsigned char kn; /////////////////// ШИМ //unsigned int w1; // ШИМ1 //unsigned int w2; // ШИМ2 //unsigned int w3; // ШИМ3 /////////////////// /////////////////// обдув unsigned char obduv; // обдув /////////////////// помпа unsigned char pompa; // помпа /////////////////// kor unsigned char kor0 = 128; // АЦП / MOTOR L PF 0 > PB5 unsigned char kor1 = 128; // АЦП1 / РУЛЬ PF 1 > PE5 unsigned char kor2 = 128; // АЦП2 / MOTOR R PF 2 > PB6 unsigned char kor3 = 128; // АЦП3 / SERVO L PF 3 > PE3 unsigned char kor4 = 128; // АЦП4 / ШИМ 3 PF 4 > PB7 unsigned char kor5 = 128; // АЦП5 / SERVO R PF 5 > PE4 unsigned char kor6 = 128; // АЦП6 unsigned char kor7 = 128; // АЦП7 //////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////// модель unsigned char bufer[64]={// буфер модель 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 32 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 // 32 }; /////////////////// unsigned char v; // вода модель unsigned char t; // температура модель unsigned char t1; // температура1 модель unsigned char t2; // температура2 модель unsigned char t3; // температура3 модель /////////////////// АЦП unsigned int u; // АЦП unsigned int ub; // буфер АЦП unsigned int u1; // АЦП1 unsigned int ub1; // буфер АЦП1 unsigned int u2; // АЦП2 unsigned int ub2; // буфер АЦП2 unsigned int u3; // АЦП3 unsigned int ub3; // буфер АЦП3 unsigned int u4; // АЦП4 unsigned int ub4; // буфер АЦП4 unsigned int u5; // АЦП5 unsigned int ub5; // буфер АЦП5 unsigned int u6; // АЦП6 unsigned int ub6; // буфер АЦП6 unsigned int u7; // АЦП7 unsigned int ub7; // буфер АЦП7 /////////////////// АЦП: -0,000.070c void adc(unsigned char adc_input) { ADMUX = 0b01000000 | adc_input; // опорное AVCC // ADC0...ADC7 delay_us(10); ADCSRA|=0b01000000; while (ADCSRA & 0b01000000); } //////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////// серво 0,1,2,3,4,5,6,7: unsigned int servo[8]={128,128,128,128,128,128,128,128}; unsigned int servo_b; // буфер //unsigned char mux; // MUX //////////////////////////////////////////////// серво: // Timer 1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) // совпадения TCNT1 и OCR1A // { //PORTD.1=1; // контроль servo_b = (servo[0]*4)+862+kor0; // АЦП / MOTOR 1 PF 0 > PB5 // kor0 (0...255) OCR1AH=(servo_b>>8); OCR1AL=servo_b; //PORTD.1=0; // контроль } // Timer 1 output compare B interrupt service routine interrupt [TIM1_COMPB] void timer1_compb_isr(void) { //PORTD.1=1; // контроль servo_b = (servo[2]*4)+862+kor2; // АЦП2 / MOTOR 2 PF 2 > PB6 // kor2 (0...255) OCR1BH=(servo_b>>8); OCR1BL=servo_b; //PORTD.1=0; // контроль } // Timer 3 output compare C interrupt service routine interrupt [TIM1_COMPC] void timer1_compc_isr(void) { //PORTD.1=1; // контроль servo_b = (servo[4]*4)+862+kor4; // АЦП4 / ШИМ 3 PF 4 > PB7 // kor4 (0...255) OCR1CH=(servo_b>>8); OCR1CL=servo_b; //PORTD.1=0; // контроль } //////////////////////////////////////////////// // Timer 3 output compare A interrupt service routine interrupt [TIM3_COMPA] void timer3_compa_isr(void) // совпадения TCNT3 и OCR3A // { //PORTD.1=1; // контроль /* // MUX servo_b = (servo[mux]*2)+495; OCR3AH=(servo_b>>8); OCR3AL=servo_b; PORTA = mux; mux++; if (mux > 7) {mux=0;}; */ servo_b = (servo[3]*4)+862+kor3; // АЦП3 / SERVO 1 PF 3 > PE3 // kor3 (0...255) OCR3AH=(servo_b>>8); OCR3AL=servo_b; //PORTD.1=0; // контроль } // Timer 3 output compare B interrupt service routine interrupt [TIM3_COMPB] void timer3_compb_isr(void) { //PORTD.1=1; // контроль servo_b = (servo[5]*4)+862+kor5; // АЦП5 / SERVO 3 PF 5 > PE4 // kor5 (0...255) OCR3BH=(servo_b>>8); OCR3BL=servo_b; //PORTD.1=0; // контроль } // Timer 3 output compare C interrupt service routine interrupt [TIM3_COMPC] void timer3_compc_isr(void) { //PORTD.1=1; // контроль servo_b = (servo[1]*4)+862+kor1; // АЦП1 / РУЛЬ PF 1 > PE5 // kor1 (0...255) OCR3CH=(servo_b>>8); OCR3CL=servo_b; //PORTD.1=0; // контроль } //////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////// выгруз -0.000.015c /* interrupt [TIM3_OVF] void timer3_ovf_isr(void)// выгруз -переполнение TCNT3 // { PORTD.0=1; // контроль PORTD.0=0; // контроль } */ //////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// fcrc: void fcrc(void) { crc ^= bcrc; for( a = 0; a < 16; a++ ){ if (crc & 0x8000) crc = ( crc << 1 ) ^ 0x1021; // CRC-16-CCITT // 0x1021 else crc = crc << 1; }; } //////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// DS18B20: unsigned char sd; // счёт DS18B20 // преобразования: 1 преобразование/2с. unsigned char t_; // буфер DS18B20 unsigned int bufer_t; // буфер -начальное DS18B20 85,00 unsigned char DS18B20[9]={ 0,// 0 - Температура LSB 0,// 1 - Температура MSB 0,// 2 - TH 0,// 3 - TL 0,// 4 - конфигурация 0,// 5 - FF 0,// 6 - 0C 0,// 7 - 10 0 // 8 - CRC }; unsigned char wcrc; // crc (DS18B20) unsigned char wbcrc; // буфер crc (DS18B20) unsigned char mask; // wt/wr ////////////////////////////////////////////////////////////// fwcrc (TX/RX DS18B20): void fwcrc(void) { wcrc ^= wbcrc; // CRC-8-Dallas/Maxim // 0x31 ~ 0x8C for (z=0;z<8;z++) { wcrc = wcrc & 0x01 ? ( wcrc >> 1 ) ^ 0x8C : wcrc >> 1; }; } ///////////////////////////////////////////////////// передача wt (1-Wire-DS18B20): void wt(void) { mask=0b00000001; do { DDRC.0=0; // отпустить delay_us(4); DDRC.0=1; // прижать delay_us(4); if (t_ & mask) DDRC.0=0; // Data TX mask=(mask<<1); delay_us(80); } while (mask); DDRC.0=0; // отпустить } ///////////////////////////////////////////////////////////// приём wr (RX DS18B20): void wr(void) { mask=0b00000001; t_=0; do { DDRC.0=1; // прижать delay_us(4); DDRC.0=0; // отпустить delay_us(4); if (PINC.0) t_ |= mask; // Data RX mask=(mask<<1); delay_us(80); } while (mask); DDRC.0=0; // отпустить } ///////////////////////////////////////////////////// передача wt1 (1-Wire-DS18B20): void wt1(void) { mask=0b00000001; do { DDRC.1=0; // отпустить delay_us(4); DDRC.1=1; // прижать delay_us(4); if (t_ & mask) DDRC.1=0; // Data TX mask=(mask<<1); delay_us(80); } while (mask); DDRC.1=0; // отпустить } ///////////////////////////////////////////////////////////// приём wr1 (RX DS18B20): void wr1(void) { mask=0b00000001; t_=0; do { DDRC.1=1; // прижать delay_us(4); DDRC.1=0; // отпустить delay_us(4); if (PINC.1) t_ |= mask; // Data RX mask=(mask<<1); delay_us(80); } while (mask); DDRC.1=0; // отпустить } ///////////////////////////////////////////////////// передача wt2 (1-Wire-DS18B20): void wt2(void) { mask=0b00000001; do { DDRC.2=0; // отпустить delay_us(4); DDRC.2=1; // прижать delay_us(4); if (t_ & mask) DDRC.2=0; // Data TX mask=(mask<<1); delay_us(80); } while (mask); DDRC.2=0; // отпустить } ///////////////////////////////////////////////////////////// приём wr2 (RX DS18B20): void wr2(void) { mask=0b00000001; t_=0; do { DDRC.2=1; // прижать delay_us(4); DDRC.2=0; // отпустить delay_us(4); if (PINC.2) t_ |= mask; // Data RX mask=(mask<<1); delay_us(80); } while (mask); DDRC.2=0; // отпустить } ///////////////////////////////////////////////////// передача wt3 (1-Wire-DS18B20): void wt3(void) { mask=0b00000001; do { DDRC.3=0; // отпустить delay_us(4); DDRC.3=1; // прижать delay_us(4); if (t_ & mask) DDRC.3=0; // Data TX mask=(mask<<1); delay_us(80); } while (mask); DDRC.3=0; // отпустить } ///////////////////////////////////////////////////////////// приём wr3 (RX DS18B20): void wr3(void) { mask=0b00000001; t_=0; do { DDRC.3=1; // прижать delay_us(4); DDRC.3=0; // отпустить delay_us(4); if (PINC.3) t_ |= mask; // Data RX mask=(mask<<1); delay_us(80); } while (mask); DDRC.3=0; // отпустить } //////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// GPS: //unsigned char st_bufer_GPS; // счёт буфер GPS -начальное 0 unsigned char bufer_GPS[80]={ // протокол NMEA 0183 -маскимальная длина 82 //M8N (0) "$GNGGA,181547.000,4911.6021,N,02650.2441,E,1,10,1.0,377.6,M,0.0,M,,*73........." //-70 //m8n (1) //"$GNGGA,185759.00,4911.60694,N,02650.23747,E,1,05,8.73,339.8,M,31.6,M,,*4D......"//-73 }; //////////////////////////////////////////////////////////////// GPS_radio unsigned char flag_GPS_radio; // флаг GPS radio полный //////////////////////////////////////////////////////////////// USART0 RX > GPS: unsigned char filtr_GPS[]={"$GNGGA"}; // фильтр GPS "$GNGGA" unsigned char st_filtr_GPS; // счёт фильтр GPS unsigned char st_GPS = 6; // счёт GPS unsigned char flag_GPS; // флаг GPS interrupt [USART0_RXC] void usart0_rx_isr(void) // -0,000.018c { //PORTD.1=1; // контроль //////////////////////// буфер GPS if (flag_GPS) { bufer_GPS[st_GPS] = UDR0; // буфер GPS st_GPS++; // счёт GPS if (st_GPS > 73) { // протокол NMEA 0183 -маскимальная длина 82 flag_GPS = 0; // флаг GPS flag_GPS_radio = 1; // флаг GPS radio полный //flag3_GPS = 1; // флаг3 GPS полный st_GPS = 6; // счёт GPS UCSR0B=0x00; // USART0 //PORTD.0=0; // контроль }; } ///////////////////////// фильтр GPS else { bufer_GPS[st_filtr_GPS] = UDR0; if (bufer_GPS[st_filtr_GPS] == filtr_GPS[st_filtr_GPS]) { st_filtr_GPS++; // счёт фильтр GPS if (st_filtr_GPS == 6) { st_filtr_GPS = 0; flag_GPS = 1; // флаг GPS //PORTD.0=1; // контроль }; } else { st_filtr_GPS = 0; // счёт фильтр GPS }; }; ///////////////////////// //PORTD.1=0; // контроль } //////////////////////////////////////////////////////////////////////////////////////////// /* /////////////////////////////////////////////// Тахометр: unsigned char ftax; // флаг Тахометр unsigned int stax; // счётчик Тахометр unsigned int atax; // ФНЧ Тахометр unsigned int Dtax; // Data Тахометр unsigned char tax; // тахометр модель unsigned int taxb; // буфер тахометр модель unsigned int Dtaxb; // буфер Data Тахометр /////////////////////////////////////////////// Тахометр: -0,000.009c interrupt [TIM0_OVF] void timer0_ovf_isr(void) // 4.000.000/256=15.625 цикл { PORTD.0=1; // контроль stax++; // stax - счётчик Тахометр if ( (PIND.5==1) && (ftax==0) ) { ftax=1; // ftax - флаг Тахометр atax++; // atax - ФНЧ Тахометр }; if (PIND.5==0) { ftax=0; // сброс ftax - флаг Тахометр }; if (stax==15625) { // счётчик Тахометр 4.000.000/256=15.625 stax=0; // сброс счётчик Тахометр Dtax=atax; // Data Тахометр = ФНЧ Тахометр atax=0; // сброс ФНЧ Тахометр }; PORTD.0=0; // контроль } */ //////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// void main(void) { /////////////////////////////////////////////////////////////////// инициализация: //DDRG=0x1F; // индикатор/бузер/драйвер. //PORTG=0x00; // индикатор/бузер/драйвер. ////////////////////////////////////////////// индикатор: //PORTG |= 0b00010000; // вода модель /температура 40-50-60-70 /защита аккумов ////////////////////////////////////////////// бузер: //PORTG |= 0b00001000; // бузер ////////////////////////////////////////////// delay_ms(500); // стаб ////////////////////////////////////////////// SPI: DDRB.1=1; // SCK PORTB.1=1; // SCK (+)(!)-слейв DDRB.3=0; // MISO PORTB.3=0; // MISO DDRB.2=1; // MOSI PORTB.2=0; // MOSI DDRB.0=1; // SS (CSN nRF24L01+) PORTB.0=1; // SS (CSN+ nRF24L01+) ////////////////////////////////////////////// nRF24L01+: DDRB.4=1; // CE nRF24L01+ PORTB.4=0; // CE nRF24L01+ ////////////////////////////////////////////// MUX серво: //DDRA=0xFF; //PORTA=0x00; ////////////////////////////////////////////// кнопки: DDRA.0=1; // PORTA.0=0; // DDRA.1=1; // PORTA.1=0; // DDRA.2=1; // PORTA.2=0; // DDRA.3=1; // PORTA.3=0; // DDRA.4=1; // PORTA.4=0; // DDRA.5=1; // помпа PORTA.5=0; // помпа DDRA.6=1; // обдув PORTA.6=0; // обдув DDRA.7=1; // обдув1 PORTA.7=0; // обдув1 ////////////////////////////////////////////// датчики: //DDRC.0=0; // температура //PORTC.0=0; // температура /////////////////////// //DDRC.1=0; // температура1 //PORTC.1=0; // температура1 /////////////////////// //DDRC.2=0; // температура2 //PORTC.2=0; // температура2 ////////////////////// //DDRC.3=0; // температура3 //PORTC.3=0; // температура3 ////////////////////////////////////////////// кнопки: DDRC.4=1; // Нагрузка PORTC.4=0; // Нагрузка DDRC.5=1; // Нагрузка PORTC.5=0; // Нагрузка DDRC.6=1; // Нагрузка PORTC.6=0; // Нагрузка DDRC.7=1; // Нагрузка PORTC.7=0; // Нагрузка ////////////////////////////////////////////// контроль: DDRD.0=1; // контроль PORTD.0=0; // контроль DDRD.1=1; // контроль PORTD.1=0; // контроль DDRD.2=0; // контроль CRC PORTD.2=1; // контроль CRC //DDRD.3=0; // контроль //PORTD.3=1; // контроль ////////////////////////////////////////////// кнопки1: DDRD.4=1; // Нагрузка PORTD.4=0; // Нагрузка DDRD.5=1; // Нагрузка PORTD.5=0; // Нагрузка DDRD.6=1; // Нагрузка PORTD.6=0; // Нагрузка ////////////////////////////////////////////// вода: DDRD.7=0; // вода PORTD.7=1; // вода //////////////////////////////////////////////////////////////////////////////////////////// /* ////////////////////////////////////////////// таймер № 1 - ШИМ 1,2,3 DDRB.5=0; // ШИМ 1 (OC1A) PORTB.5=0; // ШИМ 1 (OC1A) //DDRB.6=0; // ШИМ 2 (OC1B) //PORTB.6=0; // ШИМ 2 (OC1B) //DDRB.7=0; // ШИМ 3 (OC1C) //PORTB.7=0; // ШИМ 3 (OC1C) ///////////////////////// OCR1A=0; // (OC1A) OCR1B=0; // (OC1B) OCR1CH=0; // (OC1C) OCR1CL=0; // (OC1C) ICR1=254; // 8 МГц/254=31.496 Hz TCCR1A=0b10101010; // быстрая ШИМ //вкл.(OC1A)/вкл.(OC1B)/вкл.(OC1C) TCCR1B=0b00011001; // 8 МГц/254=31.496 Hz */ ////////////////////////////////////////////// таймер № 1 - серво 1,2,3 DDRB.5=1; // (OC1A) PORTB.5=0; // (OC1A) DDRB.6=1; // (OC1B) PORTB.6=0; // (OC1B) DDRB.7=1; // (OC1C) PORTB.7=0; // (OC1C) ICR1H=0b01001110; // верхний предел 20.000 ICR1L=0b00100000; // 1.000.000 Hz/50 Hz = 20.000 = 1ms. 1 шаг = 4 us. OCR1AH=0b00000101; // серво -начальное 1500 = 1,5 mc (1...2) OCR1AL=0b11011100; // серво -начальное 1500 = 1,5 mc (1...2) OCR1BH=0b00000101; // серво -начальное 1500 = 1,5 mc (1...2) OCR1BL=0b11011100; // серво -начальное 1500 = 1,5 mc (1...2) OCR1CH=0b00000101; // серво -начальное 1500 = 1,5 mc (1...2) OCR1CL=0b11011100; // серво -начальное 1500 = 1,5 mc (1...2) TCCR1A=0b10101010; // быстрая ШИМ - OC1A,B,С - сброс при совпадении TCNT1 и OCR1A,B,С TCCR1B=0b00011010; // 8 МГц/8=1.000.000 Hz /* ////////////////////////////////////////////// таймер № 3 - серво // MUX DDRE.3=1; // (OC3A) PORTE.3=0; // (OC3A) //DDRE.4=1; // (OC3B) //PORTE.4=0; // (OC3B) //DDRE.5=1; // (OC3C) //PORTE.5=0; // (OC3C) ICR3H=0b00000100; // верхний предел 1250 ICR3L=0b11100010; // 500.000 Hz/50 Hz = 1250/8 имп = 1ms / 500 шаг. 1 шаг = 2 us. OCR3AH=0b00000010; // серво -начальное 750 = 1,5 mc (1...2) OCR3AL=0b11101110; // серво -начальное 750 = 1,5 mc (1...2) TCCR3A=0b10000010; // быстрая ШИМ - OC3A - сброс при совпадении TCNT3 и OCR3A TCCR3B=0b00011010; // 4 МГц/8=500.000 Hz ////////////////////////////////////////////// Маска прерывание таймер № 3: ETIMSK=0x14; // при совпадении TCNT3 и OCR3A / при переполнении 3 */ ////////////////////////////////////////////// таймер № 3 - серво 1,2,3 DDRE.3=1; // (OC3A) PORTE.3=0; // (OC3A) DDRE.4=1; // (OC3B) PORTE.4=0; // (OC3B) DDRE.5=1; // (OC3C) PORTE.5=0; // (OC3C) ICR3H=0b01001110; // верхний предел 20.000 ICR3L=0b00100000; // 1.000.000 Hz/50 Hz = 20.000 = 1ms. 1 шаг = 4 us. OCR3AH=0b00000101; // серво -начальное 1500 = 1,5 mc (1...2) OCR3AL=0b11011100; // серво -начальное 1500 = 1,5 mc (1...2) OCR3BH=0b00000101; // серво -начальное 1500 = 1,5 mc (1...2) OCR3BL=0b11011100; // серво -начальное 1500 = 1,5 mc (1...2) OCR3CH=0b00000101; // серво -начальное 1500 = 1,5 mc (1...2) OCR3CL=0b11011100; // серво -начальное 1500 = 1,5 mc (1...2) TCCR3A=0b10101010; // быстрая ШИМ - OC3A,B,С - сброс при совпадении TCNT3 и OCR3A,B,С TCCR3B=0b00011010; // 8 МГц/8=1.000.000 Hz ////////////////////////////////////////////// Маска прерывание таймер № 3: //ETIMSK=0x1A; // при совпадении TCNT3 и OCR3A,B,С ////////////////////////////////////////////// Маска прерывание таймер № 1,3: TIMSK=0x18; // при совпадении TCNT1 и OCR1A,B,С // при совпадении TCNT3 и OCR3A,B,С ETIMSK=0x1B; ////////////////////////////////////////////// АЦП: ADCSRA=0x85; // ADC 8 МГц/32=250.000 Hz ////////////////////////////////////////////// SPI SPCR=0x50; // 8 МГц/4 = 2.000.000 Hz -режим мастер ////////////////////////////////////////////// UART0 - RX 0 GPS DDRE.0=0; // UART0 - RX PORTE.0=1; // UART0 - RX // USART1 initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART1 Receiver: On // USART1 Transmitter: Off // USART1 Mode: Asynchronous // USART1 Baud Rate: 9600 UCSR1A=0x00; UCSR1B=0x90; // RX UCSR1C=0x06; UBRR1H=0x00; UBRR1L=0x33; ////////////////////////////////////////////// Ст таймер: //WDTCR=0x1F; // вкл Ст таймер. //WDTCR=0x0F; // переполнения 2,0c. ////////////////////////////////////////////// Global interrupts: #asm("sei") //#asm("cli") ///////////////////////////////////////////////////////////// инициализация nRF24L01+ : //delay_ms(100); // Power on reset 100ms PORTB.0=0; // SS SPDR=0b00100001; while(!(SPSR & (1<<7))); // 0x01 EN_AA: (Enhanced ShockBurst ™) -выкл. SPDR=0b00000000; while(!(SPSR & (1<<7))); // EN_AA = 0x00. PORTB.0=1; // SS PORTB.0=0; // SS SPDR=0b00100100; while(!(SPSR & (1<<7))); // 0x04 SETUP_RETR: (Enhanced ShockBurst ™) -выкл. SPDR=0b00000000; while(!(SPSR & (1<<7))); // SETUP_RETR = 0x00. PORTB.0=1; // SS PORTB.0=0; // SS SPDR=0b00100110; while(!(SPSR & (1<<7))); // 0x06 RF_SETUP: Скорость, мощность. SPDR=0b00100110; while(!(SPSR & (1<<7))); // 250kbps; 0dBm. PORTB.0=1; // SS PORTB.0=0; // SS SPDR=0b00110000; while(!(SPSR & (1<<7))); // 0x10 TX_ADDR_P0: Адрес передатчика SPDR=0b11000111; while(!(SPSR & (1<<7))); // 0x........C7 SPDR=0b11000111; while(!(SPSR & (1<<7))); // 0x......C7.. SPDR=0b11000111; while(!(SPSR & (1<<7))); // 0x....C7.... SPDR=0b11000111; while(!(SPSR & (1<<7))); // 0x..C7...... SPDR=0b11000111; while(!(SPSR & (1<<7))); // 0xC7........ PORTB.0=1; // SS PORTB.0=0; // SS SPDR=0b00101010; while(!(SPSR & (1<<7))); // 0x0A RX_ADDR_P0: Адрес приёмника SPDR=0b11000111; while(!(SPSR & (1<<7))); // 0x........C7 SPDR=0b11000111; while(!(SPSR & (1<<7))); // 0x......C7.. SPDR=0b11000111; while(!(SPSR & (1<<7))); // 0x....C7.... SPDR=0b11000111; while(!(SPSR & (1<<7))); // 0x..C7...... SPDR=0b11000111; while(!(SPSR & (1<<7))); // 0xC7........ PORTB.0=1; // SS PORTB.0=0; // SS SPDR=0b00110001; while(!(SPSR & (1<<7))); // 0x11 RX_PW_P0: размер FIFO_RX SPDR=32; while(!(SPSR & (1<<7))); //(LSB)...(MSB) -32. PORTB.0=1; // SS //////////////////////////////////////////////////////////////////// инициализация END: //////////////////////////////////////////// индикатор: //PORTG &= 0b11101111; // //////////////////////////////////////////// бузер: //PORTG &= 0b11110111; // //////////////////////////////////////////////////////////////////////////////////////////// _11: //////////////////////////////////////////////////////////////////////////////////////////// RX: -0,4mc //////////////////////////////////////////////////////////////// ch - запрос > chb - частота буфер PORTB.0=0; // SS SPDR=0b00100101; while(!(SPSR & (1<<7))); // 0x05 RF_CH: Частота SPDR=chb; while(!(SPSR & (1<<7))); // chb - частота буфер: 2.400GHz...2.525GHz. (0)...(125) PORTB.0=1; // SS //////////////////////////////////////////////////////////////// RX: PORTB.0=0; // SS SPDR=0b00100000; while(!(SPSR & (1<<7))); // 0x00 CONFIG SPDR=0b01111111; while(!(SPSR & (1<<7))); // CRC=2, POWER=1, RX=1. PORTB.0=1; // SS //////////////////////////////////////////////////////////////// вкл. RX: PORTB.4=1; // CE 1; вкл. RX //////////////////////////////////////////////////////////////////////////////////////////// _1: //delay_ms(30); // цикл // контроль //#asm("wdr") // Сброс ст таймер 1,0 c //PORTD.1=1; // контроль //////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////// контроль сигнал: (нет сигнала > 1c) -0,1mc delay_us(200); // цикл //PORTD.1=0; // контроль c++; // цикл if (c>4000) { // 0,000.3x3.333=1c // 32 пак/c. цикл 0,031.25c. c=0; //DDRB.5=0; // ШИМ1 (OC1A) //PORTG &= 0b11111100; // -- //DDRB.6=0; // ШИМ2 (OC1B) //DDRB.7=0; // ШИМ3 (OC1C) //PORTG &= 0b11111000; // реверс 1,2,3 //DDRB.3=0; // ШИМ (OC2). //PORTD.7=0; // реверс /////////////////////// PORTD.4=0; // сброс Нагрузка PORTD.5=0; // сброс Нагрузка PORTD.6=0; // сброс Нагрузка /////////////////////// PORTC.4=0; // сброс Нагрузка PORTC.5=0; // сброс Нагрузка PORTC.6=0; // сброс Нагрузка PORTC.7=0; // сброс Нагрузка /////////////////////// PORTA.5=0; // сброс помпа PORTA.6=0; // сброс обдув PORTA.7=0; // сброс обдув1 chb=0; // сброс частота буфер > начальное - 2.400GHz. (0) -вызывной канал PORTB.4=0; // CE 0; выкл. RX goto _11; // сброс частота буфер > начальное - 2.400GHz. (0) -вызывной канал }; //////////////////////////////////////////////////////////////////////////////////////////// // RX //////////////////////////////////////////////////////////////////////////////////////////// // IP/частота/мощность/кнопки/кнопки1/обдув/помпа/0/ //8 // АЦП/АЦП1/АЦП2/АЦП3/АЦП4/АЦП5/АЦП6/АЦП7 //8 // kor0/kor1/kor2/kor3/kor4/kor5/kor6/kor7 //8 // 0/0/0/0/0/0/CRC16/CRC16 //8 //////////////////////////////////////////////////////////////////////////////////////////// RX: //////////////////////////////////////////////////////////////// STATUS: PORTB.0=0; // SS SPDR=0; while(!(SPSR & (1<<7))); x=SPDR; PORTB.0=1; // SS if ((x & 0b00001110)==0b00001110) { // .... 111. - RX FIFO - пуст goto _1; // > сброс RX }; //////////////////////////////////////////////////////////////// выкл. RX: PORTB.4=0; // CE 0; выкл. RX //////////////////////////////////////////////////////////////// RX FIFO > буфер: PORTB.0=0; // SS SPDR=0b01100001; while(!(SPSR & (1<<7))); // RX FIFO for (x=0;x<32;x++) { SPDR=0; while(!(SPSR & (1<<7))); bufer[x]=SPDR; }; PORTB.0=1; // SS //////////////////////////////////////////////////////////////// crc буфер: -1,4mc //+ interrupts = 2,0mc crc=0xFFFF; for (b=0;b<32;b=b+2) { bcrc=bufer[b]; bcrc=(bcrc<<8)|bufer[b+1]; fcrc(); }; //////////////////////////////////////////////////////////////// проверка crc: /* */ if (!PIND.2) { // контроль кнопка crc=0; //bufer[1]=0b10000000;//bufer[4]=u; bufer[5]=u1; bufer[6]=u; bufer[7]=u1; bufer[12]=1; // АЦП / ШИМ1 / флаг2 UART полный c=0; //if (!PIND.0) { if (flag2_GPS) bufer[12] = 1; }; // флаг2 GPS полный //if (!PIND.1) { if (flag2_kompas) bufer[14] = 1; }; // флаг2 kompas полный }; if (crc==0) { IP=bufer[0]; // IP модель ch=bufer[1]; // частота pw=bufer[2]; // мощность k=bufer[3]; // кнопки kn=bufer[4]; // кнопки1 obduv=bufer[5]; // обдув pompa=bufer[6]; // помпа //=bufer[7]; // /////////////////////////// servo[0]=bufer[8]; // АЦП / MOTOR 1 PF 0 > PB5 servo[1]=bufer[9]; // АЦП1 / РУЛЬ PF 1 > PE5 servo[2]=bufer[10]; // АЦП2 / MOTOR 2 PF 2 > PB6 servo[3]=bufer[11]; // АЦП3 / SERVO 1 PF 3 > PE3 servo[4]=bufer[12]; // АЦП4 / ШИМ 3 PF 4 > PB7 servo[5]=bufer[13]; // АЦП5 / SERVO 3 PF 5 > PE4 servo[6]=bufer[14]; // АЦП6 servo[7]=bufer[15]; // АЦП7 /////////////////////////// kor0=bufer[16]; // kor0 kor1=bufer[17]; // kor1 kor2=bufer[18]; // kor2 kor3=bufer[19]; // kor3 kor4=bufer[20]; // kor4 kor5=bufer[21]; // kor5 kor6=bufer[22]; // kor6 kor7=bufer[23]; // kor7 /* ///////////////////////////////////////////////////////////////////////// GPS: if ((bufer[12])&&(flag_GPS_radio)) { // флаг GPS radio полный // флаг GPS radio полный flag_GPS_radio = 0; // флаг GPS radio полный UCSR0B=0x90; // USART0 RX > GPS }; st_bufer_GPS=bufer[13]; // счёт буфер GPS -начальное 0 ///////////////////////////////////////////////////////////////////////// kompas/эхолот: if ((bufer[14])&&(flag_kompas_radio)) { // флаг kompas radio полный // флаг kompas radio полный flag_kompas_radio = 0; // флаг kompas radio полный UCSR1B=0x90; // USART1 RX > kompas/эхолот flag_GPS_kompas_radio = 0; // флаг GPS kompas radio полный }; st_bufer_kompas=bufer[15]; // счёт буфер kompas -начальное 0 ////////////////////////////////////////////////////////////////////////// */ // bufer[24]; // // bufer[25]; // // bufer[26]; // // bufer[27]; // // bufer[28]; // // bufer[29]; // } //////////////////////////////////////////////////////////////// ошибка crc: else { PORTB.4=1; // CE 1; вкл. RX c=c+10; // коррекция цикл goto _1; // > сброс RX }; //////////////////////////////////////////////////////////////////////////////////////////// // модель // IP/частота/мощность/кнопки/кнопки1/обдув/помпа/0/ //8 // АЦП/АЦП1/АЦП2/АЦП3/АЦП4/АЦП5/АЦП6/АЦП7 //8 // kor0/kor1/kor2/kor3/kor4/kor5/kor6/kor7 //8 // 0/0/0/0/0/0/CRC16/CRC16 //8 //////////////////////////////////////////////////////////////////////////////////////////// кнопки: if (k & 0b00010000) {PORTC.4=1;} else {PORTC.4=0;}; if (k & 0b00100000) {PORTC.5=1;} else {PORTC.5=0;}; if (k & 0b01000000) {PORTC.6=1;} else {PORTC.6=0;}; if (k & 0b10000000) {PORTC.7=1;} else {PORTC.7=0;}; //////////////////////////////////////////////////////////////////////////////////////////// кнопки1: if (kn & 0b00010000) {PORTD.4=1;} else {PORTD.4=0;}; if (kn & 0b00100000) {PORTD.5=1;} else {PORTD.5=0;}; if (kn & 0b01000000) {PORTD.6=1;} else {PORTD.6=0;}; //////////////////////////////////////////////////////////////////////////////////////////// обдув: if (obduv & 0b01000000) {PORTA.6=1;} //обдув else {PORTA.6=0;}; //обдув if (obduv & 0b10000000) {PORTA.7=1;} //обдув1 else {PORTA.7=0;}; //обдув1 //////////////////////////////////////////////////////////////////////////////////////////// помпа: if (pompa & 0b00100000) {PORTA.5=1;} else {PORTA.5=0;}; //////////////////////////////////////////////////////////////////////////////////////////// ШИМ 1: /* if (servo[0] > 127) w1=(servo[0]-128); // >> if (servo[0] < 128) w1=(127-servo[0]); // << ////////////////// if (9 > w1) { DDRB.5=0; // (OC1A) PORTG &= 0b11111100; // -- } else { DDRB.5=1; // (OC1A) if (servo[1] < 119) { PORTG &= 0b11111101; // < PORTG |= 0b00000001; // < } else { PORTG &= 0b11111110; // > PORTG |= 0b00000010; // > }; }; ////////////////// ШИМ1 OCR1A=(w1*2); */ //////////////////////////////////////////////////////////////////////////////////////////// ШИМ 2: /* if (servo[2] > 127) w2=(servo[2]-128); // >> if (servo[2] < 128) w2=(127-servo[2]); // << ////////////////// реверс: if (servo[2] < 119) PORTG |= 0b00000010; // реверс 2 else PORTG &= 0b11111101; // реверс 2 ////////////////// ШИМ вкл./выкл.: if ( 9 > w2) DDRB.6=0; // (OC1B) else DDRB.6=1; // (OC1B) ////////////////// ШИМ2 OCR1B=(w2*2); //////////////////////////////////////////////////////////////////////////////////////////// ШИМ 3: if (servo[3] > 127) w3=(servo[3]-128); // >> if (servo[3] < 128) w3=(127-servo[3]); // << ////////////////// реверс: if (servo[3] < 119) PORTG |= 0b00000100; // реверс 3 else PORTG &= 0b11111011; // реверс 3 ////////////////// ШИМ вкл./выкл.: if ( 9 > w3) DDRB.7=0; // (OC1C) else DDRB.7=1; // (OC1C) ////////////////// ШИМ3 OCR1CH=((w3*2)>>8); OCR1CL=(w3*2); //////////////////////////////////////////////////////////////////////////////////////////// ШИМ: if (servo[1] > 127) w=(servo[1]-128); // >> if (servo[1] < 128) w=(127-servo[1]); // << ////////////////// реверс: if (servo[1] < 119) PORTG |= 0b00000001; // реверс 1 else PORTG &= 0b11111110; // реверс 1 ////////////////// ШИМ вкл./выкл.: if ( 9 > w) DDRB.7=0; // (OC2). else DDRB.7=1; // (OC2). ////////////////// ШИМ: OCR2=(w*2)+1; */ //////////////////////////////////////////////////////////////////////////////////////////// // модель // IP/вода/температура/температура1/температура2/температура3/0/0 //8 // АЦП/АЦП1/АЦП2/АЦП3/АЦП4/АЦП5/АЦП6/АЦП7 //8 // _0/_1/_2/_3/_4/_5/_6/_7 //8 // 0/0/0/0/0/0/CRC16/CRC16 //8 //////////////////////////////////////////////////////////////////////////////////////////// вода: if (PIND.7) v &= 0b11111110; // (.......1) 1 - вода else v |= 0b00000001; // (.......1) 1 - вода //////////////////////////////////////////////////////////////////////////////////////////// температура: // температура модель ds18b20: 0 C^ ... 128 C^ (начальное 85 C^ (01010101)) // 32 пак/c. цикл 0,031.25c. sd++; // sd - запуск преобразования: 1 преобразование(минимум 750mc)=1с. //////////////////////////////////////////// ////////////////////// запуск преобразования: if (sd == 1) { // Инициализация DS18B20 DDRC.0=1; // прижать delay_us(550); // 480 мкС < имп < 960 мкС DDRC.0=0; // отпустить //delay_us(550); // 480 мкС < имп }; ////////////////////// if (sd == 2) { // Инициализация DS18B20 t_ =0b11001100; wt(); // обратиться ко всем устройствам t_ =0b01000100; wt(); // единственное температурное преобразование. }; ////////////////////////////////////////////// ////////////////////// читать DS18B20: if (sd == 32) { // Инициализация DS18B20 DDRC.0=1; // прижать delay_us(550); // 480 мкС < имп < 960 мкС DDRC.0=0; // отпустить //delay_us(550); // 480 мкС < имп }; ////////////////////// читать DS18B20: if (sd == 33) { // Инициализация DS18B20 t_ =0b11001100; wt(); // обратиться ко всем устройствам t_ =0b10111110; wt(); // читать DS18B20 }; ////////////////////// читать DS18B20: if (sd == 34) { wr(); DS18B20[0]=t_; // 0 - Температура LSB wr(); DS18B20[1]=t_; // 1 - Температура MSB }; ////////////////////// читать DS18B20: if (sd == 35) { wr(); DS18B20[2]=t_; // 2 - TH wr(); DS18B20[3]=t_; // 3 - TL }; ////////////////////// читать DS18B20: if (sd == 36) { wr(); DS18B20[4]=t_; // 4 - конфигурация wr(); DS18B20[5]=t_; // 5 - FF }; ////////////////////// читать DS18B20: if (sd == 37) { wr(); DS18B20[6]=t_; // 6 - 0C wr(); DS18B20[7]=t_; // 7 - 10 }; ////////////////////// читать DS18B20: if (sd == 38) { wr(); DS18B20[8]=t_; // 8 - CRC }; ////////////////////// CRC-8 DS18B20: if (sd == 39) { wcrc=0x00; for (x=0;x<9;x++) { wbcrc=DS18B20[x]; fwcrc(); }; ////////////////////// проверка crc if (wcrc==0) { ////////////////////// L + H: bufer_t = DS18B20[1]; // - H bufer_t = (bufer_t << 8) | DS18B20[0]; // - L ////////////////////// буфер -начальное DS18B20 85,00 if (bufer_t != 1360) { // 85,00 -начальное DS18B20 t = (bufer_t >> 4); // t = DS18B20. if (t > 125) { // от 0°C до +125°C t=0x00; }; //PORTA=t; // контроль }; ///////////////////// } ////////////////////// ошибка crc else { t=0x00; // ошибка crc (TX/RX DS18B20). }; ////////////////////// sd - счётчик DS18B20 //sd = 0; }; //////////////////////////////////////////////////////////////////////////////////////////// температура1: // температура модель ds18b20: 0 C^ ... 128 C^ (начальное 85 C^ (01010101)) // 32 пак/c. цикл 0,031.25c. //sd++; // sd - запуск преобразования: 1 преобразование(минимум 750mc)=1с. //////////////////////////////////////////// ////////////////////// запуск преобразования: if (sd == 3) { // Инициализация DS18B20 DDRC.1=1; // прижать delay_us(550); // 480 мкС < имп < 960 мкС DDRC.1=0; // отпустить //delay_us(550); // 480 мкС < имп }; ////////////////////// if (sd == 4) { // Инициализация DS18B20 t_ =0b11001100; wt1(); // обратиться ко всем устройствам t_ =0b01000100; wt1(); // единственное температурное преобразование. }; ////////////////////////////////////////////// ////////////////////// читать DS18B20: if (sd == 40) { // Инициализация DS18B20 DDRC.1=1; // прижать delay_us(550); // 480 мкС < имп < 960 мкС DDRC.1=0; // отпустить //delay_us(550); // 480 мкС < имп }; ////////////////////// читать DS18B20: if (sd == 41) { // Инициализация DS18B20 t_ =0b11001100; wt1(); // обратиться ко всем устройствам t_ =0b10111110; wt1(); // читать DS18B20 }; ////////////////////// читать DS18B20: if (sd == 42) { wr1(); DS18B20[0]=t_; // 0 - Температура LSB wr1(); DS18B20[1]=t_; // 1 - Температура MSB }; ////////////////////// читать DS18B20: if (sd == 43) { wr1(); DS18B20[2]=t_; // 2 - TH wr1(); DS18B20[3]=t_; // 3 - TL }; ////////////////////// читать DS18B20: if (sd == 44) { wr1(); DS18B20[4]=t_; // 4 - конфигурация wr1(); DS18B20[5]=t_; // 5 - FF }; ////////////////////// читать DS18B20: if (sd == 45) { wr1(); DS18B20[6]=t_; // 6 - 0C wr1(); DS18B20[7]=t_; // 7 - 10 }; ////////////////////// читать DS18B20: if (sd == 46) { wr1(); DS18B20[8]=t_; // 8 - CRC }; ////////////////////// CRC-8 DS18B20: if (sd == 47) { wcrc=0x00; for (x=0;x<9;x++) { wbcrc=DS18B20[x]; fwcrc(); }; ////////////////////// проверка crc if (wcrc==0) { ////////////////////// L + H: bufer_t = DS18B20[1]; // - H bufer_t = (bufer_t << 8) | DS18B20[0]; // - L ////////////////////// буфер -начальное DS18B20 85,00 if (bufer_t != 1360) { // 85,00 -начальное DS18B20 t1 = (bufer_t >> 4); // t = DS18B20. if (t1 > 125) { // от 0°C до +125°C t1=0x00; }; //PORTA=t1; // контроль }; ///////////////////// } ////////////////////// ошибка crc else { t1=0x00; // ошибка crc (TX/RX DS18B20). }; ////////////////////// sd - счётчик DS18B20 //sd = 0; }; //////////////////////////////////////////////////////////////////////////////////////////// температура2: // температура модель ds18b20: 0 C^ ... 128 C^ (начальное 85 C^ (01010101)) // 32 пак/c. цикл 0,031.25c. //sd++; // sd - запуск преобразования: 1 преобразование(минимум 750mc)=1с. //////////////////////////////////////////// ////////////////////// запуск преобразования: if (sd == 5) { // Инициализация DS18B20 DDRC.2=1; // прижать delay_us(550); // 480 мкС < имп < 960 мкС DDRC.2=0; // отпустить //delay_us(550); // 480 мкС < имп }; ////////////////////// if (sd == 6) { // Инициализация DS18B20 t_ =0b11001100; wt2(); // обратиться ко всем устройствам t_ =0b01000100; wt2(); // единственное температурное преобразование. }; ////////////////////////////////////////////// ////////////////////// читать DS18B20: if (sd == 48) { // Инициализация DS18B20 DDRC.2=1; // прижать delay_us(550); // 480 мкС < имп < 960 мкС DDRC.2=0; // отпустить //delay_us(550); // 480 мкС < имп }; ////////////////////// читать DS18B20: if (sd == 49) { // Инициализация DS18B20 t_ =0b11001100; wt2(); // обратиться ко всем устройствам t_ =0b10111110; wt2(); // читать DS18B20 }; ////////////////////// читать DS18B20: if (sd == 50) { wr2(); DS18B20[0]=t_; // 0 - Температура LSB wr2(); DS18B20[1]=t_; // 1 - Температура MSB }; ////////////////////// читать DS18B20: if (sd == 51) { wr2(); DS18B20[2]=t_; // 2 - TH wr2(); DS18B20[3]=t_; // 3 - TL }; ////////////////////// читать DS18B20: if (sd == 52) { wr2(); DS18B20[4]=t_; // 4 - конфигурация wr2(); DS18B20[5]=t_; // 5 - FF }; ////////////////////// читать DS18B20: if (sd == 53) { wr2(); DS18B20[6]=t_; // 6 - 0C wr2(); DS18B20[7]=t_; // 7 - 10 }; ////////////////////// читать DS18B20: if (sd == 54) { wr2(); DS18B20[8]=t_; // 8 - CRC }; ////////////////////// CRC-8 DS18B20: if (sd == 55) { wcrc=0x00; for (x=0;x<9;x++) { wbcrc=DS18B20[x]; fwcrc(); }; ////////////////////// проверка crc if (wcrc==0) { ////////////////////// L + H: bufer_t = DS18B20[1]; // - H bufer_t = (bufer_t << 8) | DS18B20[0]; // - L ////////////////////// буфер -начальное DS18B20 85,00 if (bufer_t != 1360) { // 85,00 -начальное DS18B20 t2 = (bufer_t >> 4); // t = DS18B20. if (t2 > 125) { // от 0°C до +125°C t2=0x00; }; //PORTA=t2; // контроль }; ///////////////////// } ////////////////////// ошибка crc else { t2=0x00; // ошибка crc (TX/RX DS18B20). }; ////////////////////// sd - счётчик DS18B20 //sd = 0; }; //////////////////////////////////////////////////////////////////////////////////////////// температура3: // температура модель ds18b20: 0 C^ ... 128 C^ (начальное 85 C^ (01010101)) // 32 пак/c. цикл 0,031.25c. //sd++; // sd - запуск преобразования: 1 преобразование(минимум 750mc)=1с. //////////////////////////////////////////// ////////////////////// запуск преобразования: if (sd == 7) { // Инициализация DS18B20 DDRC.3=1; // прижать delay_us(550); // 480 мкС < имп < 960 мкС DDRC.3=0; // отпустить //delay_us(550); // 480 мкС < имп }; ////////////////////// if (sd == 8) { // Инициализация DS18B20 t_ =0b11001100; wt3(); // обратиться ко всем устройствам t_ =0b01000100; wt3(); // единственное температурное преобразование. }; ////////////////////////////////////////////// ////////////////////// читать DS18B20: if (sd == 56) { // Инициализация DS18B20 DDRC.3=1; // прижать delay_us(550); // 480 мкС < имп < 960 мкС DDRC.3=0; // отпустить //delay_us(550); // 480 мкС < имп }; ////////////////////// читать DS18B20: if (sd == 57) { // Инициализация DS18B20 t_ =0b11001100; wt3(); // обратиться ко всем устройствам t_ =0b10111110; wt3(); // читать DS18B20 }; ////////////////////// читать DS18B20: if (sd == 58) { wr3(); DS18B20[0]=t_; // 0 - Температура LSB wr3(); DS18B20[1]=t_; // 1 - Температура MSB }; ////////////////////// читать DS18B20: if (sd == 59) { wr3(); DS18B20[2]=t_; // 2 - TH wr3(); DS18B20[3]=t_; // 3 - TL }; ////////////////////// читать DS18B20: if (sd == 60) { wr3(); DS18B20[4]=t_; // 4 - конфигурация wr3(); DS18B20[5]=t_; // 5 - FF }; ////////////////////// читать DS18B20: if (sd == 61) { wr3(); DS18B20[6]=t_; // 6 - 0C wr3(); DS18B20[7]=t_; // 7 - 10 }; ////////////////////// читать DS18B20: if (sd == 62) { wr3(); DS18B20[8]=t_; // 8 - CRC }; ////////////////////// CRC-8 DS18B20: if (sd == 63) { wcrc=0x00; for (x=0;x<9;x++) { wbcrc=DS18B20[x]; fwcrc(); }; ////////////////////// проверка crc if (wcrc==0) { ////////////////////// L + H: bufer_t = DS18B20[1]; // - H bufer_t = (bufer_t << 8) | DS18B20[0]; // - L ////////////////////// буфер -начальное DS18B20 85,00 if (bufer_t != 1360) { // 85,00 -начальное DS18B20 t3 = (bufer_t >> 4); // t = DS18B20. if (t3 > 125) { // от 0°C до +125°C t3=0x00; }; // PORTA=t3; // контроль }; ///////////////////// } ////////////////////// ошибка crc else { t3=0x00; // ошибка crc (TX/RX DS18B20). }; ////////////////////// sd - счётчик DS18B20 sd = 0; }; //////////////////////////////////////////////////////////////////////////////////////////// Тахометр: /* // фильтр тахометр: // Dtax - один оборот = 2 импульса. // tax - тахометр модель = Dtax/2. // taxb - буфер тахометр Dtaxb = Dtax; // Dtaxb - буфер Data Тахометр if (Dtaxb>taxb+1) {tax=Dtaxb/2; taxb=Dtaxb;}; if (Dtaxbub+1) {u=a/2; ub=a;}; if (aub1+1) {u1=a/2; ub1=a;}; if (aub2+1) {u2=a/2; ub2=a;}; if (aub3+1) {u3=a/2; ub3=a;}; if (aub4+1) {u4=a/2; ub4=a;}; if (aub5+1) {u5=a/2; ub5=a;}; if (aub6+1) {u6=a/2; ub6=a;}; if (aub7+1) {u7=a/2; ub7=a;}; if (a буфер: bufer[0]=IP; // IP модель -начальное 1 bufer[1]=v; // вода bufer[2]=t; // температура bufer[3]=t1; // температура1 bufer[4]=t2; // температура2 bufer[5]=t3; // температура3 bufer[6]=0; // bufer[7]=0; // //////////////////////////////////////////////////////////////// АЦП: bufer[8]=u; // g -аккум модель: 0...255. bufer[9]=u1; // серво_0 модель bufer[10]=u2; // серво_1 модель bufer[11]=u3; // bufer[12]=u4; // bufer[13]=u5; // bufer[14]=u6; // bufer[15]=u7; // //////////////////////////////////////////////////////////////// 1 - GPS, 2 - kompas: /* if ( (flag_GPS_radio) && (flag_GPS_kompas_radio == 0) ) { bufer[12]=1; // флаг GPS radio полный bufer[13]=0; // флаг kompas radio полный ////////////////// x=st_bufer_GPS; // счёт буфер GPS bufer[14]=bufer_GPS[x]; // bufer_GPS[0] x++; // счёт буфер GPS bufer[15]=bufer_GPS[x]; // bufer_GPS[1] x++; // счёт буфер GPS bufer[16]=bufer_GPS[x]; // bufer_GPS[2] x++; // счёт буфер GPS bufer[17]=bufer_GPS[x]; // bufer_GPS[3] x++; // счёт буфер GPS bufer[18]=bufer_GPS[x]; // bufer_GPS[4] x++; // счёт буфер GPS bufer[19]=bufer_GPS[x]; // bufer_GPS[5] x++; // счёт буфер GPS bufer[20]=bufer_GPS[x]; // bufer_GPS[6] x++; // счёт буфер GPS bufer[21]=bufer_GPS[x]; // bufer_GPS[7] x++; // счёт буфер GPS bufer[22]=bufer_GPS[x]; // bufer_GPS[8] x++; // счёт буфер GPS bufer[23]=bufer_GPS[x]; // bufer_GPS[9] x++; // счёт буфер GPS bufer[24]=bufer_GPS[x]; // bufer_GPS[10] x++; // счёт буфер GPS bufer[25]=bufer_GPS[x]; // bufer_GPS[11] x++; // счёт буфер GPS bufer[26]=bufer_GPS[x]; // bufer_GPS[12] x++; // счёт буфер GPS bufer[27]=bufer_GPS[x]; // bufer_GPS[13] x++; // счёт буфер GPS bufer[28]=bufer_GPS[x]; // bufer_GPS[14] x++; // счёт буфер GPS bufer[29]=bufer_GPS[x]; // bufer_GPS[15] } else { if (flag_kompas_radio) { // флаг kompas radio полный flag_GPS_kompas_radio = 1; bufer[12]=0; // флаг GPS radio полный bufer[13]=1; // флаг kompas radio полный ////////////////// x=st_bufer_kompas; // счёт буфер kompas bufer[14]=bufer_kompas[x];// bufer_kompas[0] x++; // счёт буфер kompas bufer[15]=bufer_kompas[x];// bufer_kompas[1] x++; // счёт буфер kompas bufer[16]=bufer_kompas[x];// bufer_kompas[2] x++; // счёт буфер kompas bufer[17]=bufer_kompas[x];// bufer_kompas[3] x++; // счёт буфер kompas bufer[18]=bufer_kompas[x];// bufer_kompas[4] x++; // счёт буфер kompas bufer[19]=bufer_kompas[x];// bufer_kompas[5] x++; // счёт буфер kompas bufer[20]=bufer_kompas[x];// bufer_kompas[6] x++; // счёт буфер kompas bufer[21]=bufer_kompas[x];// bufer_kompas[7] x++; // счёт буфер kompas bufer[22]=bufer_kompas[x];// bufer_kompas[8] x++; // счёт буфер kompas bufer[23]=bufer_kompas[x];// bufer_kompas[9] x++; // счёт буфер kompas bufer[24]=bufer_kompas[x];// bufer_kompas[10] x++; // счёт буфер kompas bufer[25]=bufer_kompas[x];// bufer_kompas[11] x++; // счёт буфер kompas bufer[26]=bufer_kompas[x];// bufer_kompas[12] x++; // счёт буфер kompas bufer[27]=bufer_kompas[x];// bufer_kompas[13] x++; // счёт буфер kompas bufer[28]=bufer_kompas[x];// bufer_kompas[14] x++; // счёт буфер kompas bufer[29]=bufer_kompas[x];// bufer_kompas[15] } else { bufer[12]=0; // флаг GPS radio полный bufer[13]=0; // флаг kompas radio полный ////////////////// bufer[14]=0; // bufer[15]=0; // bufer[16]=0; // bufer[17]=0; // bufer[18]=0; // bufer[19]=0; // bufer[20]=0; // bufer[21]=0; // bufer[22]=0; // bufer[23]=0; // bufer[24]=0; // bufer[25]=0; // bufer[26]=0; // bufer[27]=0; // bufer[28]=0; // bufer[29]=0; // }; }; */ //////////////////////////////////////////////////////////////// bufer[16]=0; // bufer[17]=0; // bufer[18]=0; // bufer[19]=0; // bufer[20]=0; // bufer[21]=0; // bufer[22]=0; // bufer[23]=0; // bufer[24]=0; // bufer[25]=0; // bufer[26]=0; // bufer[27]=0; // bufer[28]=0; // bufer[29]=0; // //////////////////////////////////////////////////////////////// crc буфер: -1,4mc //+ interrupts = 2,0mc crc=0xFFFF; for (b=0;b<30;b=b+2) { bcrc=bufer[b]; bcrc=(bcrc<<8)|bufer[b+1]; fcrc(); }; bufer[30]=(crc>>8); // crc bufer[31]=crc; // crc //////////////////////////////////////////////////////////////////////////////////////////// TX: //////////////////////////////////////////////////////////////// pw - мощность pwb = pw; // мощность pwb = (pwb<<1)|0b00100000;// 0b00100110 // 0b00100110 // ..1. .11. RF_SETUP = RF_DR_LOW - 250kbps. PORTB.0=0; // SS SPDR=0b00100110; while(!(SPSR & (1<<7)));// 0x06 RF_SETUP: скорость, мощность TX SPDR=pwb; while(!(SPSR & (1<<7)));// 250kbps; 0dBm...-18dBm. PORTB.0=1; // SS //////////////////////////////////////////////////////////////// TX: PORTB.0=0; // SS SPDR=0b00100000; while(!(SPSR & (1<<7)));// 0x00 CONFIG: SPDR=0b01111110; while(!(SPSR & (1<<7)));// CRC=2, POWER=1, TX=0. PORTB.0=1; // SS //////////////////////////////////////////////////////////////// буфер > TX_FIFO PORTB.0=0; // SS SPDR=0b10100000; while(!(SPSR & (1<<7))); // TX FIFO for (x=0;x<32;x++) { SPDR=bufer[x]; while(!(SPSR & (1<<7))); }; PORTB.0=1; // SS //////////////////////////////////////////////////////////////// вкл. TX: PORTB.4=1; // CE 1; вкл. TX delay_us(1500); // TX: пакет - 250kbps; 0,001.280с. + 0,000.130с PLL = 0,001.410с//+ interrupts = 1,6mc PORTB.4=0; // CE 0; выкл. TX //////////////////////////////////////////////////////////////////////////////////////////// цикл: c=0; // цикл chb = ch; // ch - частота запрос > chb - частота буфер goto _11; // > RX //////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// }