#include #include //////////////////////////////////////////////////////////////////////////////////////////// // ATmega8: кварц - 4 МHz; фьюзы: Low EF; Higt C9. // RC - 4 МHz; фьюзы: Low E3; Higt D9. // таймер 2 - ШИМ - 15.625 Hz //////////////////////////////////////////////////////////////////////////////////////////// // EEPROM // 00 - контрастность OLED 128x64 - SH1106. // 01,02 - коррекция часы ATmega8: кварц - 4 МHz. // 03 - частота nRF24L01+: 2.400GHz до 2.525GHz. 00000000(0)...01111101(125). // 04 - мощность nRF24L01+: 11 10 01 00 // 05 - частота кадров LCD 4/8/16/32 - OLED 128x64 - SH1106. // 06 - обдув 40/50/60/70/80 // 07 - защита аккум от переразряда модель 1 // 08 - флаг защита аккум от переразряда модель 1 // 09 - защита аккум от переразряда модель 2 // 10 - флаг защита аккум от переразряда модель 2 // 11 - флаг зуммер //////////////////////////////////////////////////////////////////////////////////////////// // nRF24L01+ : преамбула - 1, адрес - 5, Data - 8, CRC16 - 2 // скорость: 250kbps; 0,000.512с. // 32 пак/c. цикл 0,031.25c. //////////////////////////////////////////////////////////////////////////////////////////// // пульт // Data: АЦП - ШИМ - кнопки - АЦП2 - частота - номер пакета пульт - CRC16 - CRC16. // u - АЦП: 0...255. // q/w - ШИМ: 0...255. // k - кнопки: // pw - мощность: 11 10 01 00 // (......11) 11 10 01 00 // (........) 0- Вкл(Выкл) меню // (........) 1- Выбор меню / Вкл(Выкл) LCD // (.....1..) 2- обдув 40/50/60/70/80; // (....1...) 3- Вкл(Выкл) фары // (........) 4- скорость 80/90/100 // (..1.....) 5- Вкл(Выкл) резервный аккумулятор // (.1......) 6- Вкл выгрузка // (1.......) 7- флаг свет // u2 - АЦП2: 0...255. // ch - частота: 2.400GHz до 2.525GHz. 00000000(0)...01111101(125) // n - номер пакета пульт: 0...255. //////////////////////////////////////////////////////////////////////////////////////////// // модель // Data: аккум - температура - вода - аккум2 - датчик тока - номер пакета модель - CRC16 - CRC16. // g - аккум модель: 0...255. // t - температура модель: ds18b20: 0 C^ (00000000)... 128 C^ (10000000) (начальное 85 C^ - 01010101) // v - датчик вода: // (.......1) 1 - вкл. вода модель // (......1.) 1 - вкл. выгрузка модель (геркон 2 база) // (.....1..) 1 - вкл. выгрузка модель (геркон 1 выгрузка) // (....1...) 1 - вкл. выгрузка модель (реле 6.2 база) // (...1....) 1 - вкл. выгрузка модель (реле 6.1 выгрузка) // g2 - аккум2: 0...255. // tok - датчик тока: 0...255. / температура 2 // m - номер пакета модель: 0...255. (n (запрос) = m (ответ)). //////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// char x; // x - счёт int a; // a - счёт int b; // b - счёт /////////////////////////////////////////////// контроль связь модель int c; // с - цикл /////////////////////////////////////////////// Data модель char g; // g - аккум модель int gb; // gb - буфер аккум модель char t; // t - датчик температура модель char v; // v - датчик вода модель char g2; // g2 - аккум модель 2 int gb2; // gb2 - буфер аккум модель 2 char tok; // tok - датчик тока int tokb; // tokb - буфер датчик тока char m; // m - номер пакета модель /////////////////////////////////////////////// Data пульт char u; // u - АЦП char w; // w - ШИМ char k; // k - кнопки / мощность 11 10 01 00 char u2; // u2 - АЦП2 char ch; // ch - частота запроса char chb=125; // chb - частота буфер // 2.525GHz. - 01111101(125) - вызывной канал char n; // n - номер пакета пульт char pwb; // pwb - буфер мощность /////////////////////////////////////////////// буфер char bufer[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0}; /////////////////////////////////////////////// crc TX/RX int crc; // crc - crc int bcrc; // bcrc - crc буфер /////////////////////////////////////////////// программный SPI char tx; // tx - SPI char rx; // rx - SPI /////////////////////////////////////////////// серво 1,2 int e; // e - серво 1 int r; // r - серво 2 /////////////////////////////////////////////// каретка char fk; // fk - флаг каретки char y; // y - задержка каретки /////////////////////////////////////////////// DS18B20 char t_; // t_ - буфер DS18B20 char t0; // t0 - RX буфер char t1; // t1 - RX буфер char t2; // t2 - RX буфер char t3; // t3 - RX буфер char t4; // t4 - RX буфер char t5; // t5 - RX буфер char t6; // t6 - RX буфер char t7; // t7 - RX буфер char t8; // t8 - RX буфер char wcrc; // tcrc - crc (DS18B20) char wbcrc; // tbcrc - crc буфер (DS18B20) char sd; // sd - счётчик датчика DS18B20 // запуск преобразования: 1 преобразование/2с. //////////////////////////////////////////////// Вкл свет char flag_svet = 0xFF; // флаг Вкл свет //////////////////////////////////////////////// адрес nRF24L01+ char Address_Pult = 1; // адрес nRF24L01+ //////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// АЦП: //-0,000.070c void adc(char adc_input) { ADMUX = 0b01000000 | adc_input; // опорное AVCC // канал ADC0...ADC7 delay_us(10); // стабилизация входа. ADCSRA|=0b01000000; // Старт. При завершении преобразования сбрасывается аппаратно. while (ADCSRA & 0b01000000); // Ждём окончания преобразования. } ////////////////////////////////////////////////////////////////////////////// fcrc: TX/RX void fcrc(void) { crc ^= bcrc; // CRC-16-CCITT // 0x1021 x^16 + x^12 + x^5 + 1 // 1. 0001.0000 0010.0001 for( a = 0; a < 16; a++ ){ if (crc & 0x8000) crc = ( crc << 1 ) ^ 0x1021; else crc = crc << 1; }; } ////////////////////////////////////////////////////////////// передача wt (1-Wire-DS18B20): void wt(void) { // LSB...MSB for (x=0;x<8;x++) { DDRC.4=0; // отпустить линию delay_us(10); DDRC.4=1; // прижать линию DDRC.4= t_ & (1<> 1 ) ^ 0x8C : wcrc >> 1; }; } /////////////////////////////////////////////////////////////////////////////// SPI: 62 кГц. void SPI(void) { rx=0; // сброс RX PORTB.0 = tx & 0b10000000 ? 1 : 0; // выход MOSI delay_us(3); PORTB.5=1; // выход SCK if (PINB.4==1) {rx|=0b10000000;}; // вход MISO PORTB.5=0; // выход SCK PORTB.0 = tx & 0b01000000 ? 1 : 0; // выход MOSI delay_us(3); PORTB.5=1; // выход SCK if (PINB.4==1) {rx|=0b01000000;}; // вход MISO PORTB.5=0; // выход SCK PORTB.0 = tx & 0b00100000 ? 1 : 0; // выход MOSI delay_us(3); PORTB.5=1; // выход SCK if (PINB.4==1) {rx|=0b00100000;}; // вход MISO PORTB.5=0; // выход SCK PORTB.0 = tx & 0b00010000 ? 1 : 0; // выход MOSI delay_us(3); PORTB.5=1; // выход SCK if (PINB.4==1) {rx|=0b00010000;}; // вход MISO PORTB.5=0; // выход SCK PORTB.0 = tx & 0b00001000 ? 1 : 0; // выход MOSI delay_us(3); PORTB.5=1; // выход SCK if (PINB.4==1) {rx|=0b00001000;}; // вход MISO PORTB.5=0; // выход SCK PORTB.0 = tx & 0b00000100 ? 1 : 0; // выход MOSI delay_us(3); PORTB.5=1; // выход SCK if (PINB.4==1) {rx|=0b00000100;}; // вход MISO PORTB.5=0; // выход SCK PORTB.0 = tx & 0b00000010 ? 1 : 0; // выход MOSI delay_us(3); PORTB.5=1; // выход SCK if (PINB.4==1) {rx|=0b00000010;}; // вход MISO PORTB.5=0; // выход SCK PORTB.0 = tx & 0b00000001 ? 1 : 0; // выход MOSI delay_us(3); PORTB.5=1; // выход SCK if (PINB.4==1) {rx|=0b00000001;}; // вход MISO PORTB.5=0; // выход SCK delay_us(3); PORTB.0 = 0; // сброс MOSI } ///////////////////////////////////////////////////////////////////// сигнал (фары) нет связи: void signal(void) { if (fk != 2) { if (flag_svet) PORTD.3 = 1; // (1.......) 7- Вкл свет // (....1...) 3- Вкл(Выкл) фары }; delay_ms(500); if (fk != 2) { if (flag_svet) PORTD.3 = 0; // (1.......) 7- Вкл свет // (....1...) 3- Вкл(Выкл) фары }; } //////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// void main(void) { ////////////////////////////////////////////// nRF24L01+ //DDRC.1=1; // перезагрузка nRF24L01+ //PORTC.1=0; // перезагрузка nRF24L01+ вкл. DDRC.0=1; // CE nRF24L01+ PORTC.0=0; // CE nRF24L01+ ////////////////////////////////////////////// программный SPI DDRB.5=1; // SCK PORTB.5=0; // SCK DDRB.4=0; // MISO PORTB.4=0; // MISO DDRB.0=1; // MOSI PORTB.0=0; // MOSI //DDRB.2=1; // SS //PORTB.2=1; // SS DDRC.5=1; // SS (выход CSN) nRF24L01+ PORTC.5=1; // SS (выход CSN +) nRF24L01+ ////////////////////////////////////////////// выгрузка DDRD.0=1; // реле 6.1 - выгрузка PORTD.0=0; // реле 6.1 - выгрузка DDRD.4=0; // геркон 1 - стоп выгрузка PORTD.4=1; // геркон 1 - стоп выгрузка DDRD.1=1; // реле 6.2 - база PORTD.1=0; // реле 6.2 - база DDRD.5=0; // геркон 2 - стоп база PORTD.5=1; // геркон 2 - стоп база ////////////////////////////////////////////// кнопки DDRD.3=1; // (....1...) 3- Вкл(Выкл) фары PORTD.3=0; // (....1...) 3- Вкл(Выкл) фары DDRD.2=1; // (..1.....) 5- Вкл(Выкл) резервный аккумулятор PORTD.2=0; // (..1.....) 5- Вкл(Выкл) резервный аккумулятор ////////////////////////////////////////////// обдув DDRC.2=1; // (.....1..) 2- обдув 40/50/60/70/80; PORTC.2=0; // (.....1..) 2- обдув 40/50/60/70/80; ////////////////////////////////////////////// DDRD.6=1; // потоп PORTD.6=0; // потоп ////////////////////////////////////////////// реверс ШИМ DDRD.7=1; // реверс PORTD.7=0; // реверс //DDRD=0b11111111; //PORTD=0b00000000; //////////////////////////////////////////////////////////////// ////////////////////////////////////////////// таймер № 1 DDRB.1=1; // выход серво1 PORTB.1=0; // выход серво1 DDRB.2=1; // выход серво2 PORTB.2=0; // выход серво2 ///////////////////////// начальное сервы: OCR1A=750; // 1,5 mc = 750 - нейтраль серво1 // выход PB1(OC1A) OCR1B=750; // 1,5 mc = 750 - нейтраль серво2 // выход PB2(OC1B) ///////////////////////// калибровка регулятора: // 500...1010 > 1...2 ms. 1 шаг = 4 u //OCR1B=1010; // 2 mc = 1010 - максимальный уровень регулятора ////////////////////////////////////////////// таймер № 1 ICR1H=0b00100111; // регистр захвата - верхний предел счета = 10.000 ICR1L=0b00010000; // 500.000 Hz/50 Hz = 10.000/20 имп = 1ms / 500 шаг. 1 шаг = 2 us. //TCCR1A=0b10000010; // режим быстрая ШИМ - вкл.PB1(OC1A) - выкл.PB2(OC1B) TCCR1A=0b10100010; // быстрая ШИМ - вкл.PB1(OC1A) - вкл.PB2(OC1B) TCCR1B=0b00011010; // 4 МГц/8=500.000 Hz ///////////////////////// калибровка регулятора: //delay_ms(2000); // 2 сек. // 500...1010 > 1...2 ms. 1 шаг = 4 us //OCR1B=500; // 1 mc = 500 - минимальный уровень регулятора //delay_ms(2000); // 2 сек. ////////////////////////////////////////////// таймер № 2 (ШИМ) DDRB.3=0; // выход ШИМ - выкл. PB3(OC2). PORTB.3=0; // выход ШИМ - выкл. TCCR2=0b01101001; // режим быстрая ШИМ - 15.625 Hz ////////////////////////////////////////////// АЦП ADCSRA=0x84; // вкл ADC. // 4 МГц/16=250.000 Hz ////////////////////////////////////////////// Ст таймер WDTCR=0x1F; // Разрешение изменения ст таймера WDTCR=0x0F; // Вкл. ст таймер // время переполнения: 2,0 c ////////////////////////////////////////////// Global enable interrupts: //#asm("sei") //#asm("cli") //////////////////////////////////////////////////////////////////////////////////////////// /* mesto_12: if (fk != 2) { if (flag_svet) PORTD.3 = 1; // (1.......) 7- Вкл свет // (....1...) 3- Вкл(Выкл) фары }; PORTC.1=1; // перезагрузка: nRF24L01+ выкл. delay_ms(500); PORTC.1=0; // перезагрузка: nRF24L01+ вкл. if (fk != 2) { if (flag_svet) PORTD.3 = 0; // (1.......) 7- Вкл свет // (....1...) 3- Вкл(Выкл) фары }; */ ////////////////////////////////////////////////////////////////////////////// инициализация nRF24L01+ : delay_ms(100); // Power on reset 100ms PORTC.5=0; // SS tx=0b00100001; SPI(); // 0x01 EN_AA: (Enhanced ShockBurst ™) - отключить. tx=0b00000000; SPI(); // EN_AA = 0x00. PORTC.5=1; // SS PORTC.5=0; // SS tx=0b00100100; SPI(); // 0x04 SETUP_RETR: (Enhanced ShockBurst ™) - отключить. tx=0b00000000; SPI(); // SETUP_RETR = 0x00. PORTC.5=1; // SS //PORTC.5=0; // SS //tx=0b00100101; SPI(); // 0x05 RF_CH: Частота //tx=0b01111101; SPI(); // 125 // 2.525GHz. - 01111101(125) - вызывной канал //PORTC.5=1; // SS PORTC.5=0; // SS tx=0b00100110; SPI(); // 0x06 RF_SETUP: Скорость, мощность. tx=0b00100110; SPI(); // 250kbps; 0dBm. PORTC.5=1; // SS PORTC.5=0; // SS tx=0b00110000; SPI(); // 0x10 TX_ADDR_P0: Адрес передатчика tx=Address_Pult; SPI(); // адрес nRF24L01+ //tx=0b11000111; SPI(); // 0x........C7 tx=0b11000111; SPI(); // 0x......C7.. tx=0b11000111; SPI(); // 0x....C7.... tx=0b11000111; SPI(); // 0x..C7...... tx=0b11000111; SPI(); // 0xC7........ PORTC.5=1; // SS //0xE7E7E7E7E7 (11100111 11100111 11100111 11100111 11100111) - По умолчанию PORTC.5=0; // SS tx=0b00101010; SPI(); // 0x0A RX_ADDR_P0: Адрес приёмника. tx=Address_Pult; SPI(); // адрес nRF24L01+ //tx=0b11000111; SPI(); // 0x........C7 tx=0b11000111; SPI(); // 0x......C7.. tx=0b11000111; SPI(); // 0x....C7.... tx=0b11000111; SPI(); // 0x..C7...... tx=0b11000111; SPI(); // 0xC7........ PORTC.5=1; // SS //0xE7E7E7E7E7 (11100111 11100111 11100111 11100111 11100111) - По умолчанию PORTC.5=0; // SS tx=0b00110001; SPI(); // 0x11 RX_PW_P0: Длина полезной нагрузки для приёмника. tx=0b00001000; SPI(); //(LSB)...(MSB)-8 PORTC.5=1; // SS //////////////////////////////////////////////////////////////////////////////////////////// _11: /////////////////////////////////////////////////////////////////////////////////////////// RX: -0,4mc ////////////////////// ch - частота запрос ////////////////////// chb - частота буфер PORTC.5=0; // SS tx=0b00100101; SPI(); // 0x05 RF_CH: Частота tx=chb; SPI(); // chb - частота буфер: 2.400GHz...2.525GHz. 00000000(0)...01111101(125) PORTC.5=1; // SS ////////////////////////// PORTC.5=0; // SS tx=0b00100000; SPI(); // 0x00 CONFIG tx=0b01111111; SPI(); // CRC=2, POWER=1, RX=1. PORTC.5=1; // SS ////////////////////////////////////////////// вкл. RX: PORTC.0=1; // CE 1; вкл. RX ////////////////////////////////////////////////////////////////////////////////////////////////////// _1: #asm("wdr") // Сброс ст таймер 1,0 c //flag_svet = 0; /////////////////////////////////////////////////////////// контроль сигнал: (нет сигнала > 1c) -0,1mc delay_us(100); // цикл c++; // цикл if (c>4000) { // 0,000.3x3.333=1c // 32 пак/c. цикл 0,031.25c. c=0; DDRB.3=0; // выкл. ШИМ - PB3(OC2). PORTD.7=0; // выкл. реверс PORTC.2 = 0; // выкл.(.....1..) 2- обдув 40/50/60/70/80; //регулятор // 500...1010 > 1...2 ms. 1 шаг = 4 us //OCR1B=500; // 1 mc = 500 - минимальный регулятор - СТОП signal(); // сигнал (фары) нет связи chb=0b01111101; // сброс частота буфер > начальное - 2.525GHz. - 01111101(125) -вызывной канал PORTC.0=0; // CE 0; выкл. RX goto _11; // сброс частота буфер > начальное - 2.525GHz. - 01111101(125) -вызывной канал // goto mesto_12; // > инициализация nRF24L01+ }; ////////////////////////////////////////////////////////////////////////////////////////////////////// //k &= 0b01111111; //k |= 0b10001000; //if (PINC.3==0) {k |= 0b01000000;}; //////////////////////////////////////////////////////////////////////////////////////////// выгрузка: ////////////////////////////////////////////// начальное каретки: if ( (PIND.5==1) && (fk==0) ) { // 0 - флаг (каретка свободна) PORTD.1=1; // вкл. реле 6.2 - база << v = v | (1<<3); // (....1...) 1 - вкл. выгрузка модель (реле 6.2 база) << }; if ( (PIND.5==0) && (fk==0) ) { // 0 - флаг (каретка свободна) PORTD.1=0; // выкл. реле 6.2 - база СТОП v = v & 0b11110111; // (....1...) 1 - выкл. выгрузка модель (реле 6.2 база) << }; /////////////////////////////////////////////// выгрузка + флаг (каретка свободна): // (.1......) 6- Вкл выгрузка if ( (k &= 0b01000000) && (PIND.5==0) && (fk==0) ) { // выгрузка=1; геркон 2=0. fk = 1; // 1 - установить флаг (каретка выгрузка >>) PORTD.0=1; // вкл. реле 6.1 - выгрузка >> v = v | (1<<4); // (...1....) 1 - вкл. выгрузка модель (реле 6.1 выгрузка) >> }; ///////////////////// задержка выгрузки по таймеру №1 = 2 с. if ( PIND.4==0 ) { // геркон 2=1; геркон 1=0. fk = 2; // 2 - установить флаг (каретка выгрузка) if (flag_svet) PORTD.3 = 1; // (1.......) 7- Вкл свет // (....1...) 3- Вкл(Выкл) фары if (TIFR & 0b00100000) { // флаг ICF1 - верхний предел счёта таймер 1. // 50 Hz * 100 = 2c. TIFR|=0b00100000; // сброс флага ICF1 таймер 1. y++; // задержка выгрузки }; PORTD.0=0; // выкл. реле 6.1 - выгрузка СТОП v = v & 0b11101111;// (...1....) 1 - выкл. выгрузка модель (реле 6.1 выгрузка) >> }; ////////////////////// if ( y==100 ) { // задержка выгрузки по таймеру 1 - 2 с. k &= 0b10111111; // (.0......) 6- сброс выгрузка. PORTD.1=1; // вкл. реле 6.2 - база << v = v | (1<<3); // (....1...) 1 - вкл. выгрузка модель (реле 6.2 база) << }; // ////////////////////// if ( (PIND.5==0) && (fk==2) ) { // вход геркон 2 - выкл. выгрузка fk = 0; // 0 - сброс флаг (каретка свободна) if (flag_svet) PORTD.3 = 0; // (1.......) 7- Вкл свет // (....1...) 3- Вкл(Выкл) фары y=0; // сброс задержка выгрузки PORTD.1=0; // выкл. реле 6.2 - база СТОП v = v & 0b11110111;// (....1...) 1 - выкл. выгрузка модель (реле 6.2 база) << }; //////////////////////////////////////////////////////////////////////////////////////////////// потоп if (PINC.3) PORTD.6=1; // потоп вкл. else PORTD.6=0; // потоп выкл. /////////////////////////////////////////////////////////////////////////////////////////////////////// // пульт // Data: АЦП - ШИМ - кнопки - АЦП2 - частота - номер пакета пульт - CRC16 - CRC16. ////////////////////////////////////////////////////////////////////////////////////////// RX: //-0,1mc ////////////////////////////////////////////// RX FIFO STATUS: PORTC.5=0; // SS tx=0; SPI(); x=rx; // STATUS PORTC.5=1; // SS if ((x & 0b00001110)==0b00001110) { // .... 111. - RX FIFO - пуст goto _1; // > сброс RX }; ////////////////////////////////////////////// выкл. RX: PORTC.0=0; // CE 0; /////////////////////////////////////////////////////////////////////// RX FIFO: //-0,95mc PORTC.5=0; // SS tx=0b01100001; SPI();// RX FIFO for (x=0;x<8;x++) { tx=0; SPI(); bufer[x]=rx; }; PORTC.5=1; // SS /////////////////////////////////////////////////////////////////////// crc буфер: //-0,95mc crc=0; bcrc=0xFFFF; fcrc(); // сброс // начальное for (b=0;b<8;b=b+2) { bcrc=bufer[b]; bcrc=(bcrc<<8)|bufer[b+1]; fcrc(); }; ////////////////////////////////////////// проверка crc: if (crc==0) { u=bufer[0]; // u - АЦП w=bufer[1]; // w - ШИМ k=bufer[2]; // k - кнопки u2=bufer[3]; // u2 - АЦП2 ch=bufer[4]; // ch - частота n=bufer[5]; // n - номер пакета пульт } /////////////////////////////////////////// ошибка crc: else { PORTC.0=1; // CE 1; вкл. RX c=c+7; // коррекция цикл goto _1; // > сброс RX }; ///////////////////////////////////////////////////////////////////////////////////////// серво1: -0,21mc //PORTB.1=0; PB1(OC1A) // 1 mc/500; 1 шаг = 2 us. e=(int)u*2; // запись данные АЦП (......00 00000000) 0...255 > 0...510; 1 шаг > 2 шаг. e=e+495; // + начальное 500/1 mc + АЦП 0...510 > 495...1005 OCR1A=e; // 495...1005 > 1...2 ms. 1 шаг = 4 us. ////////////////////////////////////////////////////////////////////////////////////////// серво2: //PORTB.2=0; PB2(OC1B) // 1 mc/500; 1 шаг = 2 us. r=(int)u2*2; // запись данные АЦП (......00 00000000) 0...255 > 0...510; 1 шаг > 2 шаг. r=r+495; // + начальное 500/1 mc + АЦП 0...510 > 495...1005 OCR1B=r; // 495...1005 > 1...2 ms. 1 шаг = 4 us. //////////////////////////////////////////////////////////////////////////////////////////////////// ШИМ: ////////////////// реверс: if (w & 0b10000000) PORTD.7=1; // вкл. реверс по флагу else PORTD.7=0; // выкл. реверс по флагу ///////////////// сброс флаг: w = w & 0b01111111; ////////////////// ШИМ вкл./выкл.: if ( 9 > w) DDRB.3=0; // выкл. PB3(OC2). else DDRB.3=1; // вкл. PB3(OC2). ////////////////// ШИМ: OCR2=(w*2)+1; ///////////////////////////////////////////////////////////////////////////////////////////////////////// //k |= 0b10000000; ///////////////////////////////////////////////////////////////////////////////////////////////// кнопки: if (k & 0b10000000){ flag_svet = 1; // (1.......) 7- Вкл свет } else { flag_svet = 0; // (1.......) 7- Вкл свет PORTD.3 = 0; // (....1...) 3- Вкл(Выкл) фары }; //////////////////////////// // 2 - установить флаг (каретка выгрузка) if (fk != 2) { if ( (flag_svet) && (k & 0b00001000) ) { // (1.......) 7- Вкл свет // (....1...) 3- Вкл(Выкл) фары PORTD.3 = 1; } else { PORTD.3 = 0; }; }; //////////////////////////// PORTD.2 = k & 0b00100000; // (..1.....) 5- Вкл(Выкл) резервный аккумулятор ///////////////////////////////////////////////////////////////////////////////////////////////////////// // модель // Data: аккум - температура - вода - аккум2 - датчик тока - номер пакета модель - CRC16 - CRC16. /////////////////////////////////////////////////////////////////////////////////////// g - аккум модель: adc(7); a=ADCW/2; if (a>gb+1) {g=a/2; gb=a;}; if (a> 4); // t0 = 1111.... >> .... 1111 - L младший бит температурного регистра. t1 = (t1 << 4); // t1 = ....1111 << 1111.... - H старший бит температурного регистра. t = t1 | t0; // t = DS18B20. } ////////////////////// ошибка crc else { t=0x00; // ошибка crc (TX/RX DS18B20). // tok=0x00; // ошибка crc (TX/RX DS18B20). }; ////////////////////// сброс // sd - счётчик датчика DS18B20 sd = 0; }; ////////////////////////////////////////////////////////////////////////////////////////////////// обдув: PORTC.2 = k & 0b00000100; // (.....1..) 2- обдув 40/50/60/70/80; //if (t>49) {PORTD.6=1;}; // температура модель t>49 обдув вкл. //if (t<40) {PORTD.6=0;}; // температура модель t<40 обдув выкл. ///////////////////////////////////////////////////////////////////////////////// v - датчик вода модель: v = PINC.3 ? v | (1<<0) : v & 0b11111110; // (.......1) 1 - вкл. вода модель v = PIND.5 ? v & 0b11111101 : v | (1<<1); // (......1.) 1 - вкл. выгрузка модель (геркон 2 база) v = PIND.4 ? v & 0b11111011 : v | (1<<2); // (.....1..) 1 - вкл. выгрузка модель (геркон 1 выгрузка) ///////////////////////////////////////////////////////////////////////////////////// g2 - аккум модель2: adc(6); a=ADCW/2; if (a>gb+1) {g2=a/2; gb2=a;}; if (atokb+1) {tok=a/2; tokb=a;}; if (a>8); // crc bufer[7]=crc; // crc ///////////////////////////////////////////////////////////////////////////////////// TX FIFO: //-0,95mc PORTC.5=0; // SS tx=0b10100000; SPI();// TX FIFO for (x=0;x<8;x++) { tx=bufer[x]; SPI(); }; PORTC.5=1; // SS //////////////////////////////////////////////////////////////////////////////////////////////// вкл. TX: PORTC.0=1; // CE 1; вкл. TX delay_ms(1); // Ждём окончания передачи TX: 250kbps; 0,000.512с + 0,000.130с PLL PORTC.0=0; // CE 0; выкл. TX /////////////////////////////////////////////////////////////////////////////////////////////////// цикл: c=0; // сброс цикл chb = ch; // chb - частота буфер = ch - запрос goto _11; // > RX //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// }