#include //RC - 8 МHz #include //////////////////////////////////////////////////////////////////////////////// //ATmega8: //начальное: RC - 1 МHz: Low E1; Higt D9; // RC - 8 МHz: Low E4; Higt D9; // кварц - 8 МHz: Low EF; Higt C9 (CKOPT -on); XTAL2(PB7) - выход-V // кварц - 8 МHz: Low EF; Higt D9 (CKOPT -off); // XTAL1 - вход: Low E0; Higt D9 //////////////////////////////////////////////////////////////////////////////// //ATmega328: //начальное: RC - 1 МHz: Higt D9; Ext 07; Lok 3F; Low 62 // RC - 8 МHz: Higt D9; Ext 07; Lok 3F; Low E2 // кварц - 8 МHz: Higt D9; Ext 07; Lok 3F; Low E7 XTAL2(PB7) - выход-V // XTAL1(PB6) - вход; Higt D9; Ext 07; Lok 3F; Low 60; //////////////////////////////////////////////////////////////////////////////// //Eth preamble = 8 байт //Eth Data = 60...1514 байт //Eth crc = 4 байт //Eth межпакетный интервал = 12 байт (96 бит * 0,1 мкс = 9,6 мкс). //////////////////////////////////////////////////////////////////////////////// //W5500: //3,3 V - 80 mA. - 10 МБит/c //Socket_0 - MACRAW //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////Sistema_ID: //0 -main //1 -Java //2 -Server //3 -TV //4 -bak //5 -Skype unsigned char ID_Destination = 0; // ID_Destination unsigned char ID_Source = 2; // ID_Source //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////Eth: unsigned char TX_UDP_st = 0; // счёт TX_UDP_st -начальное 0. unsigned int Time_TX_UDP_st = 0; // счёт Time_TX_UDP_st -начальное 0. //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////Sistema: ////////////////////////////////// RX флаги: //TX_int[25] = 0; //0b00001000 -флаг error_key_1 //0b00000100 -флаг error_blok_sys //0b00000010 -флаг error_vektor //0b00000001 -флаг error_EEPROM unsigned char error_key_1 = 0; //-начальное 0. unsigned char blok_sys = 0; //-начальное 0. unsigned char error_vektor = 0; //-начальное 0. unsigned char error_EEPROM = 0; //-начальное 0. unsigned char flag_error_vektor = 0;//-начальное 0. ////////////////////////////////// RX флаги: error_key++: //TX_int[26] = 0; //0...255 - error_key++ unsigned int error_key = 0; // счёт error_key -начальное 0. ////////////////////////////////// TX флаги: лампа_1: (7...4) //TX_int[27] = 0; //0b10000000 -лампа: 7 ON //0b01000000 -лампа: 7 OFF //0b00100000 -лампа: 6 ON //0b00010000 -лампа: 6 OFF //0b00001000 -лампа: 5 ON //0b00000100 -лампа: 5 OFF //0b00000010 -лампа: 4 ON //0b00000001 -лампа: 4 OFF ////////////////////////////////// TX флаги: лампа_0: (3...0) //TX_int[28] = 0; //0b10000000 -лампа: 3 ON //0b01000000 -лампа: 3 OFF //0b00100000 -лампа: 2 ON //0b00010000 -лампа: 2 OFF //0b00001000 -лампа: 1 ON //0b00000100 -лампа: 1 OFF //0b00000010 -лампа: 0 ON //0b00000001 -лампа: 0 OFF ////////////////////////////////// RX флаги: лампа: (7...0) //TX_int[29] = 0; //0b10000000 -лампа: 7 ON/OFF //0b01000000 -лампа: 6 ON/OFF //0b00100000 -лампа: 5 ON/OFF //0b00010000 -лампа: 4 ON/OFF //0b00001000 -лампа: 3 ON/OFF //0b00000100 -лампа: 2 ON/OFF //0b00000010 -лампа: 1 ON/OFF //0b00000001 -лампа: 0 ON/OFF unsigned char Lampa = 0; //-начальное 0. ////////////////////////////////// TX Ползунок: (7...0) //TX_int[30] = 0; //Ползунок 7 Температура MSB (DS18B20) //TX_int[31] = 0; //Ползунок 6 Температура LSB (DS18B20) //TX_int[32] = 0; //Ползунок 5 Температура MAX //TX_int[33] = 0; //Ползунок 4 Температура MIN //TX_int[34] = 0; //TV (номер кнопки)|ток //TX_int[35] = 0; //таймер_H //TX_int[36] = 0; //таймер_L unsigned char slider_7 = 0; //-начальное 0. //Ползунок 7 Температура MSB (DS18B20) unsigned char slider_6 = 0; //-начальное 0. //Ползунок 6 Температура LSB (DS18B20) unsigned char slider_5 = 0; //-начальное 0. //Ползунок 5 Температура MAX unsigned char slider_4 = 0; //-начальное 0. //Ползунок 4 Температура MIN ////////////////////////////////// датчик тока: //unsigned int tok = 0; //-начальное 0. //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////часы: 1c: //TX_int[37] = 0; //часы //TX_int[38] = 0; //минуты //TX_int[39] = 0; //секунды //TX_int[40] = 0; //число //TX_int[41] = 0; //месяц //TX_int[42] = 0; //год //TX_int[43] = 0; //год unsigned char sec; //секунды unsigned char min; //минуты unsigned char hour; //часы unsigned char day; //число unsigned char mon; //месяц unsigned int year; //год //регистр захвата - верхний предел счета = 31250 Hz / 31250 Hz = 1c //unsigned int kor=31250; // коррекция часы //unsigned int kor=31550; // коррекция часы = 5V //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////таймер: 1c: //TX_int[35] = 0; //таймер_H //TX_int[36] = 0; //таймер_L //unsigned int timer; //таймер (0...65535) unsigned char timer_H = 0; //-начальное 0. unsigned char timer_L = 0; //-начальное 0. unsigned char timer_S = 0; //-начальное 0. //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////таймер_H/время_ON/время_OFF/: //TX_int[35] = 0; //таймер_H/время_ON/время_OFF/ //TX_int[36] = 0; //таймер_L unsigned char st_Timer = 0; //счёт Timer -таймер_H/время_ON/время_OFF/ unsigned char hour_ON; //часы ON unsigned char min_ON; //минуты ON unsigned char hour_OFF; //часы OFF unsigned char min_OFF; //минуты OFF //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////бузер: unsigned int st_buzer = 0; // счёт бузер //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////флаг TX_ПК: unsigned char flag_TX_PC = 0; // флаг TX_ПК //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////TX_Eth: unsigned int xTX = 0; //счёт TX unsigned int x1TX = 0; //счёт TX unsigned int x2TX = 0; //счёт TX unsigned int TX_len = 48; //TX_len -начальное 48 //Eth preamble = 8 байт //Eth Data = 60...1514 байт //Eth crc = 4 байт //0...41- UDP/ARP //42...89- Data-48 unsigned char TX_int[]={ //256 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //32 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //64 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //96 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //192 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //224 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 //256 }; //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////TX_MAC, TX_IP, TX_port: unsigned char TX_MAC[6]={0,0,0,0,0,0}; //начальное- 0.0.0.0.0.0 unsigned char TX_IP[4]={0,0,0,0}; //начальное- 0.0.0.0 unsigned int TX_port = 8000; //начальное- 8000 //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////crcTX: //48 байт -3,5mc (8 МГц) unsigned long crcTX = 0; // crc unsigned long bcrcTX = 0; // буфер crc unsigned char aTX = 0; // счёт unsigned int bTX = 0; // счёт void fcrcTX(void) { crcTX = 0xFFFFFFFF; for (bTX=0; bTX<(TX_len-4); bTX=bTX+4) { bcrcTX=TX_int[bTX]; bcrcTX=(bcrcTX<<8)|TX_int[bTX+1]; bcrcTX=(bcrcTX<<8)|TX_int[bTX+2]; bcrcTX=(bcrcTX<<8)|TX_int[bTX+3]; crcTX ^= bcrcTX; for( aTX = 0; aTX < 32; aTX++ ){ if (crcTX & 0x80000000) crcTX = (crcTX << 1) ^ 0x04C11DB7; // Eth. else crcTX = crcTX << 1; }; }; TX_int[TX_len-4]=(crcTX>>24); // crc TX_int[TX_len-3]=(crcTX>>16); // crc TX_int[TX_len-2]=(crcTX>>8); // crc TX_int[TX_len-1]=crcTX; // crc } //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////RX_Eth: unsigned int xRX = 0; //счёт RX unsigned int RX_len = 48; //RX_len -начальное 48 //0...41- UDP/ARP-42 //42...89- Data-48 unsigned char RX_int[]={ //48 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,//16 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,//32 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 //48 }; //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////RX_MAC, RX_IP, RX_port: unsigned char RX_MAC[6]={0,0,0,0,0,0}; //начальное- 0.0.0.0.0.0 unsigned char RX_IP[4]={0,0,0,0}; //начальное- 0.0.0.0 unsigned int RX_port = 8000; //начальное- 8000 //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////crcRX: //48 байт -3,5mc (8 МГц) unsigned long crcRX = 0; // crc unsigned long bcrcRX = 0; // буфер crc unsigned char aRX = 0; // счёт unsigned int bRX = 0; // счёт void fcrcRX(void) { crcRX = 0xFFFFFFFF; for (bRX=0; bRX>1; }; } */ //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////W5500: unsigned int add; // add - адрес данных W5500 (RX/TX) /////////////////////////////////////////////////////////////////////init_W5500: void init_W5500(void) { //00000000 - Address Registers (автоматическая инкрементная адресация +1). //00000000 - Address Registers (автоматическая инкрементная адресация +1). /////////////////////////////////////////////// //Control Registers: //0000 0... - BSB [4:0] блок //.... .0.. - R/W - 0 чтение/1 запись //.... ..00 - OP Mode (VDM)- данные переменной длины (Длина контролируется SS). /////////////////////////////////////////////// RESET W5500: PORTB.0=0; delay_ms(100); PORTB.0=1; delay_ms(100); //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////W5500 PHY: //перед настройкой PHY сделать программный Cброс PHY: PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x2E; SPI(); tx=0x04; SPI(); // Address Registers + Control Registers tx=0x00; SPI(); // Data -0x00 tx=0x00; SPI(); // Data -0x00 PORTB.2=1; // SS W5500 //пишем режим PHY: // 1... .... RST - 1. // .1.. .... программная настройка режима - 1 // ..0. .... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode // ...0 .... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode // .... 1... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode // .... .1.. Duplex Status // .... ..0. Speed Status // .... ...1 Link Status PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x2E; SPI(); tx=0x04; SPI(); // Address Registers + Control Registers tx=0xC8; SPI(); // Data -0xC8 (10 Мбит/с, Full-duplex) tx=0x00; SPI(); // Data -0x00 PORTB.2=1; // SS W5500 //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////Socket_0 - MACRAW: //протокол: пишем протокол MACRAW Socket_0: PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x00; SPI(); tx=0x0C; SPI(); // Address Registers + Control Registers tx=0x04; SPI(); // Data -0x04 // MACRAW // Socket_0 PORTB.2=1; // SS W5500 //пишем команду OPEN Socket_0: PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x01; SPI(); tx=0x0C; SPI(); // Address Registers + Control Registers tx=0x01; SPI(); // Data -0x01 (команда OPEN) PORTB.2=1; // SS W5500 //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////Socket_0 - INT: //INT Mask Socket_0: пишем INT Mask Socket_0: (SIMR) 0x0018 PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x18; SPI(); tx=0x04; SPI(); // Address Registers + Control Registers tx=0x01; SPI(); // Data 0x01 -Enable INT Socket_0. PORTB.2=1; // SS W5500 //INT Mask Socket_0 RECV: пишем INT Mask завершение приёма Socket_0: (Sn_IMR) 0x002C PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x2C; SPI(); tx=0x0C; SPI(); // Address Registers + Control Registers tx=0x04; SPI(); // Data 0x04 -INT Mask завершение приёма. PORTB.2=1; // SS W5500 } //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////Eth: //unsigned int st_auto_init_RX_Ethernet; // счёт st_auto_init_RX_Eth // int ////////////////////////////////////////////////////////////////////init_RX_Eth: /* void init_RX_Ethernet(void) { /////////////////////////////////////////////// RX: SS: PORTC.2=1; // RX_Ethernet SS //delay_ms(1); /////////////////////////////////////////////// SPI: DDRB.5=0; // вход SCK // выкл DDRB.3=0; // вход MOSI // выкл /////////////////////////////////////////////// RX_Ethernet: SCK (внутреняя) PD0: //delay_ms(100); // PORTD.1=0; // выкл // выход SCK (внешняя) PD1 PORTD.0=1; // вкл // выход SCK (внутреняя) PD0 /////////////////////////////////////////////// RESET RX_Ethernet: PORTC.4=0; delay_ms(100); PORTC.4=1; delay_ms(100); /////////////////////////////////////////////// RX: SCK (внешняя) PD1 PORTD.0=0; // выкл // выход SCK (внутреняя) PD0 /////////////////////////////////////////////// RX: SS: PORTC.2=0; // RX_Ethernet SS /////////////////////////////////////////////// RX: SCK (внешняя) PD1 PORTD.1=1; // вкл // выход SCK (внешняя) PD1 /////////////////////////////////////////////// RX END } */ //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////crcEth: /* unsigned long RXcrcEth; // RXcrc unsigned long crcEth; // crc unsigned long bcrcEth; // буфер crc unsigned long mask_crcEth; // маска crc unsigned char mask_Eth; // маска биты unsigned int xEth; // счёт unsigned int x1Eth; // счёт unsigned int x2Eth; // счёт void fcrcEth(void) { //crc Eth: //60...63 -crc /////////////////////////////////////////////// TX_int > RXcrcEth: //0. TX_int > RXcrcEth RXcrcEth = TX_int[UDP_TX_len+3]; // RXcrc RXcrcEth = (RXcrcEth<<8) | TX_int[UDP_TX_len+2]; // RXcrc RXcrcEth = (RXcrcEth<<8) | TX_int[UDP_TX_len+1]; // RXcrc RXcrcEth = (RXcrcEth<<8) | TX_int[UDP_TX_len]; // RXcrc /////////////////////////////////////////////// crc Eth: 60 байт -10 ms (8 мгц) //1. сброс crcEth crcEth=0; TX_int[UDP_TX_len] = 0; // сброс crc Eth =0 TX_int[UDP_TX_len+1] = 0; // сброс crc Eth =0 TX_int[UDP_TX_len+2] = 0; // сброс crc Eth =0 TX_int[UDP_TX_len+3] = 0; // сброс crc Eth =0 /////////////////////////////////////////////// //2. Input Data reflected 0x01 > 0x80 //0...3 Data > crcEth for( x1Eth = 0; x1Eth < 4; x1Eth++ ){ // байты: 4 //////////// mask_Eth = 0x01; //////////// for (xEth=0; xEth<8; xEth++) { // биты 8 /////////// crcEth = crcEth << 1; if ( TX_int[x1Eth] & mask_Eth ) { crcEth |= 1; }; mask_Eth = mask_Eth << 1; /////////// }; /////////// }; /////////////////////////////////////////////// //3. Initial Value 0xFFFFFFFF crcEth ^= 0xFFFFFFFF; /////////////////////////////////////////////// //4. Input Data reflected 0x01 > 0x80 //4...59 Data x2Eth = 4; // смещение 4 байт for( x1Eth = 0; x1Eth < UDP_TX_len; x1Eth++ ){ // байты: UDP_TX_len //////////// mask_Eth = 0x01; //////////// for (xEth=0; xEth<8; xEth++) { // биты =8 /////////// if (crcEth & 0x80000000) { crcEth = crcEth << 1; if ( TX_int[x2Eth] & mask_Eth ) { crcEth |= 1; }; mask_Eth = mask_Eth << 1; crcEth = crcEth ^ 0x04C11DB7; // Eth. } else { crcEth = crcEth << 1; if ( TX_int[x2Eth] & mask_Eth ) { crcEth |= 1; }; mask_Eth = mask_Eth << 1; }; /////////// }; x2Eth++; /////////// }; /////////////////////////////////////////////// //5. Result reflected 0x80 > 0x01 //crc bcrcEth = crcEth; // crc > буфер crcEth = 0; // сброс crc mask_crcEth = 0x00000001; for( xEth = 0; xEth < 32; xEth++ ){ crcEth=(crcEth<<1); //0b00000001 > //0b10000000 if ( bcrcEth & mask_crcEth ) { crcEth |= 1; }; mask_crcEth = mask_crcEth << 1; }; /////////////////////////////////////////////// //6. Final Xor Value //crc crcEth ^= 0xFFFFFFFF; /////////////////////////////////////////////// //7. Data Out //0...59 Data // 60,61,62,63 -crc //TX_int[UDP_TX_len] = crcEth; //TX_int[UDP_TX_len+1] = crcEth>>8; //TX_int[UDP_TX_len+2] = crcEth>>16; //TX_int[UDP_TX_len+3] = crcEth>>24; /////////////////////////////////////////////// } */ //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////TX_PHY: //unsigned char bufer_PHY; //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////RX_Eth: //unsigned char st_bayt_RX_Eth; // счётчик байт RX_Eth //unsigned char bufer_bayt_RX_Eth; // буфер байт RX_Eth //unsigned char flag_RX_Eth; // флаг RX_Eth //unsigned char sdvig_RX_Eth; // сдвиг RX_Eth //unsigned char bufer_sdvig_RX_Eth; // буфер сдвиг RX_Eth //unsigned char mask_RX_Eth; // маска RX_Eth //unsigned char bufer_RX_Eth; // буфер RX_Eth //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////GS: unsigned int u; // АЦП ////////////////////////////////// АЦП: -0,000.070c void adc(unsigned char adc_input) { ADMUX = 0b01000000 | adc_input; // опорное AVCC // канал ADC0...ADC7 delay_us(10); ADCSRA|=0b01000000; while (ADCSRA & 0b01000000); } ////////////////////////////////// GS: unsigned char xGS = 0; // счёт GS unsigned char GS = 0; // буфер GS char GS_TX(void){ GS = 0; // сброс буфер GS /////////////////////////// for (xGS=0; xGS<8; xGS++) { // счёт GS adc(7); u=ADCW; // канал ADC 7 if (u &= 0x0001) GS |= (1< KeySchedule_1 (-4) }; Rows = KeySchedule[32+KE]; // KeySchedule_1>>> KeySchedule[32+KE] = KeySchedule[33+KE]; KeySchedule[33+KE] = KeySchedule[34+KE]; KeySchedule[34+KE] = KeySchedule[35+KE]; KeySchedule[35+KE] = Rows; for (xAES=0; xAES<4; xAES++) { // sbox > KeySchedule_1[16...19] b_sbox = KeySchedule[xAES+32+KE]; KeySchedule[xAES+32+KE] = sbox[b_sbox];// буфер b_sbox }; for (xAES=0; xAES<4; xAES++) { // KeySchedule_1[16...19] ^ KeySchedule_0[0...3] KeySchedule[xAES+32+KE] ^= KeySchedule[xAES+KE]; }; //0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40//(256) KeySchedule[32+KE] ^= rcon[st_rcon]; // // счёт rcon [1...10] st_rcon ++; // счёт rcon // for (xAES=0; xAES<4; xAES++) { // KeySchedule_1[16...19] > KeySchedule_1[20...23] KeySchedule[xAES+36+KE] = KeySchedule[xAES+32+KE]; }; for (xAES=0; xAES<4; xAES++) { // KeySchedule_1[20...23] ^ KeySchedule_0[4...7] KeySchedule[xAES+36+KE] ^= KeySchedule[xAES+4+KE]; }; // for (xAES=0; xAES<4; xAES++) { // KeySchedule_1[20...23] > KeySchedule_1[24...27] KeySchedule[xAES+40+KE] = KeySchedule[xAES+36+KE]; }; for (xAES=0; xAES<4; xAES++) { // KeySchedule_1[24...27] ^ KeySchedule_0[8...11] KeySchedule[xAES+40+KE] ^= KeySchedule[xAES+8+KE]; }; // for (xAES=0; xAES<4; xAES++) { // KeySchedule_1[24...27] > KeySchedule_1[28...31] KeySchedule[xAES+44+KE] = KeySchedule[xAES+40+KE]; }; for (xAES=0; xAES<4; xAES++) { // KeySchedule_1[28...31] ^ KeySchedule_0[12...15] KeySchedule[xAES+44+KE] ^= KeySchedule[xAES+12+KE]; }; // for (xAES=0; xAES<4; xAES++) { // sbox > KeySchedule_1[16...19] b_sbox = KeySchedule[xAES+44+KE]; KeySchedule[xAES+48+KE] = sbox[b_sbox];// буфер b_sbox }; for (xAES=0; xAES<4; xAES++) { // KeySchedule_1[28...31] ^ KeySchedule_0[12...15] KeySchedule[xAES+48+KE] ^= KeySchedule[xAES+16+KE]; }; // for (xAES=0; xAES<4; xAES++) { // KeySchedule_1[20...23] > KeySchedule_1[24...27] KeySchedule[xAES+52+KE] = KeySchedule[xAES+48+KE]; }; for (xAES=0; xAES<4; xAES++) { // KeySchedule_1[24...27] ^ KeySchedule_0[8...11] KeySchedule[xAES+52+KE] ^= KeySchedule[xAES+20+KE]; }; // for (xAES=0; xAES<4; xAES++) { // KeySchedule_1[24...27] > KeySchedule_1[28...31] KeySchedule[xAES+56+KE] = KeySchedule[xAES+52+KE]; }; for (xAES=0; xAES<4; xAES++) { // KeySchedule_1[28...31] ^ KeySchedule_0[12...15] KeySchedule[xAES+56+KE] ^= KeySchedule[xAES+24+KE]; }; // for (xAES=0; xAES<4; xAES++) { // KeySchedule_1[24...27] > KeySchedule_1[28...31] KeySchedule[xAES+60+KE] = KeySchedule[xAES+56+KE]; }; for (xAES=0; xAES<4; xAES++) { // KeySchedule_1[28...31] ^ KeySchedule_0[12...15] KeySchedule[xAES+60+KE] ^= KeySchedule[xAES+28+KE]; }; }; //////////////////////////////////////////////////////////////////////////////// //KeySchedule_1...14: for (xAES=0; xAES<4; xAES++) { KeySchedule[xAES+32+KE] = KeySchedule[xAES+28+KE]; // KeySchedule_0 > KeySchedule_1 (-4) }; Rows = KeySchedule[32+KE]; // KeySchedule_1>>> KeySchedule[32+KE] = KeySchedule[33+KE]; KeySchedule[33+KE] = KeySchedule[34+KE]; KeySchedule[34+KE] = KeySchedule[35+KE]; KeySchedule[35+KE] = Rows; for (xAES=0; xAES<4; xAES++) { // sbox > KeySchedule_1[16...19] b_sbox = KeySchedule[xAES+32+KE]; KeySchedule[xAES+32+KE] = sbox[b_sbox];// буфер b_sbox }; for (xAES=0; xAES<4; xAES++) { // KeySchedule_1[16...19] ^ KeySchedule_0[0...3] KeySchedule[xAES+32+KE] ^= KeySchedule[xAES+KE]; }; //0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40//(256) KeySchedule[32+KE] ^= rcon[st_rcon]; // // счёт rcon [1...10] st_rcon ++; // счёт rcon // for (xAES=0; xAES<4; xAES++) { // KeySchedule_1[16...19] > KeySchedule_1[20...23] KeySchedule[xAES+36+KE] = KeySchedule[xAES+32+KE]; }; for (xAES=0; xAES<4; xAES++) { // KeySchedule_1[20...23] ^ KeySchedule_0[4...7] KeySchedule[xAES+36+KE] ^= KeySchedule[xAES+4+KE]; }; // for (xAES=0; xAES<4; xAES++) { // KeySchedule_1[20...23] > KeySchedule_1[24...27] KeySchedule[xAES+40+KE] = KeySchedule[xAES+36+KE]; }; for (xAES=0; xAES<4; xAES++) { // KeySchedule_1[24...27] ^ KeySchedule_0[8...11] KeySchedule[xAES+40+KE] ^= KeySchedule[xAES+8+KE]; }; // for (xAES=0; xAES<4; xAES++) { // KeySchedule_1[24...27] > KeySchedule_1[28...31] KeySchedule[xAES+44+KE] = KeySchedule[xAES+40+KE]; }; for (xAES=0; xAES<4; xAES++) { // KeySchedule_1[28...31] ^ KeySchedule_0[12...15] KeySchedule[xAES+44+KE] ^= KeySchedule[xAES+12+KE]; }; } //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////Key: unsigned char Key_N_ = 0; //Key_N_ = 0,1 -Номер Key -начальное 0 unsigned char b_Key_N_ = 2; //0,1 -Буфер Номер Key -начальное 2 //////////////////////////////////////// K_int[160] unsigned char K_int[] = { ////////////////////////////////////////0...15 ////////////////vektor_0: 16 байт 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, ////////////////////////////////////////16...47 ////////////////Key_0: 32 байт 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //32 ////////////////////////////////////////48...63 ////////////////vektor_1: 16 байт 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, ////////////////////////////////////////64...95 ////////////////Key_1: 32 байт 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 //32 }; //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////счёт vektor_0: void vektor_0(void) { if (K_int[8] == 0) { //проверка MAX K_int[] больше for (xAES=15; xAES>7; xAES--) { if (K_int[xAES] == 0xFF) {K_int[xAES]=0;} else {K_int[xAES]++; xAES=1;}; }; }; if (K_int[8] != 0) {error_vektor = 1;};// установка флаг error_vektor } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////счёт vektor_1: void vektor_1(void) { if (K_int[56] == 0) { //проверка MAX K_int[] больше for (xAES=63; xAES>55; xAES--) { if (K_int[xAES] == 0xFF) {K_int[xAES]=0;} else {K_int[xAES]++; xAES=1;}; }; }; if (K_int[56] != 0) {error_vektor = 1;};// установка флаг error_vektor } //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////Key_0 > KeySchedule: void Key_0_Key(void) { for (xAES=0; xAES<32; xAES++) { KeySchedule[xAES] = K_int[xAES+16]; // K_int > KeySchedule }; /////////////////////////////// KeyExpansion(); // генерация раундовых ключей } //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////Key_1 > KeySchedule: //Key_1 > KeySchedule: 32 байт void Key_1_Key(void) { for (xAES=0; xAES<32; xAES++) { KeySchedule[xAES] = K_int[xAES+64]; // K_int > KeySchedule }; /////////////////////////////// KeyExpansion(); // генерация раундовых ключей } //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////SubBytes(): void SubBytes(void) { for (xAES=0; xAES<16; xAES++) { // sbox > state[0...15] b_sbox = state[xAES]; // буфер b_sbox state[xAES] = sbox[b_sbox]; }; } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////InvSubBytes(): void InvSubBytes(void) { for (xAES=0; xAES<16; xAES++) { // inv_sbox > state[0...15] inv_b_sbox = state[xAES]; // буфер inv_b_sbox state[xAES] = inv_sbox[inv_b_sbox]; }; } //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////ShiftRows(): //unsigned int Rows = 0; // буфер Rows void ShiftRows(void) { Rows = state[1]; state[1] = state[5]; state[5] = state[9]; state[9] = state[13]; state[13] = Rows; Rows = state[2]; state[2] = state[10]; state[10] = Rows; Rows = state[6]; state[6] = state[14]; state[14] = Rows; Rows = state[3]; state[3] = state[15]; state[15] = state[11]; state[11] = state[7]; state[7] = Rows; } //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////InvShiftRows(): //unsigned int Rows = 0; // буфер Rows void InvShiftRows(void) { Rows = state[1]; state[1] = state[13]; state[13] = state[9]; state[9] = state[5]; state[5] = Rows; Rows = state[2]; state[2] = state[10]; state[10] = Rows; Rows = state[6]; state[6] = state[14]; state[14] = Rows; Rows = state[3]; state[3] = state[7]; state[7] = state[11]; state[11] = state[15]; state[15] = Rows; } //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////MixColumns(): unsigned char state_0 = 0; // буфер state unsigned char state_1 = 0; // буфер state unsigned char state_2 = 0; // буфер state unsigned char state_3 = 0; // буфер state ////////////////////////////////// unsigned char bMix = 0; void Mix(void) { if (bMix & 0x80) bMix = ( bMix << 1 ) ^ 0x1b; //0x1B//P(x)=x^8+x^4+x^3+x+1 else bMix = bMix << 1; } ////////////////////////////////// void MixColumns(void) { for (xAES=0; xAES<16; xAES=xAES+4) { // state[0...15] // 1 цикл = 0,000.4 c ////////////////////////////////// state[0]: //*2 //n*{02} bMix = state[xAES]; Mix(); state_0 = bMix; //*3 //n*{02} + n*{01} bMix = state[xAES+1]; Mix(); state_0 ^= bMix; state_0 ^= state[xAES+1]; //*1 //n*{01} state_0 ^= state[xAES+2]; //*1 //n*{01} state_0 ^= state[xAES+3]; ////////////////////////////////// state[1]: //*1 //n*{01} state_1 = state[xAES]; //*2 //n*{02} bMix = state[xAES+1]; Mix(); state_1^= bMix; //*3 //n*{02} + n*{01} bMix = state[xAES+2]; Mix(); state_1^= bMix; state_1 ^= state[xAES+2]; //*1 //n*{01} state_1 ^= state[xAES+3]; ////////////////////////////////// state[2]: //*1 //n*{01} state_2 = state[xAES]; //*1 //n*{01} state_2 ^= state[xAES+1]; //*2 //n*{02} bMix = state[xAES+2]; Mix(); state_2^= bMix; //*3 //n*{02} + n*{01} bMix = state[xAES+3]; Mix(); state_2^= bMix; state_2 ^= state[xAES+3]; ////////////////////////////////// state[3]: //*3 //n*{02} + n*{01} bMix = state[xAES]; Mix(); state_3 = bMix; state_3 ^= state[xAES]; //*1 //n*{01} state_3 ^= state[xAES+1]; //*1 //n*{01} state_3 ^= state[xAES+2]; //*2 //n*{02} bMix = state[xAES+3]; Mix(); state_3 ^= bMix; ////////////////////////////////// state_0,1,2,3 > state[0...3]: state[xAES] = state_0; state[xAES+1] = state_1; state[xAES+2] = state_2; state[xAES+3] = state_3; ////////////////////////////////// }; } //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////InvMixColumns(): void InvMixColumns(void) { for (xAES=0; xAES<16; xAES=xAES+4) { // state[0...15]// 1 цикл = 0,001.5 c ////////////////////////////////// state[0]: //*e //n*{02}*{02}*{02} + n*{02}*{02} + n*{02} bMix = state[xAES]; Mix(); Mix(); Mix(); state_0 = bMix; bMix = state[xAES]; Mix(); Mix(); state_0 ^= bMix; bMix = state[xAES]; Mix(); state_0 ^= bMix; //*b //n*{02}*{02}*{02} + n*{02} + n*{01} bMix = state[xAES+1]; Mix(); Mix(); Mix(); state_0 ^= bMix; bMix = state[xAES+1]; Mix(); state_0 ^= bMix; state_0 ^= state[xAES+1]; //*d //n*{02}*{02}*{02} + n*{02}*{02} + n*{01} bMix = state[xAES+2]; Mix(); Mix(); Mix(); state_0 ^= bMix; bMix = state[xAES+2]; Mix(); Mix(); state_0 ^= bMix; state_0 ^= state[xAES+2]; //*9 //n*{02}*{02}*{02} + n*{01} bMix = state[xAES+3]; Mix(); Mix(); Mix(); state_0 ^= bMix; state_0 ^= state[xAES+3]; ////////////////////////////////// state[1]: //*9 //n*{02}*{02}*{02} + n*{01} bMix = state[xAES]; Mix(); Mix(); Mix(); state_1 = bMix; state_1 ^= state[xAES]; //*e //n*{02}*{02}*{02} + n*{02}*{02} + n*{02} bMix = state[xAES+1]; Mix(); Mix(); Mix(); state_1 ^= bMix; bMix = state[xAES+1]; Mix(); Mix(); state_1 ^= bMix; bMix = state[xAES+1]; Mix(); state_1 ^= bMix; //*b //n*{02}*{02}*{02} + n*{02} + n*{01} bMix = state[xAES+2]; Mix(); Mix(); Mix(); state_1 ^= bMix; bMix = state[xAES+2]; Mix(); state_1 ^= bMix; state_1 ^= state[xAES+2]; //*d //n*{02}*{02}*{02} + n*{02}*{02} + n*{01} bMix = state[xAES+3]; Mix(); Mix(); Mix(); state_1 ^= bMix; bMix = state[xAES+3]; Mix(); Mix(); state_1 ^= bMix; state_1 ^= state[xAES+3]; ////////////////////////////////// state[2]: //*d //n*{02}*{02}*{02} + n*{02}*{02} + n*{01} bMix = state[xAES]; Mix(); Mix(); Mix(); state_2 = bMix; bMix = state[xAES]; Mix(); Mix(); state_2 ^= bMix; state_2 ^= state[xAES]; //*9 //n*{02}*{02}*{02} + n*{01} bMix = state[xAES+1]; Mix(); Mix(); Mix(); state_2 ^= bMix; state_2 ^= state[xAES+1]; //*e //n*{02}*{02}*{02} + n*{02}*{02} + n*{02} bMix = state[xAES+2]; Mix(); Mix(); Mix(); state_2 ^= bMix; bMix = state[xAES+2]; Mix(); Mix(); state_2 ^= bMix; bMix = state[xAES+2]; Mix(); state_2 ^= bMix; //*b //n*{02}*{02}*{02} + n*{02} + n*{01} bMix = state[xAES+3]; Mix(); Mix(); Mix(); state_2 ^= bMix; bMix = state[xAES+3]; Mix(); state_2 ^= bMix; state_2 ^= state[xAES+3]; ////////////////////////////////// state[3]: //*b //n*{02}*{02}*{02} + n*{02} + n*{01} bMix = state[xAES]; Mix(); Mix(); Mix(); state_3 = bMix; bMix = state[xAES]; Mix(); state_3 ^= bMix; state_3 ^= state[xAES]; //*d //n*{02}*{02}*{02} + n*{02}*{02} + n*{01} bMix = state[xAES+1]; Mix(); Mix(); Mix(); state_3 ^= bMix; bMix = state[xAES+1]; Mix(); Mix(); state_3 ^= bMix; state_3 ^= state[xAES+1]; //*9 //n*{02}*{02}*{02} + n*{01} bMix = state[xAES+2]; Mix(); Mix(); Mix(); state_3 ^= bMix; state_3 ^= state[xAES+2]; //*e //n*{02}*{02}*{02} + n*{02}*{02} + n*{02} bMix = state[xAES+3]; Mix(); Mix(); Mix(); state_3 ^= bMix; bMix = state[xAES+3]; Mix(); Mix(); state_3 ^= bMix; bMix = state[xAES+3]; Mix(); state_3 ^= bMix; ////////////////////////////////// state_0,1,2,3 > state[0...3]: state[xAES] = state_0; state[xAES+1] = state_1; state[xAES+2] = state_2; state[xAES+3] = state_3; ////////////////////////////////// }; } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////AddRoundKey(): void AddRoundKey(void) { xxAES = (x_raund << 4); for (xAES=0; xAES<16; xAES++) { state[xAES] ^= KeySchedule[xxAES]; // state ^ KeySchedule xxAES ++; }; } //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////Шифрование: void encrypt(void) { x_raund = 0; AddRoundKey(); for (x_raund=1; x_raund<14; x_raund++) { //x_raund=1...x_raund=14 SubBytes(); ShiftRows(); MixColumns(); AddRoundKey(); }; x_raund = 14; SubBytes(); ShiftRows(); AddRoundKey(); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////Расшифрование: void decrypt(void) { x_raund = 14; AddRoundKey(); for (x_raund=13; x_raund>0; x_raund--) { //x_raund=13...x_raund=1 InvShiftRows(); InvSubBytes(); AddRoundKey(); InvMixColumns(); }; x_raund = 0; InvShiftRows(); InvSubBytes(); AddRoundKey(); } //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////gamma TX: unsigned char TX_gamma_st = 0; //счёт gamma TX //////////////////////////////////////////////////////////////////шифрование TX: void AES_TX(void) { //выбор ключей: //b_Key_N_ = 0,1 -Буфер Номер Key if (b_Key_N_ != Key_N_){ /////////////////////////////////// b_Key_N_ != Key_N_ : //////////////////////////Key_N == 0 if (Key_N_ == 0){ Key_0_Key(); // Key_0 > KeySchedule }; //////////////////////////Key_N == 1 if (Key_N_ == 1){ Key_1_Key(); //Key_1 > KeySchedule }; ////////////////////////////////// Key_N_ > b_Key_N_ b_Key_N_ = Key_N_; }; //////////////////////////////////vektor: //TX_int[0] = ID_Source; //TX_int[1]...TX_int[15] = vektor[1]...vektor[15]; /////////////////////////////////////////////////////// //vektor > state. for (xAES=0; xAES<16; xAES++) { state[xAES] = TX_int[xAES]; // TX_int > state }; //Блок простой замены. encrypt(); // encrypt //vektor > TX_int. for (xAES=0; xAES<16; xAES++) { TX_int[xAES] = state[xAES]; // state > TX_int }; /////////////////////////////////////////////////////// for (TX_gamma_st = 16; TX_gamma_st < TX_len; TX_gamma_st = TX_gamma_st + 16) { /////////////////////////////////////////////////////// //Блок гаммы. //Блок простой замены. encrypt(); // encrypt //цикл шифрования. for (xAES=0; xAES<16; xAES++) { TX_int[xAES+TX_gamma_st] ^= state[xAES]; // state ^ TX_int }; }; } //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////gamma RX: unsigned char RX_gamma_st = 0; //счёт gamma RX //////////////////////////////////////////////////////////////////////vektor_RX: unsigned char vektor_RX[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //16 байт ///////////////////////////////////////////////////////////////расшифрование RX: void AES_RX(void) { //////////////////////////////////vektor: //TX_int[0] = ID_Source; //TX_int[1]...TX_int[15] = vektor[1]...vektor[15]; /////////////////////////////////////////////////////// //Входной блок > state. for (xAES=0; xAES<16; xAES++) { state[xAES] = TX_int[xAES]; // TX_int > state }; //Блок простой замены. decrypt(); // decrypt //vektor > vektor_RX. for (xAES=0; xAES<16; xAES++) { vektor_RX[xAES] = state[xAES]; // state > vektor }; //Входной блок > state. for (xAES=0; xAES<16; xAES++) { state[xAES] = TX_int[xAES]; // RX_int > state }; //vektor > RX_int. for (xAES=0; xAES<16; xAES++) { TX_int[xAES] = vektor_RX[xAES]; // vektor > RX_int }; /////////////////////////////////////////////////////// for (RX_gamma_st = 16; RX_gamma_st < RX_len; RX_gamma_st = RX_gamma_st + 16) { /////////////////////////////////////////////////////// //Блок гаммы. //Блок простой замены. encrypt(); // encrypt //цикл шифрования. for (xAES=0; xAES<16; xAES++) { TX_int[xAES+RX_gamma_st] ^= state[xAES]; // TX_int ^ state }; }; } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////TX_EEPROM: void TX_EEPROM(void) { /////////////////////////////////////////////// TX: Interrupts: //#asm("sei") // вкл Global Interrupts #asm("cli") // выкл Global Interrupts /////////////////////////////////////////////// сброс флаг error_EEPROM error_EEPROM = 0; /////////////////////////////////////////////// флаг > TX_int TX_int[0] = blok_sys; // blok_sys //-начальное 0. TX_int[1] = Lampa; // Lampa TX_int[2] = 0; // TX_int[3] = slider_5; // Ползунок 5 Температура MAX TX_int[4] = slider_4; // Ползунок 4 Температура MIN TX_int[5] = hour_ON; // часы ON TX_int[6] = min_ON; // минуты ON TX_int[7] = hour_OFF; // часы OFF TX_int[8] = min_OFF; // минуты OFF TX_int[9] = 0; TX_int[10] = 0; TX_int[11] = 0; /////////////////////////////////////////////// crc: //TX_int[12] = 0; //TX_int[13] = 0; //TX_int[14] = 0; //TX_int[15] = 0; /////////////////////////////////////////////// crc буфер EEPROM: TX_len = 16; fcrcTX(); /////////////////////////////////////////////// запись буфер > EEPROM: for (xTX=0; xTX буфер: for (xTX=0; xTX<16; xTX++) { EEAR = xTX; EECR |= 0b00000001; TX_int[xTX] = EEDR; }; /////////////////////////////////////////////// crc буфер EEPROM: RX_len = 16; fcrcRX(); /////////////////////////////////////////////// проверка crc: if (crcRX==0) { ////////////////////////////////////////////// TX_int > флаги blok_sys = TX_int[0]; // blok_sys //-начальное 0. Lampa = TX_int[1]; // Lampa // = TX_int[2]; // slider_5 = TX_int[3]; // Ползунок 5 Температура MAX slider_4 = TX_int[4]; // Ползунок 4 Температура MIN hour_ON = TX_int[5]; // часы ON min_ON = TX_int[6]; // минуты ON hour_OFF = TX_int[7]; // часы OFF min_OFF = TX_int[8]; // минуты OFF } /////////////////////////////////////////////// error_crc: else { error_EEPROM = 1; // флаг error_EEPROM }; /////////////////////////////////////////////// LCD if (error_EEPROM) {PORTD.6=1; PORTD.7=1;} // флаг error_EEPROM else {PORTD.6=0; PORTD.7=0;}; // сброс флаг error_EEPROM /////////////////////////////////////////////// TX: Interrupts: #asm("sei") // вкл Global Interrupts //#asm("cli") // выкл Global Interrupts } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////ARP: //unsigned char ARP[]={ // 60 //Destination MAC: // 0...5 //0xff,0xff,0xff,0xff,0xff,0xff, //Source MAC: // 6...11 //0x00,0x08,0xdc,0x01,0x02,0x03, //Type: //0x08,0x06, // 12,13- Type: ARP (0x0806) /////////////////////////////////////////////// Protocol ARP: //0x00,0x01, // 14,15- Hardware type: Ethernet (1) //0x08,0x00, // 16,17- Protocol type: IP (0x0800) //0x06, // 18- Hardware size: 6 //0x04, // 19- Protocol size: 4 //0x00,0x01, // 20,21- Opcode: request (1) //0x00,0x02, // 20,21- Opcode: reply (2) // 22,23,24,25,26,27- Sender MAC address: //0x00,0x08,0xDC,0x01,0x02,0x03, // 28,29,30,31- Sender IP address: //192,168,0,3, // 32,33,34,35,36,37- Target MAC address: //0xff,0xff,0xff,0xff,0xff,0xff, // 38,39,40,41- Target IP address: //192,168,0,101, /////////////////////////// 42...59- Padding(18 bytes): //0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x00, 0x00 //}; //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////UDP: //unsigned char UDP[]={ // 60 //Destination MAC: // 0...5 //0xff,0xff,0xff,0xff,0xff,0xff, //Source MAC: // 6...11 //0x00,0x08,0xdc,0x01,0x02,0x03, //Type: //0x08,0x00, // 12,13- Type: IP (0x0800) /////////////////////////////////////////////// Protocol IP: 20 bytes //0x45, // 14- Version: 4, Header length: 20 bytes //0x00, // 15- Differentiated Services Field... //(Total Length = Protocol IP(20) + Protocol UDP(8) + Data(18) = 46) //0x00,0x2e, // 16,17- Total Length: 46 //0x00,0x00, // 18,19- Identification: 0 //0x00,0x00, // 20,21- Fragment offset: Don't fragment: 0 //0x40, // 22- Time to live: 64 //0x11, // 23- Protocol: UDP (17) //0x00,0x00, // 24,25- Header checksum IP: // начальное =0 //192,168,0,3, // 26...29- Source IP: //192,168,0,101, // 30...33- Destination IP: /////////////////////////////////////////////// Protocol UDP //0x00,0x50, // 34,35- Source port: 80 //0x00,0x50, // 36,37- Destination port: 80 //(Length = Protocol UDP(8) + Data(18) = 26) //0x00,0x1a, // 38,39- Length: 26 //0x00,0x00, // 40,41- checksum UDP: // начальное =0 /////////////////////////// 42...59- Padding(18 bytes): //0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0x00, 0x00 //}; /////////////////////////////////////////////// Header checksum IP: //Header checksum IP = 0x00+0x00 // сброс Header checksum IP //Version + Differentiated + Total Length + Identification + Fragment offset + //Time to live + Protocol + Header checksum IP + Source IP + Destination IP //0x45+0x00+0x00+0x2e+0x00+0x00+0x00+0x00+ //0x80+0x11+0x00+0x00+0xc0+0xa8+0x00+0x03+0xc0+0xa8+0x00+0x65 //Header checksum IP =~Header checksum IP //Проверка КС: расчётная == FFFF /////////////////////////////////////////////// checksum UDP: //checksum UDP= 0x00+0x00 // сброс UDP checksum //Source IP + Destination IP + Protocol + Length + //Source port + Destination port + Length + checksum UDP + Data //0xc0+0xa8+0x00+0x03+0xc0+0xa8+0x00+0x65+0x11+0x00+0x1a+ //0x00+0x50+0x00+0x50+0x00+0x1a+0x00+0x00+ //0x00+0x00+0x00+0x00+0x00+0x00+0x00+0x00+0x00+0x00+0x00+0x00+0x00+0x00+ //0x00+0x00+0x00+0x00 //checksum UDP =~checksum UDP //Проверка КС: расчётная == FFFF //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////TX_ARP_router: (запрос) /* void TX_ARP_router(void) { /////////////////////////////////////////////// TX: 0xFF > Destination MAC: TX_int[0] = 0xFF; TX_int[1] = 0xFF; TX_int[2] = 0xFF; TX_int[3] = 0xFF; TX_int[4] = 0xFF; TX_int[5] = 0xFF; /////////////////////////////////////////////// TX: Source MAC: TX_int[6] = 0x00; TX_int[7] = 0x08; TX_int[8] = 0xdc; TX_int[9] = 0x01; TX_int[10] = 0x02; TX_int[11] = 0x03; /////////////////////////////////////////////// TX: Type: ARP (0x0806) TX_int[12] = 0x08; TX_int[13] = 0x06; /////////////////////////////////////////////// TX: Hardware type: Ethernet (1) TX_int[14] = 0x00; TX_int[15] = 0x01; /////////////////////////////////////////////// TX: Protocol type: IP (0x0800) TX_int[16] = 0x08; TX_int[17] = 0x00; /////////////////////////////////////////////// TX: Hardware size: 6 TX_int[18] = 0x06; /////////////////////////////////////////////// TX: Protocol size: 4 TX_int[19] = 0x04; /////////////////////////////////////////////// TX: Opcode: request (1) (запрос) TX_int[20] = 0x00; TX_int[21] = 0x01; /////////////////////////////////////////////// TX: Opcode: reply (2) (ответ) //TX_int[20] = 0x00; //TX_int[21] = 0x02; /////////////////////////////////////////////// TX: 0x00 > Target MAC address: TX_int[32] = 0x00; TX_int[33] = 0x00; TX_int[34] = 0x00; TX_int[35] = 0x00; TX_int[36] = 0x00; TX_int[37] = 0x00; /////////////////////////////////////////////// TX: Target IP address: TX_int[38] = 192; // router TX_int[39] = 168; // router TX_int[40] = 0; // router TX_int[41] = 1; // router /////////////////////////////////////////////// TX: Sender MAC address: TX_int[22] = 0x00; // TX_int[23] = 0x08; // TX_int[24] = 0xdc; // TX_int[25] = 0x01; // TX_int[26] = 0x02; // TX_int[27] = 0x03; // /////////////////////////////////////////////// TX: Sender IP address: TX_int[28] = 192; TX_int[29] = 168; TX_int[30] = 0; TX_int[31] = 3; /////////////////////////////////////////////// TX: Padding(18 bytes): for (xTX=42; xTX<60; xTX++) { TX_int[xTX] = 0; }; /////////////////////////////////////////////// //TX_MACRAW: /////////////////////////////////////////////// TX: W5500: //читаем начальный адрес для записи данных Socket_0 Sn_TX_WR MACRAW: PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x24; SPI(); tx=0x08; SPI(); // Address Registers + Control Registers tx=0x00; SPI(); add=rx; // Data -Sn_TX_WR0 -начальный адрес для записи данных //сарший регистр tx=0x00; SPI(); add=(add<<8)|rx; // Data -Sn_TX_WR1 -начальный адрес для записи данных //младший регистр PORTB.2=1; // SS W5500 /////////////////////////////////////////////// TX: W5500: //пишем данные с начального адреса буфера Socket 0 TX Buffer MACRAW: PORTB.2=0; // SS W5500 tx=(add>>8); SPI(); tx=add; SPI(); tx=0x14; SPI(); // Address = add for (xTX=0; xTX<60; xTX++) { tx = TX_int[xTX]; SPI(); add++; // ARP > W5500, TX_len=60 }; PORTB.2=1; // SS W5500 /////////////////////////////////////////////// TX: W5500: //пишем регистр указателя Socket 0 Sn_TX_WR до увеличенного значения MACRAW: PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x24; SPI(); tx=0x0C; SPI(); // Address Registers + Control Registers tx=(add>>8); SPI(); // Data -Sn_TX_WR0 -конечный адрес передачи данных //сарший регистр tx=add; SPI(); // Data -Sn_TX_WR1 -конечный адрес передачи данных //младший регистр PORTB.2=1; // SS W5500 /////////////////////////////////////////////// TX: W5500: //пишем команду передачи SEND Socket 0 Command MACRAW: PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x01; SPI(); tx=0x0C; SPI(); // Address Registers + Control Registers tx=0x21; SPI(); // Data -0x21 (команда SEND без автоматического ARP-запроса) PORTB.2=1; // SS W5500 /////////////////////////////////////////////// TX: W5500: //if (Sn_CR == 0x00) по окончанию передачи статус меняется на Sn_CR = 0x00 /////////////////////////////////////////////// TX: очистка буфера TX_int: for (xTX=0; xTX<60; xTX++) { // TX_len=60 TX_int[xTX] = 0; }; } */ //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////TX_ARP: (ответ) void TX_ARP(void) { /////////////////////////////////////////////// TX: Source MAC > Destination MAC: TX_int[0] = TX_int[6]; TX_int[1] = TX_int[7]; TX_int[2] = TX_int[8]; TX_int[3] = TX_int[9]; TX_int[4] = TX_int[10]; TX_int[5] = TX_int[11]; /////////////////////////////////////////////// TX: Source MAC: TX_int[6] = 0x00; TX_int[7] = 0x08; TX_int[8] = 0xdc; TX_int[9] = 0x01; TX_int[10] = 0x02; TX_int[11] = 0x03; /////////////////////////////////////////////// TX: Type: ARP (0x0806) TX_int[12] = 0x08; TX_int[13] = 0x06; /////////////////////////////////////////////// TX: Hardware type: Ethernet (1) TX_int[14] = 0x00; TX_int[15] = 0x01; /////////////////////////////////////////////// TX: Protocol type: IP (0x0800) TX_int[16] = 0x08; TX_int[17] = 0x00; /////////////////////////////////////////////// TX: Hardware size: 6 TX_int[18] = 0x06; /////////////////////////////////////////////// TX: Protocol size: 4 TX_int[19] = 0x04; /////////////////////////////////////////////// TX: Opcode: request (1) (запрос) //TX_int[20] = 0x00; //TX_int[21] = 0x01; /////////////////////////////////////////////// TX: Opcode: reply (2) (ответ) TX_int[20] = 0x00; TX_int[21] = 0x02; /////////////////////////////////////////////// TX: Sender MAC address > Target MAC address: TX_int[32] = TX_int[22]; TX_int[33] = TX_int[23]; TX_int[34] = TX_int[24]; TX_int[35] = TX_int[25]; TX_int[36] = TX_int[26]; TX_int[37] = TX_int[27]; /////////////////////////////////////////////// TX: Sender IP address > Target IP address: TX_int[38] = TX_int[28]; TX_int[39] = TX_int[29]; TX_int[40] = TX_int[30]; TX_int[41] = TX_int[31]; /////////////////////////////////////////////// TX: Sender MAC address: TX_int[22] = 0x00; TX_int[23] = 0x08; TX_int[24] = 0xdc; TX_int[25] = 0x01; TX_int[26] = 0x02; TX_int[27] = 0x03; /////////////////////////////////////////////// TX: Sender IP address: TX_int[28] = 192; TX_int[29] = 168; TX_int[30] = 0; TX_int[31] = 3; /////////////////////////////////////////////// TX: Padding(18 bytes): for (xTX=42; xTX<60; xTX++) { TX_int[xTX] = 0; }; /////////////////////////////////////////////// //TX_MACRAW: /////////////////////////////////////////////// TX: W5500: //читаем начальный адрес для записи данных Socket_0 Sn_TX_WR MACRAW: PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x24; SPI(); tx=0x08; SPI(); // Address Registers + Control Registers tx=0x00; SPI(); add=rx; // Data -Sn_TX_WR0 -начальный адрес для записи данных //сарший регистр tx=0x00; SPI(); add=(add<<8)|rx; // Data -Sn_TX_WR1 -начальный адрес для записи данных //младший регистр PORTB.2=1; // SS W5500 /////////////////////////////////////////////// TX: W5500: //пишем данные с начального адреса буфера Socket 0 TX Buffer MACRAW: PORTB.2=0; // SS W5500 tx=(add>>8); SPI(); tx=add; SPI(); tx=0x14; SPI(); // Address = add for (xTX=0; xTX<60; xTX++) { tx = TX_int[xTX]; SPI(); add++; // ARP > W5500, TX_len=60 }; PORTB.2=1; // SS W5500 /////////////////////////////////////////////// TX: W5500: //пишем регистр указателя Socket 0 Sn_TX_WR до увеличенного значения MACRAW: PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x24; SPI(); tx=0x0C; SPI(); // Address Registers + Control Registers tx=(add>>8); SPI(); // Data -Sn_TX_WR0 -конечный адрес передачи данных //сарший регистр tx=add; SPI(); // Data -Sn_TX_WR1 -конечный адрес передачи данных //младший регистр PORTB.2=1; // SS W5500 /////////////////////////////////////////////// TX: W5500: //пишем команду передачи SEND Socket 0 Command MACRAW: PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x01; SPI(); tx=0x0C; SPI(); // Address Registers + Control Registers tx=0x21; SPI(); // Data -0x21 (команда SEND без автоматического ARP-запроса) PORTB.2=1; // SS W5500 /////////////////////////////////////////////// TX: W5500: //if (Sn_CR == 0x00) по окончанию передачи статус меняется на Sn_CR = 0x00 /////////////////////////////////////////////// TX: очистка буфера TX_int: for (xTX=0; xTX<60; xTX++) { // TX_len=60 TX_int[xTX] = 0; }; } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////TX_UDP: void TX_UDP(void) { /////////////////////////////////////////////// TX: TX_len //TX_len = 48; // TX_len 48/208 -начальное 48 /////////////////////////////////////////////// TX: UDP_TX_len UDP_TX_len = 42 + TX_len; // UDP_TX_len = UDP(42) + TX_len(48) /////////////////////////////////////////////// TX: vektor: //TX_int[0] = ID_Source; TX_int[0] = ID_Source; /////////////////////////////////////////////// TX: vektor: //TX_int[1]...TX_int[15] = vektor[1]...vektor[15]; /////////////////////////////////////////////// TX: vektor > int: //////////////////////////Key_N == 0 if (Key_N_ == 0){ /////////////////////////RX: флаг error_vektor if (flag_error_vektor == 0) { vektor_0(); // счёт vektor_0 if (error_vektor == 1) {flag_error_vektor = 1;}; // флаг error_vektor }; for (xTX=1; xTX<16; xTX++) { TX_int[xTX] = K_int[xTX]; // vektor_0 > TX_int }; }; //////////////////////////Key_N == 1 if (Key_N_ == 1){ /////////////////////////RX: флаг error_vektor if (flag_error_vektor == 0) { vektor_1(); // счёт vektor_1 if (error_vektor == 1) {flag_error_vektor = 1;}; // флаг error_vektor }; for (xTX=1; xTX<16; xTX++) { TX_int[xTX] = K_int[xTX+48]; // vektor_1 > TX_int }; }; /////////////////////////////////////////////// TX: RX_IP > TX_int: TX_int[16] = RX_IP[0]; // RX_IP TX_int[17] = RX_IP[1]; // RX_IP TX_int[18] = RX_IP[2]; // RX_IP TX_int[19] = RX_IP[3]; // RX_IP /////////////////////////////////////////////// TX: TX_len > TX_int: TX_int[20] = (TX_len>>8); // TX_len TX_int[21] = (TX_len); // TX_len & 0xFF /////////////////////////////////////////////// TX: ID_Destination: TX_int[22] = ID_Destination; /////////////////////////////////////////////// TX: ID_Source: TX_int[23] = ID_Source; /////////////////////////////////////////////// TX: проверка error_vektor: if (error_vektor == 1) { for (xTX=16; xTX TX_int(48) }; }; /////////////////////////////////////////////// //UDP: //0...41- UDP /////////////////////////////////////////////// TX: TX_int >> сдвиг UDP(42) // UDP_TX_len = UDP(42) + TX_len(48) //x1TX=89; //x2TX=47; x1TX=TX_len + 41; //89 UDP(42) x2TX=TX_len - 1; //47 TX_len(48) for (xTX=0; xTX Destination MAC: TX_int[0] = TX_MAC[0]; TX_int[1] = TX_MAC[1]; TX_int[2] = TX_MAC[2]; TX_int[3] = TX_MAC[3]; TX_int[4] = TX_MAC[4]; TX_int[5] = TX_MAC[5]; /////////////////////////////////////////////// TX: Source MAC: TX_int[6] = 0x00; TX_int[7] = 0x08; TX_int[8] = 0xdc; TX_int[9] = 0x01; TX_int[10] = 0x02; TX_int[11] = 0x03; /////////////////////////////////////////////// TX: Type: IP (0x0800) TX_int[12] = 0x08; TX_int[13] = 0x00; /////////////////////////////////////////////// TX: Version: 4, Header length: 20 bytes TX_int[14] = 0x45; /////////////////////////////////////////////// TX: Differentiated Services Field TX_int[15] = 0x00; /////////////////////////////////////////////// TX: Total Length //(Total Length = Protocol IP(20) + Protocol UDP(8) + Data(18) = 46) Total_Length_UDP = 28 + TX_len; // 28 + TX_len TX_int[16] = (Total_Length_UDP>>8); TX_int[17] = Total_Length_UDP; /////////////////////////////////////////////// TX: Identification TX_int[18] = 0x00; TX_int[19] = 0x00; /////////////////////////////////////////////// TX: Fragment offset: Don't fragment: 0 TX_int[20] = 0x00; TX_int[21] = 0x00; /////////////////////////////////////////////// TX: Time to live: 128 TX_int[22] = 0x80; /////////////////////////////////////////////// TX: Protocol: UDP (17) TX_int[23] = 0x11; /////////////////////////////////////////////// TX: Header checksum IP: //TX_int[24] = 0x00; //TX_int[25] = 0x00; /////////////////////////////////////////////// TX: Source IP: TX_int[26] = 192; TX_int[27] = 168; TX_int[28] = 0; TX_int[29] = 3; /////////////////////////////////////////////// TX: TX_IP > Destination IP: TX_int[30] = TX_IP[0]; TX_int[31] = TX_IP[1]; TX_int[32] = TX_IP[2]; TX_int[33] = TX_IP[3]; /////////////////////////////////////////////// TX: Source port: 8000 TX_int[34] = 0x1F; TX_int[35] = 0x40; /////////////////////////////////////////////// TX: TX_port > Destination port: TX_int[36] = (TX_port>>8); TX_int[37] = TX_port; /////////////////////////////////////////////// TX: Length: //(Length = Protocol UDP(8) + Data(18) = 26) Length_UDP = 8 + TX_len; // 8 + TX_len TX_int[38] = (Length_UDP>>8); TX_int[39] = Length_UDP; /////////////////////////////////////////////// TX: checksum UDP: //TX_int[40] = 0; //TX_int[41] = 0; /////////////////////////////////////////////// //Header_checksum_IP: //0...41- UDP /////////////////////////////////////////////// TX: Header_checksum_IP: KS = 0; // сброс KS TX_int[24] = 0; // сброс Header_checksum_IP =0 TX_int[25] = 0; // сброс Header_checksum_IP =0 /////////////////////////////////////////////// 14...33 for (xTX=14; xTX<34; xTX+=2) { b_KS = TX_int[xTX]; x1TX = xTX + 1; b_KS = (b_KS<<8)|TX_int[x1TX]; KS += b_KS; if (KS & 0xffff0000) { KS &= 0x0000ffff; KS += 0x00000001; }; }; /////////////////////////////////////////////// Header_checksum_IP > TX_int: KS = ~KS; TX_int[24] = (KS>>8); TX_int[25] = KS; /////////////////////////////////////////////// //checksum_UDP: //MIN=18; MAX=1472. /////////////////////////////////////////////// TX: checksum_UDP: KS = 0; // сброс KS TX_int[40] = 0; // сброс checksum_UDP =0 TX_int[41] = 0; // сброс checksum_UDP =0 /////////////////////////////////////////////// 26...33 //Source IP + Destination IP for (xTX=26; xTX<34; xTX+=2) { b_KS = TX_int[xTX]; x1TX = xTX + 1; b_KS = (b_KS<<8)|TX_int[x1TX]; KS += b_KS; if (KS & 0xffff0000) { KS &= 0x0000ffff; KS += 0x00000001; }; }; /////////////////////////////////////////////// 23 //Protocol KS += TX_int[23]; if (KS & 0xffff0000) { KS &= 0x0000ffff; KS += 0x00000001; }; /////////////////////////////////////////////// 38,39 //Length b_KS = TX_int[38]; b_KS = (b_KS<<8)|TX_int[39]; KS += b_KS; if (KS & 0xffff0000) { KS &= 0x0000ffff; KS += 0x00000001; }; /////////////////////////////////////////////// 34... //Source port + Destination port + Length + Data(MIN=18) for (xTX=34; xTX TX_int: KS = ~KS; TX_int[40] = (KS>>8); TX_int[41] = KS; /////////////////////////////////////////////// //TX_MACRAW: /////////////////////////////////////////////// TX: W5500: //читаем начальный адрес для записи данных Socket_0 Sn_TX_WR MACRAW: PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x24; SPI(); tx=0x08; SPI(); // Address Registers + Control Registers tx=0x00; SPI(); add=rx; // Data -Sn_TX_WR0 -начальный адрес для записи данных //сарший регистр tx=0x00; SPI(); add=(add<<8)|rx; // Data -Sn_TX_WR1 -начальный адрес для записи данных //младший регистр PORTB.2=1; // SS W5500 /////////////////////////////////////////////// TX: W5500: //пишем данные с начального адреса буфера Socket 0 TX Buffer MACRAW: PORTB.2=0; // SS W5500 tx=(add>>8); SPI(); tx=add; SPI(); tx=0x14; SPI(); // Address = add for (xTX=0; xTX>8); SPI(); // Data -Sn_TX_WR0 -конечный адрес передачи данных //сарший регистр tx=add; SPI(); // Data -Sn_TX_WR1 -конечный адрес передачи данных //младший регистр PORTB.2=1; // SS W5500 /////////////////////////////////////////////// TX: W5500 SEND //пишем команду передачи SEND Socket 0 Command MACRAW: PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x01; SPI(); tx=0x0C; SPI(); // Address Registers + Control Registers tx=0x21; SPI(); // Data -0x21 (команда SEND без автоматического ARP-запроса) PORTB.2=1; // SS W5500 /////////////////////////////////////////////// //if (Sn_CR == 0x00) по окончанию передачи статус меняется на Sn_CR = 0x00 /////////////////////////////////////////////// TX: очистка буфера TX_int: for (xTX=0; xTX> сдвиг UDP(42) // UDP_TX_len = UDP(42) + TX_len(48) //x1TX=89; //x2TX=47; x1TX=TX_len + 41; //89 UDP(42) x2TX=TX_len - 1; //47 TX_len(48) for (xTX=0; xTX Destination MAC: TX_int[0] = TX_MAC[0]; TX_int[1] = TX_MAC[1]; TX_int[2] = TX_MAC[2]; TX_int[3] = TX_MAC[3]; TX_int[4] = TX_MAC[4]; TX_int[5] = TX_MAC[5]; /////////////////////////////////////////////// TX: Source MAC: TX_int[6] = 0x00; TX_int[7] = 0x08; TX_int[8] = 0xdc; TX_int[9] = 0x01; TX_int[10] = 0x02; TX_int[11] = 0x03; /////////////////////////////////////////////// TX: Type: IP (0x0800) TX_int[12] = 0x08; TX_int[13] = 0x00; /////////////////////////////////////////////// TX: Version: 4, Header length: 20 bytes TX_int[14] = 0x45; /////////////////////////////////////////////// TX: Differentiated Services Field TX_int[15] = 0x00; /////////////////////////////////////////////// TX: Total Length //(Total Length = Protocol IP(20) + Protocol UDP(8) + Data(18) = 46) Total_Length_UDP = 28 + TX_len; // 28 + TX_len TX_int[16] = (Total_Length_UDP>>8); TX_int[17] = Total_Length_UDP; /////////////////////////////////////////////// TX: Identification TX_int[18] = 0x00; TX_int[19] = 0x00; /////////////////////////////////////////////// TX: Fragment offset: Don't fragment: 0 TX_int[20] = 0x00; TX_int[21] = 0x00; /////////////////////////////////////////////// TX: Time to live: 128 TX_int[22] = 0x80; /////////////////////////////////////////////// TX: Protocol: UDP (17) TX_int[23] = 0x11; /////////////////////////////////////////////// TX: Header checksum IP: //TX_int[24] = 0x00; //TX_int[25] = 0x00; /////////////////////////////////////////////// TX: Source IP: TX_int[26] = 192; TX_int[27] = 168; TX_int[28] = 0; TX_int[29] = 3; /////////////////////////////////////////////// TX: TX_IP > Destination IP: TX_int[30] = TX_IP[0]; TX_int[31] = TX_IP[1]; TX_int[32] = TX_IP[2]; TX_int[33] = TX_IP[3]; /////////////////////////////////////////////// TX: Source port: 8000 TX_int[34] = 0x1F; TX_int[35] = 0x40; /////////////////////////////////////////////// TX: TX_port > Destination port: TX_int[36] = (TX_port>>8); TX_int[37] = TX_port; /////////////////////////////////////////////// TX: Length: //(Length = Protocol UDP(8) + Data(18) = 26) Length_UDP = 8 + TX_len; // 8 + TX_len TX_int[38] = (Length_UDP>>8); TX_int[39] = Length_UDP; /////////////////////////////////////////////// TX: checksum UDP: //TX_int[40] = 0; //TX_int[41] = 0; /////////////////////////////////////////////// //Header_checksum_IP: //0...41- UDP /////////////////////////////////////////////// TX: Header_checksum_IP: KS = 0; // сброс KS TX_int[24] = 0; // сброс Header_checksum_IP =0 TX_int[25] = 0; // сброс Header_checksum_IP =0 /////////////////////////////////////////////// 14...33 for (xTX=14; xTX<34; xTX+=2) { b_KS = TX_int[xTX]; x1TX = xTX + 1; b_KS = (b_KS<<8)|TX_int[x1TX]; KS += b_KS; if (KS & 0xffff0000) { KS &= 0x0000ffff; KS += 0x00000001; }; }; /////////////////////////////////////////////// Header_checksum_IP > TX_int: KS = ~KS; TX_int[24] = (KS>>8); TX_int[25] = KS; /////////////////////////////////////////////// //checksum_UDP: //MIN=18; MAX=1472. /////////////////////////////////////////////// TX: checksum_UDP: KS = 0; // сброс KS TX_int[40] = 0; // сброс checksum_UDP =0 TX_int[41] = 0; // сброс checksum_UDP =0 /////////////////////////////////////////////// 26...33 //Source IP + Destination IP for (xTX=26; xTX<34; xTX+=2) { b_KS = TX_int[xTX]; x1TX = xTX + 1; b_KS = (b_KS<<8)|TX_int[x1TX]; KS += b_KS; if (KS & 0xffff0000) { KS &= 0x0000ffff; KS += 0x00000001; }; }; /////////////////////////////////////////////// 23 //Protocol KS += TX_int[23]; if (KS & 0xffff0000) { KS &= 0x0000ffff; KS += 0x00000001; }; /////////////////////////////////////////////// 38,39 //Length b_KS = TX_int[38]; b_KS = (b_KS<<8)|TX_int[39]; KS += b_KS; if (KS & 0xffff0000) { KS &= 0x0000ffff; KS += 0x00000001; }; /////////////////////////////////////////////// 34... //Source port + Destination port + Length + Data(MIN=18) for (xTX=34; xTX TX_int: KS = ~KS; TX_int[40] = (KS>>8); TX_int[41] = KS; /////////////////////////////////////////////// //TX_MACRAW: /////////////////////////////////////////////// TX: W5500: //читаем начальный адрес для записи данных Socket_0 Sn_TX_WR MACRAW: PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x24; SPI(); tx=0x08; SPI(); // Address Registers + Control Registers tx=0x00; SPI(); add=rx; // Data -Sn_TX_WR0 -начальный адрес для записи данных //сарший регистр tx=0x00; SPI(); add=(add<<8)|rx; // Data -Sn_TX_WR1 -начальный адрес для записи данных //младший регистр PORTB.2=1; // SS W5500 /////////////////////////////////////////////// TX: W5500: //пишем данные с начального адреса буфера Socket 0 TX Buffer MACRAW: PORTB.2=0; // SS W5500 tx=(add>>8); SPI(); tx=add; SPI(); tx=0x14; SPI(); // Address = add for (xTX=0; xTX>8); SPI(); // Data -Sn_TX_WR0 -конечный адрес передачи данных //сарший регистр tx=add; SPI(); // Data -Sn_TX_WR1 -конечный адрес передачи данных //младший регистр PORTB.2=1; // SS W5500 /////////////////////////////////////////////// TX: W5500 SEND //пишем команду передачи SEND Socket 0 Command MACRAW: PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x01; SPI(); tx=0x0C; SPI(); // Address Registers + Control Registers tx=0x21; SPI(); // Data -0x21 (команда SEND без автоматического ARP-запроса) PORTB.2=1; // SS W5500 /////////////////////////////////////////////// //if (Sn_CR == 0x00) по окончанию передачи статус меняется на Sn_CR = 0x00 /////////////////////////////////////////////// TX: очистка буфера TX_int: for (xTX=0; xTX int: //////////////////////////Key_N == 0 if (Key_N_ == 0){ /////////////////////////RX: флаг error_vektor if (flag_error_vektor == 0) { vektor_0(); // счёт vektor_0 if (error_vektor == 1) {flag_error_vektor = 1;}; // флаг error_vektor }; for (xTX=1; xTX<16; xTX++) { TX_int[xTX] = K_int[xTX]; // vektor_0 > TX_int }; }; //////////////////////////Key_N == 1 if (Key_N_ == 1){ /////////////////////////RX: флаг error_vektor if (flag_error_vektor == 0) { vektor_1(); // счёт vektor_1 if (error_vektor == 1) {flag_error_vektor = 1;}; // флаг error_vektor }; for (xTX=1; xTX<16; xTX++) { TX_int[xTX] = K_int[xTX+48]; // vektor_1 > TX_int }; }; /////////////////////////////////////////////// TX: RX_IP > TX_int: TX_int[16] = RX_IP[0]; // RX_IP TX_int[17] = RX_IP[1]; // RX_IP TX_int[18] = RX_IP[2]; // RX_IP TX_int[19] = RX_IP[3]; // RX_IP /////////////////////////////////////////////// TX: TX_len > TX_int: TX_int[20] = (TX_len>>8); // TX_len TX_int[21] = (TX_len & 0x00FF);// TX_len /////////////////////////////////////////////// TX: ID_Destination: TX_int[22] = ID_Destination; /////////////////////////////////////////////// TX: ID_Source: TX_int[23] = ID_Source; /////////////////////////////////////////////// TX: проверка error_vektor: if (error_vektor == 1) { for (xTX=16; xTX TX_int(48) }; }; /////////////////////////////////////////////// //UDP: //0...41- UDP /////////////////////////////////////////////// TX: TX_int >> сдвиг UDP(42) // UDP_TX_len = UDP(42) + TX_len(48) //x1TX=89; //x2TX=47; x1TX=TX_len + 41; //89 UDP(42) x2TX=TX_len - 1; //47 TX_len(48) for (xTX=0; xTX Destination MAC: TX_int[0] = TX_MAC[0]; TX_int[1] = TX_MAC[1]; TX_int[2] = TX_MAC[2]; TX_int[3] = TX_MAC[3]; TX_int[4] = TX_MAC[4]; TX_int[5] = TX_MAC[5]; /////////////////////////////////////////////// TX: Source MAC: TX_int[6] = 0x00; TX_int[7] = 0x08; TX_int[8] = 0xdc; TX_int[9] = 0x01; TX_int[10] = 0x02; TX_int[11] = 0x03; /////////////////////////////////////////////// TX: Type: IP (0x0800) TX_int[12] = 0x08; TX_int[13] = 0x00; /////////////////////////////////////////////// TX: Version: 4, Header length: 20 bytes TX_int[14] = 0x45; /////////////////////////////////////////////// TX: Differentiated Services Field TX_int[15] = 0x00; /////////////////////////////////////////////// TX: Total Length //(Total Length = Protocol IP(20) + Protocol UDP(8) + Data(18) = 46) Total_Length_UDP = 28 + TX_len; // 28 + TX_len TX_int[16] = (Total_Length_UDP>>8); TX_int[17] = Total_Length_UDP; /////////////////////////////////////////////// TX: Identification TX_int[18] = 0x00; TX_int[19] = 0x00; /////////////////////////////////////////////// TX: Fragment offset: Don't fragment: 0 TX_int[20] = 0x00; TX_int[21] = 0x00; /////////////////////////////////////////////// TX: Time to live: 128 TX_int[22] = 0x80; /////////////////////////////////////////////// TX: Protocol: UDP (17) TX_int[23] = 0x11; /////////////////////////////////////////////// TX: Header checksum IP: //TX_int[24] = 0x00; //TX_int[25] = 0x00; /////////////////////////////////////////////// TX: Source IP: TX_int[26] = 192; TX_int[27] = 168; TX_int[28] = 0; TX_int[29] = 3; /////////////////////////////////////////////// TX: TX_IP > Destination IP: TX_int[30] = TX_IP[0]; TX_int[31] = TX_IP[1]; TX_int[32] = TX_IP[2]; TX_int[33] = TX_IP[3]; /////////////////////////////////////////////// TX: Source port: 8000 TX_int[34] = 0x1F; TX_int[35] = 0x40; /////////////////////////////////////////////// TX: TX_port > Destination port: TX_int[36] = (TX_port>>8); TX_int[37] = TX_port; /////////////////////////////////////////////// TX: Length: //(Length = Protocol UDP(8) + Data(18) = 26) Length_UDP = 8 + TX_len; // 8 + TX_len TX_int[38] = (Length_UDP>>8); TX_int[39] = Length_UDP; /////////////////////////////////////////////// TX: checksum UDP: //TX_int[40] = 0; //TX_int[41] = 0; /////////////////////////////////////////////// //Header_checksum_IP: //0...41- UDP /////////////////////////////////////////////// TX: Header_checksum_IP: KS = 0; // сброс KS TX_int[24] = 0; // сброс Header_checksum_IP =0 TX_int[25] = 0; // сброс Header_checksum_IP =0 /////////////////////////////////////////////// 14...33 for (xTX=14; xTX<34; xTX+=2) { b_KS = TX_int[xTX]; x1TX = xTX + 1; b_KS = (b_KS<<8)|TX_int[x1TX]; KS += b_KS; if (KS & 0xffff0000) { KS &= 0x0000ffff; KS += 0x00000001; }; }; /////////////////////////////////////////////// Header_checksum_IP > TX_int: KS = ~KS; TX_int[24] = (KS>>8); TX_int[25] = KS; /////////////////////////////////////////////// //checksum_UDP: //MIN=18; MAX=1472. /////////////////////////////////////////////// TX: checksum_UDP: KS = 0; // сброс KS TX_int[40] = 0; // сброс checksum_UDP =0 TX_int[41] = 0; // сброс checksum_UDP =0 /////////////////////////////////////////////// 26...33 //Source IP + Destination IP for (xTX=26; xTX<34; xTX+=2) { b_KS = TX_int[xTX]; x1TX = xTX + 1; b_KS = (b_KS<<8)|TX_int[x1TX]; KS += b_KS; if (KS & 0xffff0000) { KS &= 0x0000ffff; KS += 0x00000001; }; }; /////////////////////////////////////////////// 23 //Protocol KS += TX_int[23]; if (KS & 0xffff0000) { KS &= 0x0000ffff; KS += 0x00000001; }; /////////////////////////////////////////////// 38,39 //Length b_KS = TX_int[38]; b_KS = (b_KS<<8)|TX_int[39]; KS += b_KS; if (KS & 0xffff0000) { KS &= 0x0000ffff; KS += 0x00000001; }; /////////////////////////////////////////////// 34... //Source port + Destination port + Length + Data(MIN=18) for (xTX=34; xTX TX_int: KS = ~KS; TX_int[40] = (KS>>8); TX_int[41] = KS; /////////////////////////////////////////////// //crc Eth: //60...63- crc32 /////////////////////////////////////////////// TX: crcEth: 60 байт -10 ms (8 мгц) //UDP_TX_len = 60; //контроль fcrcEth(); /////////////////////////////////////////////// //TX_Eth: /////////////////////////////////////////////// TX: TX_int > TX_Eth PORTB.2=0; // SS TX_Eth //ждём готовность SPI... TX_Eth delay_ms(1); UDP_TX_len += 4; // UDP_TX_len = UDP(42) + TX_len(48) + crc(4) for (xTX=0; xTX01, 0>10 else {bufer_PHY = 0b00000001;}; // 1>01, 0>10 if (TX_int[xTX] & 0b00000010) {bufer_PHY |= 0b00001000;} // 1>01, 0>10 else {bufer_PHY |= 0b00000100;};// 1>01, 0>10 tx = bufer_PHY; SPI(); // > TX_Ethernet if (TX_int[xTX] & 0b00000100) {bufer_PHY = 0b00000010;} // 1>01, 0>10 else {bufer_PHY = 0b00000001;}; // 1>01, 0>10 if (TX_int[xTX] & 0b00001000) {bufer_PHY |= 0b00001000;} // 1>01, 0>10 else {bufer_PHY |= 0b00000100;};// 1>01, 0>10 tx = bufer_PHY; SPI(); // > TX_Ethernet if (TX_int[xTX] & 0b00010000) {bufer_PHY = 0b00000010;} // 1>01, 0>10 else {bufer_PHY = 0b00000001;}; // 1>01, 0>10 if (TX_int[xTX] & 0b00100000) {bufer_PHY |= 0b00001000;} // 1>01, 0>10 else {bufer_PHY |= 0b00000100;};// 1>01, 0>10 tx = bufer_PHY; SPI(); // > TX_Ethernet if (TX_int[xTX] & 0b01000000) {bufer_PHY = 0b00000010;} // 1>01, 0>10 else {bufer_PHY = 0b00000001;}; // 1>01, 0>10 if (TX_int[xTX] & 0b10000000) {bufer_PHY |= 0b00001000;} // 1>01, 0>10 else {bufer_PHY |= 0b00000100;};// 1>01, 0>10 tx = bufer_PHY; SPI(); // > TX_Ethernet ////////////////////////////////// }; /////////////////////////////////////////////// TX: 0000... > TX_Eth: //if (PINB.1 == 0) { //проверка INT: FIFO полный for (xTX=0; xTX<100; xTX++) { //размер TX_Eth -96 //////////////////////////////// tx = 0; SPI(); // > TX_Eth tx = 0; SPI(); // > TX_Eth tx = 0; SPI(); // > TX_Eth tx = 0; SPI(); // > TX_Eth //////////////////////////////// //if (PINB.1 == 1) { x=200; }; //стоп запись TX_Eth }; //}; /////////////////////////////////////////////// PORTB.2=1; // SS TX_Eth /////////////////////////////////////////////// TX: очистка буфера TX_int: for (xTX=0; xTX> сдвиг UDP(470) // UDP_TX_len = UDP(42) + TX_len(470) = 512 //x1TX=89; //x2TX=47; x1TX=TX_len + 41; //89 UDP(42) x2TX=TX_len - 1; //47 TX_len(48) for (xTX=0; xTX Destination MAC: TX_int[0] = TX_MAC[0]; TX_int[1] = TX_MAC[1]; TX_int[2] = TX_MAC[2]; TX_int[3] = TX_MAC[3]; TX_int[4] = TX_MAC[4]; TX_int[5] = TX_MAC[5]; /////////////////////////////////////////////// TX: Source MAC: TX_int[6] = 0x00; TX_int[7] = 0x08; TX_int[8] = 0xdc; TX_int[9] = 0x01; TX_int[10] = 0x02; TX_int[11] = 0x03; /////////////////////////////////////////////// TX: Type: IP (0x0800) TX_int[12] = 0x08; TX_int[13] = 0x00; /////////////////////////////////////////////// TX: Version: 4, Header length: 20 bytes TX_int[14] = 0x45; /////////////////////////////////////////////// TX: Differentiated Services Field TX_int[15] = 0x00; /////////////////////////////////////////////// TX: Total Length //(Total Length = Protocol IP(20) + Protocol UDP(8) + Data(18) = 46) Total_Length_UDP = 28 + TX_len; // 28 + TX_len TX_int[16] = (Total_Length_UDP>>8); TX_int[17] = Total_Length_UDP; /////////////////////////////////////////////// TX: Identification TX_int[18] = 0x00; TX_int[19] = 0x00; /////////////////////////////////////////////// TX: Fragment offset: Don't fragment: 0 TX_int[20] = 0x00; TX_int[21] = 0x00; /////////////////////////////////////////////// TX: Time to live: 128 TX_int[22] = 0x80; /////////////////////////////////////////////// TX: Protocol: UDP (17) TX_int[23] = 0x11; /////////////////////////////////////////////// TX: Header checksum IP: //TX_int[24] = 0x00; //TX_int[25] = 0x00; /////////////////////////////////////////////// TX: Source IP: TX_int[26] = 192; TX_int[27] = 168; TX_int[28] = 0; TX_int[29] = 3; /////////////////////////////////////////////// TX: TX_IP > Destination IP: TX_int[30] = TX_IP[0]; TX_int[31] = TX_IP[1]; TX_int[32] = TX_IP[2]; TX_int[33] = TX_IP[3]; /////////////////////////////////////////////// TX: Source port: 8000 TX_int[34] = 0x1F; TX_int[35] = 0x40; /////////////////////////////////////////////// TX: TX_port > Destination port: TX_int[36] = (TX_port>>8); TX_int[37] = TX_port; /////////////////////////////////////////////// TX: Length: //(Length = Protocol UDP(8) + Data(18) = 26) Length_UDP = 8 + TX_len; // 8 + TX_len TX_int[38] = (Length_UDP>>8); TX_int[39] = Length_UDP; /////////////////////////////////////////////// TX: checksum UDP: //TX_int[40] = 0; //TX_int[41] = 0; /////////////////////////////////////////////// //Header_checksum_IP: //0...41- UDP /////////////////////////////////////////////// TX: Header_checksum_IP: KS = 0; // сброс KS TX_int[24] = 0; // сброс Header_checksum_IP =0 TX_int[25] = 0; // сброс Header_checksum_IP =0 /////////////////////////////////////////////// 14...33 for (xTX=14; xTX<34; xTX+=2) { b_KS = TX_int[xTX]; x1TX = xTX + 1; b_KS = (b_KS<<8)|TX_int[x1TX]; KS += b_KS; if (KS & 0xffff0000) { KS &= 0x0000ffff; KS += 0x00000001; }; }; /////////////////////////////////////////////// Header_checksum_IP > TX_int: KS = ~KS; TX_int[24] = (KS>>8); TX_int[25] = KS; /////////////////////////////////////////////// //checksum_UDP: //MIN=18; MAX=1472. /////////////////////////////////////////////// TX: checksum_UDP: KS = 0; // сброс KS TX_int[40] = 0; // сброс checksum_UDP =0 TX_int[41] = 0; // сброс checksum_UDP =0 /////////////////////////////////////////////// 26...33 //Source IP + Destination IP for (xTX=26; xTX<34; xTX+=2) { b_KS = TX_int[xTX]; x1TX = xTX + 1; b_KS = (b_KS<<8)|TX_int[x1TX]; KS += b_KS; if (KS & 0xffff0000) { KS &= 0x0000ffff; KS += 0x00000001; }; }; /////////////////////////////////////////////// 23 //Protocol KS += TX_int[23]; if (KS & 0xffff0000) { KS &= 0x0000ffff; KS += 0x00000001; }; /////////////////////////////////////////////// 38,39 //Length b_KS = TX_int[38]; b_KS = (b_KS<<8)|TX_int[39]; KS += b_KS; if (KS & 0xffff0000) { KS &= 0x0000ffff; KS += 0x00000001; }; /////////////////////////////////////////////// 34... //Source port + Destination port + Length + Data(MIN=18) for (xTX=34; xTX TX_int: KS = ~KS; TX_int[40] = (KS>>8); TX_int[41] = KS; /////////////////////////////////////////////// //TX_MACRAW: /////////////////////////////////////////////// TX: W5500: //читаем начальный адрес для записи данных Socket_0 Sn_TX_WR MACRAW: PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x24; SPI(); tx=0x08; SPI(); // Address Registers + Control Registers tx=0x00; SPI(); add=rx; // Data -Sn_TX_WR0 -начальный адрес для записи данных //сарший регистр tx=0x00; SPI(); add=(add<<8)|rx; // Data -Sn_TX_WR1 -начальный адрес для записи данных //младший регистр PORTB.2=1; // SS W5500 /////////////////////////////////////////////// TX: W5500: //пишем данные с начального адреса буфера Socket 0 TX Buffer MACRAW: PORTB.2=0; // SS W5500 tx=(add>>8); SPI(); tx=add; SPI(); tx=0x14; SPI(); // Address = add for (xTX=0; xTX>8); SPI(); // Data -Sn_TX_WR0 -конечный адрес передачи данных //сарший регистр tx=add; SPI(); // Data -Sn_TX_WR1 -конечный адрес передачи данных //младший регистр PORTB.2=1; // SS W5500 /////////////////////////////////////////////// TX: W5500 SEND //пишем команду передачи SEND Socket 0 Command MACRAW: PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x01; SPI(); tx=0x0C; SPI(); // Address Registers + Control Registers tx=0x21; SPI(); // Data -0x21 (команда SEND без автоматического ARP-запроса) PORTB.2=1; // SS W5500 /////////////////////////////////////////////// //if (Sn_CR == 0x00) по окончанию передачи статус меняется на Sn_CR = 0x00 /////////////////////////////////////////////// TX: очистка буфера TX_int: for (xTX=0; xTX 0 TV SAMSUNG delay_us(560); if (TV_int[TX_TV_st] & TX_TV_Mask) {delay_us(1125);}; TX_TV_Mask=(TX_TV_Mask<<1); } while (TX_TV_Mask); /////////////////////////////////////////////// TX: байт END TV SAMSUNG }; /////////////////////////////////////////////// TX: стоп TV SAMSUNG // Маркер 560 us / 27 us = 23 for (xTX=0; xTX<23; xTX++) { PORTD.5=1; delay_us(13); PORTD.5=0; delay_us(9); }; /////////////////////////////////////////////// TX: //PORTD.5=0; // сброс TX /////////////////////////////////////////////// TX: очистка буфера TV_int: //for (xTX=0; xTX<48; xTX++) { // TV_int[xTX] = 0; //}; /////////////////////////////////////////////// TX: Interrupts: #asm("sei") // вкл Global Interrupts //#asm("cli") // выкл Global Interrupts /////////////////////////////////////////////// } //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////кнопки: //unsigned char Modem_flag_knopky; // флаг кнопки //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////Modem_int: //48 * 8 = 384 бит (0...383) + 1 преамбула + 1 синхро = 386 unsigned char Modem_int[]={ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //32 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //64 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //96 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //192 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //224 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //256 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //288 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //384 //len = 48 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //416 //len = 52 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //448 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //480 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 //512 //TX_control_Modem }; //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////TX_Modem: unsigned char TX_Modem_st; // счёт байт unsigned char TX_Modem_Mask; // маска //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////TX_Modem: void TX_Modem(void) { /////////////////////////////////////////////// TX: Interrupts: //#asm("sei") // вкл Global Interrupts #asm("cli") // выкл Global Interrupts //Address Modem: //0...3 /////////////////////////////////////////////// TX: TX_int >> сдвиг Modem(4) //TX_len = Modem(4) + TX_len(48) //x1TX=51; //x2TX=47; x1TX=TX_len + 3; //51 Modem(4) x2TX=TX_len - 1; //47 TX_len(48) for (xTX=0; xTX буфер TCNT0 /////////////////////////////////////////////// фильтр семплов: //if (b_TCNT0 > 15) { // //Modem_int[Modem_len] = b_TCNT0;// буфер TCNT0 > Modem_int (0...255) Modem_int[Modem_len] = TCNT0; // Timer 0 > Modem_int (0...255) Modem_len++; // счёт Modem_len // int //48 * 8 = 384 бит (0...383) + 1 преамбула + 1 синхро = 386 //if (Modem_len > 390) { //Modem_len = 390; ///////////////////////////////////////////// выкл Interrupts: //PCMSK2=0b00000000; //выкл (PD7...PD0) // RX_Modem, TV //}; //52 * 8 = 416 бит (0...415) + 1 преамбула + 1 синхро = 418 if (Modem_len > 420) { Modem_len = 420; ///////////////////////////////////////////// выкл Interrupts: PCMSK2=0b00000000; //выкл (PD7...PD0) // RX_Modem, TV }; //}; /////////////////////////////////////////////// Timer 0 //TCCR0B=0x00; // выкл Timer 0 //TCCR0B=0x01; // вкл Timer 0 (8мгц /1 -делитель) =0,000.032 с //TCCR0B=0x02; // вкл Timer 0 (8мгц /8 -делитель) =0,000.256 с //TCCR0B=0x03; // вкл Timer 0 (8мгц /64 -делитель) =0,002.048 с //TCCR0B=0x04; // вкл Timer 0 (8мгц /256 -делитель) =0,008.192 с //TCCR0B=0x05; // вкл Timer 0 (8мгц /1024 -делитель) =0,032.768 с TCNT0=0x00; // сброс счёт Timer 0 /////////////////////////////////////////////// //PORTD.6=0; // контроль } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////DS18B20: unsigned char t; // температура DS18B20 unsigned char t2; // температура DS18B20 unsigned char t_; // буфер температура DS18B20 unsigned int DSst; // счёт запуск преобразования int DS18B20 unsigned int bufer_t; // буфер температура DS18B20 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 }; /////////////////////////////////////////////// DSfcrc (RX DS18B20): unsigned char DScrc; // DScrc DS18B20 unsigned char DSbcrc; // DScrc буфер DS18B20 unsigned char DSa; // DSa - счёт DS18B20 void DSfcrc(void) { DScrc ^= DSbcrc; // CRC-8-Dallas/Maxim // 0x31 ~ 0x8C for (DSa = 0; DSa < 8; DSa++ ) { if (DScrc & 0x01) DScrc = ( DScrc << 1 ) ^ 0x8C; // 0x31 ~ 0x8C else DScrc = DScrc << 1; }; } /////////////////////////////////////////////// передача wt (DS18B20): unsigned char DSmask; // wt/wr void wt(void) { DSmask=0b00000001; do { DDRC.3=0; // отпустить delay_us(4); DDRC.3=1; // прижать delay_us(4); if (t_ & DSmask) DDRC.3=0; // Data TX DSmask=(DSmask<<1); delay_us(80); } while (DSmask); DDRC.3=0; // отпустить } /////////////////////////////////////////////// приём wr (DS18B20): void wr(void) { DSmask=0b00000001; t_= 0; do { DDRC.3=1; // прижать delay_us(4); DDRC.3=0; // отпустить delay_us(4); if (PINC.3) t_ |= DSmask; // Data RX DSmask=(DSmask<<1); delay_us(80); } while (DSmask); DDRC.3=0; // отпустить } /////////////////////////////////////////////// TX_DS18B20: //Максимальное время конвертирования 750 ms void TX_DS18B20(void) { /////////////////////////////////////////////// TX: Interrupts: //#asm("sei") // вкл Global Interrupts #asm("cli") // выкл Global Interrupts /////////////////////////////////////////////// DDRC.3=1; // прижать delay_us(550); // 480 мкС < имп < 960 мкС DDRC.3=0; // отпустить delay_us(550); // 480 мкС < имп ////////////////////// t_ = 0b11001100; wt(); // обратиться ко всем устройствам t_ = 0b01000100; wt(); // единственное температурное преобразование. /////////////////////////////////////////////// TX: Interrupts: #asm("sei") // вкл Global Interrupts //#asm("cli") // выкл Global Interrupts /////////////////////////////////////////////// } /////////////////////////////////////////////// RX_DS18B20: //Максимальное время конвертирования 750 ms void RX_DS18B20(void) { /////////////////////////////////////////////// TX: Interrupts: //#asm("sei") // вкл Global Interrupts #asm("cli") // выкл Global Interrupts /////////////////////////////////////////////// DDRC.3=1; // прижать delay_us(550); // 480 мкС < имп < 960 мкС DDRC.3=0; // отпустить delay_us(550); // 480 мкС < имп ////////////////////// читать DS18B20: t_ = 0b11001100; wt(); // обратиться ко всем устройствам t_ = 0b10111110; wt(); // читать DS18B20 ////////////////////// читать DS18B20: wr(); DS18B20[0]=t_; // 0 - Температура LSB wr(); DS18B20[1]=t_; // 1 - Температура MSB ////////////////////// читать DS18B20: wr(); DS18B20[2]=t_; // 2 - TH wr(); DS18B20[3]=t_; // 3 - TL ////////////////////// читать DS18B20: wr(); DS18B20[4]=t_; // 4 - конфигурация wr(); DS18B20[5]=t_; // 5 - FF ////////////////////// читать DS18B20: wr(); DS18B20[6]=t_; // 6 - 0C wr(); DS18B20[7]=t_; // 7 - 10 ////////////////////// читать DS18B20: wr(); DS18B20[8]=t_; // 8 - CRC ////////////////////// CRC-8 DS18B20: DScrc=0x00; for (xTX=0; xTX<9; xTX++) { DSbcrc=DS18B20[xTX]; DSfcrc(); }; ////////////////////// проверка crc if (DScrc==0) { ///////////////////// L + H: bufer_t = DS18B20[1]; // Температура MSB bufer_t = (bufer_t << 8) | DS18B20[0]; // Температура LSB ///////////////////// буфер -начальное DS18B20: if (bufer_t != 1360) { // при подаче питания 85°C (0000 0101 0101 0000), 1360-начальное DS18B20 t = (bufer_t >> 4); // Диапазон измерений от –55°C до +125°C t2 = bufer_t & 0x0F; // Диапазон измерений 0,... if (t > 125) { // от 0°C до +125°C t=0; // Температура MSB от –55°C до +125°C t2=0; // Температура LSB 0,... }; }; } ////////////////////// ошибка crc else { t=0; // ошибка crc (RX DS18B20) сброс t=0. }; /////////////////////////////////////////////// TX: Interrupts: #asm("sei") // вкл Global Interrupts //#asm("cli") // выкл Global Interrupts /////////////////////////////////////////////// } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////TX_control_Modem: /* void TX_control_Modem(void) { /////////////////////////////////////////////// TX: TX_len //TX_len = 48; // TX_len 48/208 -начальное 48 /////////////////////////////////////////////// TX: UDP_TX_len UDP_TX_len = 42 + TX_len; // UDP_TX_len = UDP(42) + TX_len(470) = 512 /////////////////////////////////////////////// //UDP: //0...41- UDP /////////////////////////////////////////////// TX: Modem_int >> сдвиг UDP(42) // UDP_TX_len = UDP(42) + TX_len(470) = 512 //x1TX=89; //x2TX=47; x1TX=TX_len + 41; //89 UDP(42) x2TX=TX_len - 1; //47 TX_len(470) for (xTX=0; xTX Destination MAC: Modem_int[0] = TX_MAC[0]; Modem_int[1] = TX_MAC[1]; Modem_int[2] = TX_MAC[2]; Modem_int[3] = TX_MAC[3]; Modem_int[4] = TX_MAC[4]; Modem_int[5] = TX_MAC[5]; /////////////////////////////////////////////// TX: Source MAC: Modem_int[6] = 0x00; Modem_int[7] = 0x08; Modem_int[8] = 0xdc; Modem_int[9] = 0x01; Modem_int[10] = 0x02; Modem_int[11] = 0x03; /////////////////////////////////////////////// TX: Type: IP (0x0800) Modem_int[12] = 0x08; Modem_int[13] = 0x00; /////////////////////////////////////////////// TX: Version: 4, Header length: 20 bytes Modem_int[14] = 0x45; /////////////////////////////////////////////// TX: Differentiated Services Field Modem_int[15] = 0x00; /////////////////////////////////////////////// TX: Total Length //(Total Length = Protocol IP(20) + Protocol UDP(8) + Data(18) = 46) Total_Length_UDP = 28 + TX_len; // 28 + TX_len Modem_int[16] = (Total_Length_UDP>>8); Modem_int[17] = Total_Length_UDP; /////////////////////////////////////////////// TX: Identification Modem_int[18] = 0x00; Modem_int[19] = 0x00; /////////////////////////////////////////////// TX: Fragment offset: Don't fragment: 0 Modem_int[20] = 0x00; Modem_int[21] = 0x00; /////////////////////////////////////////////// TX: Time to live: 128 Modem_int[22] = 0x80; /////////////////////////////////////////////// TX: Protocol: UDP (17) Modem_int[23] = 0x11; /////////////////////////////////////////////// TX: Header checksum IP: //Modem_int[24] = 0x00; //Modem_int[25] = 0x00; /////////////////////////////////////////////// TX: Source IP: Modem_int[26] = 192; Modem_int[27] = 168; Modem_int[28] = 0; Modem_int[29] = 3; /////////////////////////////////////////////// TX: TX_IP > Destination IP: Modem_int[30] = TX_IP[0]; Modem_int[31] = TX_IP[1]; Modem_int[32] = TX_IP[2]; Modem_int[33] = TX_IP[3]; /////////////////////////////////////////////// TX: Source port: 8000 Modem_int[34] = 0x1F; Modem_int[35] = 0x40; /////////////////////////////////////////////// TX: TX_port > Destination port: Modem_int[36] = (TX_port>>8); Modem_int[37] = TX_port; /////////////////////////////////////////////// TX: Length: //(Length = Protocol UDP(8) + Data(18) = 26) Length_UDP = 8 + TX_len; // 8 + TX_len Modem_int[38] = (Length_UDP>>8); Modem_int[39] = Length_UDP; /////////////////////////////////////////////// TX: checksum UDP: //Modem_int[40] = 0; //Modem_int[41] = 0; /////////////////////////////////////////////// //Header_checksum_IP: //0...41- UDP /////////////////////////////////////////////// TX: Header_checksum_IP: KS = 0; // сброс KS Modem_int[24] = 0; // сброс Header_checksum_IP =0 Modem_int[25] = 0; // сброс Header_checksum_IP =0 /////////////////////////////////////////////// 14...33 for (xTX=14; xTX<34; xTX+=2) { b_KS = Modem_int[xTX]; x1TX = xTX + 1; b_KS = (b_KS<<8)|Modem_int[x1TX]; KS += b_KS; if (KS & 0xffff0000) { KS &= 0x0000ffff; KS += 0x00000001; }; }; /////////////////////////////////////////////// Header_checksum_IP > TX_int: KS = ~KS; Modem_int[24] = (KS>>8); Modem_int[25] = KS; /////////////////////////////////////////////// //checksum_UDP: //MIN=18; MAX=1472. /////////////////////////////////////////////// TX: checksum_UDP: KS = 0; // сброс KS Modem_int[40] = 0; // сброс checksum_UDP =0 Modem_int[41] = 0; // сброс checksum_UDP =0 /////////////////////////////////////////////// 26...33 //Source IP + Destination IP for (xTX=26; xTX<34; xTX+=2) { b_KS = Modem_int[xTX]; x1TX = xTX + 1; b_KS = (b_KS<<8)|Modem_int[x1TX]; KS += b_KS; if (KS & 0xffff0000) { KS &= 0x0000ffff; KS += 0x00000001; }; }; /////////////////////////////////////////////// 23 //Protocol KS += Modem_int[23]; if (KS & 0xffff0000) { KS &= 0x0000ffff; KS += 0x00000001; }; /////////////////////////////////////////////// 38,39 //Length b_KS = Modem_int[38]; b_KS = (b_KS<<8)|Modem_int[39]; KS += b_KS; if (KS & 0xffff0000) { KS &= 0x0000ffff; KS += 0x00000001; }; /////////////////////////////////////////////// 34... //Source port + Destination port + Length + Data(MIN=18) for (xTX=34; xTX TX_int: KS = ~KS; Modem_int[40] = (KS>>8); Modem_int[41] = KS; /////////////////////////////////////////////// //TX_MACRAW: /////////////////////////////////////////////// TX: W5500: //читаем начальный адрес для записи данных Socket_0 Sn_TX_WR MACRAW: PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x24; SPI(); tx=0x08; SPI(); // Address Registers + Control Registers tx=0x00; SPI(); add=rx; // Data -Sn_TX_WR0 -начальный адрес для записи данных //сарший регистр tx=0x00; SPI(); add=(add<<8)|rx; // Data -Sn_TX_WR1 -начальный адрес для записи данных //младший регистр PORTB.2=1; // SS W5500 /////////////////////////////////////////////// TX: W5500: //пишем данные с начального адреса буфера Socket 0 TX Buffer MACRAW: PORTB.2=0; // SS W5500 tx=(add>>8); SPI(); tx=add; SPI(); tx=0x14; SPI(); // Address = add for (xTX=0; xTX>8); SPI(); // Data -Sn_TX_WR0 -конечный адрес передачи данных //сарший регистр tx=add; SPI(); // Data -Sn_TX_WR1 -конечный адрес передачи данных //младший регистр PORTB.2=1; // SS W5500 /////////////////////////////////////////////// TX: W5500 SEND //пишем команду передачи SEND Socket 0 Command MACRAW: PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x01; SPI(); tx=0x0C; SPI(); // Address Registers + Control Registers tx=0x21; SPI(); // Data -0x21 (команда SEND без автоматического ARP-запроса) PORTB.2=1; // SS W5500 /////////////////////////////////////////////// //if (Sn_CR == 0x00) по окончанию передачи статус меняется на Sn_CR = 0x00 /////////////////////////////////////////////// TX: очистка буфера TX_int: //for (xTX=0; xTX (10-бит): // ADCH // 0000 0011 - читать вторым // ADCL // 1111 1111 - читать первым // MUX3...MUX0 - номер канала: // 0000 - ADC0 // 0001 - ADC1 // ................. // 0111 - ADC7 // 1000 temperature sensor 1 mV/°C // 1110 - ИОН (1,23V) ! /////////////////////////////////////////////// //ADCSRA //1... .... ADEN - 1- вкл ADC. (0-ADC не потребляет мощности) //.1.. .... ADSC - 1- старт. при завершении преобразования сбрасывается аппаратно. //..1. .... ADFR - 1- режим непрерывного преобразования. //...1 .... ADIF - 1- флаг завершения преобразования // -сброс программно. // -для прерывания очищается аппаратно. //.... 1... ADIE - 1- разрешение прерывания //.... .1.. ADPS2 - предделитель //.... ..1. ADPS1 - предделитель //.... ...1 ADPS0 - предделитель /////////////////////////////////////////////// //предделитель ADC: //ADPS2 -ADPS1 -ADPS0 // 000: 1 МГц/2=500.000 Hz // 001: 1 МГц/2=500.000 Hz // 010: 1 МГц/4=250.000 Hz // 011: 1 МГц/8=125.000 Hz // 100: 1 МГц/16=62.500 Hz // 101: 1 МГц/32=31.250 Hz // 110: 1 МГц/64=15.625 Hz // 111: 1 МГц/128=7.812,5 Hz /////////////////////////////////////////////// //ADMUX=0b01000101; //канал 5 //delay_us(10); //стабилизация входа... //ADCSRA|=0b01000000; //старт преобразования. //while (ADCSRA & 0b01000000); //при завершении преобразования этот бит сбрасывается аппаратно. /////////////////////////////////////////////// //unsigned int a; //unsigned int u; //unsigned int ub; //ADCSRA=0b10000101; // вкл. ADC // 8 МГц/32=250.000 Hz /////////////////////////////////////////////// //adc(5); a=ADCW/2; //if (a>ub+1) {u=a/2; ub=a;}; //if (a>8);//регистр захвата - верхний предел счета = 31250 Hz / 31250 Hz = 1c ICR1L=kor; //регистр захвата - верхний предел счета = 31250 Hz / 31250 Hz = 1c //ICR1H=0x00; //регистр захвата - верхний предел счета = 31250 Hz / 31250 Hz = 1c //ICR1L=0x00; //регистр захвата - верхний предел счета = 31250 Hz / 31250 Hz = 1c OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; */ //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////Кварцевый Резонатор 32.768: часы: 1c: (TIM2) /**/ // Timer/Counter 2 initialization // Clock source: Crystal on TOSC1 pin // Clock value: PCK2 // Mode: Normal top=FFh // OC2A output: Disconnected // OC2B output: Disconnected ASSR=0x20; //вкл Кварцевый Резонатор 32.768 TCCR2A=0x00; //TCCR2B=0x01; // вкл Timer 2 (32.768 /1 -делитель) =0,007.8125 с //TCCR2B=0x02; // вкл Timer 2 (32.768 /8 -делитель) =0,062.5 с //TCCR2B=0x03; // вкл Timer 2 (32.768 /32 -делитель) =0,25 с //TCCR2B=0x04; // вкл Timer 2 (32.768 /64 -делитель) =0,5 с TCCR2B=0x05; // вкл Timer 2 (32.768 /128 -делитель) =1 с //TCCR2B=0x06; // вкл Timer 2 (32.768 /256 -делитель) =2 с //TCCR2B=0x07; // вкл Timer 2 (32.768 /1024 -делитель) =8 с //TCCR2B=0x00; // сброс счёт Timer 2 TCNT2=0x00; OCR2A=0x00; OCR2B=0x00; //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////Interrupt TIMSK: /**/ // Timer/Counter 0 Interrupt(s) initialization TIMSK0=0x01; // Timer/Counter 1 Interrupt(s) initialization //TIMSK1=0x01; // Timer/Counter 2 Interrupt(s) initialization //TIMSK2=0x00; //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////Interrupt PIN: /**/ // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: On (PB7...PB0) // Interrupt on any change on pins PCINT8-14: On (PC6...PC0) // Interrupt on any change on pins PCINT16-23: On (PD7...PD0) EICRA=0x00; EIMSK=0x00; PCICR=0x07; //PCMSK0=0b00001111; //вкл (PB7...PB0) // Modem_RX //PCMSK1=0b00001111; //вкл (PC6...PC0) // Modem_RX //PCMSK2=0b00101010; //вкл (PD7...PD0) // RX_Modem, TV PCMSK2=0b00000010; //вкл (PD1) // Modem_RX PCIFR=0x07; //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////Sleep: //ADCSRA=0b00000000; // выкл ADC перед переводом в режим сна. //(!) В режиме SLEEP логика SPI не работает > MISO-Out (PB4) =~ МОм //Перед SLEEP переключить MISO-In (PB4) >1 МОм //Sleep: ATmega328: //SMCR – Sleep Mode Control Register //0... .... - зарезервированные //.0.. .... - зарезервированные //..0. .... - зарезервированные //...0 .... - зарезервированные //.... 0... - SM2 - выбора режима сна //.... .1.. - SM1 - выбора режима сна -Режим выключения (Powerdown) //.... ..0. - SM0 - выбора режима сна //.... ...1 - SE - разрешение перевода в режим сна //SMCR=0x05; //#asm("sleep") //ADCSRA=0x85; // вкл ADC. // 8 МГц/32=250.000 Hz //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////Global enable interrupts: #asm("sei") // вкл Global Interrupts //#asm("cli") // выкл Global Interrupts //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////ст таймер: //ст таймер тактируется от отдельного встроенного генератора частотой 1 МГц. //ст таймер сбрасывается при выключении или во время сброса микроконтроллера. //WDTCR=0b00001111; // настройка сторожевого таймера: //0... .... - зарезервированные //.0.. .... - зарезервированные //..0. .... - зарезервированные //...1 .... WDCE - Разрешение изменения сторожевого таймера //.... 1... WDE - Вкл. сторожевого таймера //.... .1.. WDP2 - предделитель //.... ..1. WDP1 - предделитель //.... ...1 WDP0 - предделитель //////////////////////////////////////////////////////////////////////////////// //предделитель WDP2 -WDP1 -WDP0: // 000: количество тактов: 16,384; время переполнения: 16,3 mc // 001: количество тактов: 32,768; время переполнения: 32,5 mc // 010: количество тактов: 65,536; время переполнения: 65 mc // 011: количество тактов: 131,072; время переполнения: 0,13 c // 100: количество тактов: 262,144; время переполнения: 0,26 c // 101: количество тактов: 524,288; время переполнения: 0,52 c // 110: количество тактов: 1.048,576; время переполнения: 1,0 c // 111: количество тактов: 2.097,152; время переполнения: 2,1 c //////////////////////////////////////////////////////////////////////////////// /* //вкл. ст таймер: WDTCR=0b00011111; // разрешение изменения сторожевого таймера WDTCR=0b00001111; // вкл. ст таймер //////////////////////////////////////////////////////////////////////////////// //выкл. ст таймер: //WDTCR=0b00011111; // разрешение изменения сторожевого таймера //WDTCR=0b00000111; // выкл. ст таймер //////////////////////////////////////////////////////////////////////////////// //#asm("wdr") // сброс ст таймер */ //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////инициализация W5500: init_W5500(); //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////инициализация RX_Eth: //init_RX_Ethernet(); //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////инициализация nonce: //unsigned char flag_nonce = 1; // flag_nonce -начальное 1 //unsigned char nonce[]={ }; // nonce[48] for (xRX=0; xRX<48; xRX++) { nonce[xRX] = GS_TX(); // GS > nonce[48] }; //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////начальное RX_EEPROM: RX_EEPROM(); ///////////////////////////////////////////// реле: -начальное if (Lampa & 0b10000000) {PORTC.0=1;} // вкл. реле_0 else {PORTC.0=0;}; // выкл. реле_0 if (Lampa & 0b00010000) {PORTC.1=1;} // вкл. реле_1 else {PORTC.1=0;}; // выкл. реле_1 //////////////////////////////////////////////////////////////////////////////// _1: //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////ст таймер: //#asm("wdr") // сброс ст таймер 2,1 c //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////часы: 1c: (TIM1) //while (!(TIFR1 & 0b00000001)); // флаг TOV1 - верхний предел счета TOV1. //if (TIFR1 & 0b00000001) { // флаг TOV1 - верхний предел счета TOV1. // TIFR1 |= 0b00000001; // сброс флаг TOV1 //////////////////////////////// //unsigned int kor=31250; // коррекция часы //ICR1H=(kor>>8);//регистр захвата - верхний предел счета = 31250 Hz / 31250 Hz = 1c //ICR1L=kor; //регистр захвата - верхний предел счета = 31250 Hz / 31250 Hz = 1c //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////Кварцевый Резонатор 32.768: часы: 1c: (TIM2) if (TIFR2 & 0b00000001) { // флаг TOV2 - верхний предел счета TOV2. TIFR2 |= 0b00000001; // сброс флаг TOV2 ////////////////////////////////////////////////////////////////////////////// //////////////////////////////// часы: 1c: //TX_int[37] = 0; //часы //TX_int[38] = 0; //минуты //TX_int[39] = 0; //секунды //TX_int[40] = 0; //число //TX_int[41] = 0; //месяц //TX_int[42] = 0; //год //TX_int[43] = 0; //год //unsigned char sec; //секунды //unsigned char min; //минуты //unsigned char hour; //часы //unsigned char day; //число //unsigned char mon; //месяц //unsigned int year; //год sec++; //секунды // 1c. if (sec>59) {sec=0; min++;}; //минуты if (min>59) {min=0; hour++;} //часы if (hour>23){hour=0; day++; }; //число if (day>31 && mon==1) {day=1; mon++;}; //месяц //Jan if (day>28 && mon==2) {day=1; mon++;}; //месяц //Feb if (day>31 && mon==3) {day=1; mon++;}; //месяц //Mar if (day>30 && mon==4) {day=1; mon++;}; //месяц //Apr if (day>31 && mon==5) {day=1; mon++;}; //месяц //May if (day>30 && mon==6) {day=1; mon++;}; //месяц //Jun if (day>31 && mon==7) {day=1; mon++;}; //месяц //Jul if (day>31 && mon==8) {day=1; mon++;}; //месяц //Aug if (day>30 && mon==9) {day=1; mon++;}; //месяц //Sep if (day>31 && mon==10) {day=1; mon++;}; //месяц //Oct if (day>30 && mon==11) {day=1; mon++;}; //месяц //Nov if (day>31 && mon==12) {day=1; mon++;}; //месяц //Dec if (mon>12) {mon=1; year++;}; //год ////////////////////////////////////////////////////////////////////////////// //////////////////////////////// таймер: 1c: //unsigned char timer_H; //таймер (0...23) час //unsigned char timer_L; //таймер (0...59) мин //unsigned char timer_S; //таймер (1...60) сек if ( timer_H || timer_L ) { timer_S++; // таймер (1...60) сек if (timer_S == 60) { timer_S = 0; if ( timer_H || timer_L ) { //таймер (0...23) час if (timer_L > 0) {timer_L--;} //таймер (0...59) мин else { if (timer_H > 0) { timer_H--; timer_L=59; }; }; }; }; //Lampa |= 0b10000000; // вкл. //0b10000000 -лампа: 7 ON/OFF //PORTC.0=1; // вкл. реле_0 //////////////////////////////// //////////////////////////////// if ( (timer_H == 0) && (timer_L == 0) ) { Lampa &= 0b01111111; // выкл. //0b10000000 -лампа: 7 ON/OFF PORTC.0=0; // выкл. реле_0 ////////////////////////////////////////// TX_UDP: TX_UDP_st = 3; //счёт TX_UDP_st Time_TX_UDP_st=1000; //счёт Time_TX_UDP_st -1с }; }; ////////////////////////////////////////////////////////////////////////////// //////////////////////////////// время_ON/время_OFF: //TX_int[35] = 0; //таймер_H/время_ON/время_OFF/ //TX_int[36] = 0; //таймер_L //unsigned char st_Timer = 0; //счёт Timer -таймер_H/время_ON/время_OFF/ //unsigned char hour_ON; //часы ON //unsigned char min_ON; //минуты ON //unsigned char hour_OFF; //часы OFF //unsigned char min_OFF; //минуты OFF //////////////////////////////// время_ON: if ( hour_ON || min_ON ) //проверка вкл. время_ON: { ////////////////////////////// if ( (hour_ON == hour) && (min_ON == min) && (sec == 0) ) { Lampa |= 0b10000000; // вкл. //0b10000000 -лампа: 7 ON/OFF PORTC.0=1; // вкл. реле_0 //////////////////////////// TX_UDP: TX_UDP_st = 3; //счёт TX_UDP_st Time_TX_UDP_st=1000;//счёт Time_TX_UDP_st -1с }; ////////////////////////////// }; //////////////////////////////// время_OFF: if ( hour_OFF || min_OFF )//проверка вкл. время_OFF: { ////////////////////////////// if ( (hour_OFF == hour) && (min_OFF == min) && (sec == 0) ) { Lampa &= 0b01111111; // выкл. //0b10000000 -лампа: 7 ON/OFF PORTC.0=0; // выкл. реле_0 //////////////////////////// TX_UDP: TX_UDP_st = 3; //счёт TX_UDP_st Time_TX_UDP_st=1000;//счёт Time_TX_UDP_st -1с }; ////////////////////////////// }; ////////////////////////////////////////////////////////////////////////////// //////////////////////////////// DS18B20 / термореле: //TX_int[29] = 0; //0b10000000 -лампа: 7 ON/OFF вкл. реле_0 //0b01000000 -лампа: 6 ON/OFF вкл. DS18B20 //0b00100000 -лампа: 5 ON/OFF вкл. термореле //0b00010000 -лампа: 4 ON/OFF вкл. реле_1 //0b00001000 -лампа: 3 ON/OFF вкл. TX_ПК //0b00000100 -лампа: 2 ON/OFF вкл. бузер //0b00000010 -лампа: 1 ON/OFF вкл. резерв_1 //0b00000001 -лампа: 0 ON/OFF TX_control_Modem if (Lampa & 0b01000000) //проверка вкл. DS18B20: { //DSst - счёт запуск преобразования int -1 преобразование(минимум 750mc) DSst++; ////////////////////////////// запуск преобразования DS18B20: if (DSst == 1) { TX_DS18B20(); }; ////////////////////////////// читать DS18B20 каждые 10с: if (DSst == 10) { DSst = 0; //сброс счёт RX_DS18B20(); //////////////////////////// //unsigned char slider_7; //-Ползунок 7 Температура MSB (DS18B20) //unsigned char slider_6; //-Ползунок 6 Температура LSB (DS18B20) //unsigned char slider_5; //-Ползунок 5 Температура MAX //unsigned char slider_4; //-Ползунок 4 Температура MIN slider_7 = t; slider_6 = t2; //////////////////////////// проверка вкл. термореле: if (Lampa & 0b00100000) { ////////////////////////// проверка t: if (t) { // t > 0 //////////////////////// Ползунок 7,6,5,4: //unsigned char slider_7; //-Ползунок 7 Температура MSB (DS18B20) //unsigned char slider_6; //-Ползунок 6 Температура LSB (DS18B20) //unsigned char slider_5; //-Ползунок 5 Температура MAX //unsigned char slider_4; //-Ползунок 4 Температура MIN //////////////////////// проверка t > MAX: if ( (slider_7 > slider_5) && (PINC.0 == 1) ) { Lampa &= 0b01111111; // выкл. //0b10000000 -лампа: 7 ON/OFF PORTC.0=0; // выкл. реле_0 ////////////////////// сообщать выкл. реле: TX_UDP_st = 3; //счёт TX_UDP_st Time_TX_UDP_st=1000; //счёт Time_TX_UDP_st -1с }; //////////////////////// проверка t < MIN: if ( (slider_7 < slider_4) && (PINC.0 == 0) ) { Lampa |= 0b10000000; // вкл. //0b10000000 -лампа: 7 ON/OFF PORTC.0=1; // вкл. реле_0 ////////////////////// сообщать вкл. реле: TX_UDP_st = 3; //счёт TX_UDP_st Time_TX_UDP_st=1000; //счёт Time_TX_UDP_st -1с }; //////////////////////// t > 0 }// проверка t ////////////////////////// ошибка t == 0: else { Lampa &= 0b01111111; // выкл. //0b10000000 -лампа: 7 ON/OFF PORTC.0=0; // выкл. реле_0 //Lampa &= 0b11011111; // выкл. термореле //////////////////////// сообщать ошибка t == 0: TX_UDP_st = 3; //счёт TX_UDP_st Time_TX_UDP_st=1000; //счёт Time_TX_UDP_st -1с //////////////////////// };//ошибка t == 0 //////////////////////////// };//проверка вкл. термореле ////////////////////////////// };//читать DS18B20 каждые 10с };//проверка вкл. DS18B20 //////////////////////////////// //PORTD.7 =~ PORTD.7; //контроль > LCD: }; //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////проверка TX_UDP_st: if (Time_TX_UDP_st==1000) { //счёт Time_TX_UDP_st -1с Time_TX_UDP_st=0; //сброс счёт Time_TX_UDP_st TX_UDP_st--; //счёт TX_UDP_st //////////////////////////////// TX_ПК: //TX_int[29] = 0; //0b10000000 -лампа: 7 ON/OFF вкл. реле_0 //0b01000000 -лампа: 6 ON/OFF вкл. DS18B20 //0b00100000 -лампа: 5 ON/OFF вкл. термореле //0b00010000 -лампа: 4 ON/OFF вкл. реле_1 //0b00001000 -лампа: 3 ON/OFF вкл. TX_ПК //0b00000100 -лампа: 2 ON/OFF вкл. бузер //0b00000010 -лампа: 1 ON/OFF вкл. резерв_1 //0b00000001 -лампа: 0 ON/OFF TX_control_Modem if (Lampa & 0b00001000) //проверка вкл. TX_ПК: { //////////////////////////////////////////сброс TX_MAC, TX_IP, TX_port > ПК: //if (TX_UDP_st == 5) { //ff:ff:ff:ff:ff:ff > TX_MAC: TX_MAC[0]=0xff; //Destination MAC Address TX_MAC[1]=0xff; //Destination MAC Address TX_MAC[2]=0xff; //Destination MAC Address TX_MAC[3]=0xff; //Destination MAC Address TX_MAC[4]=0xff; //Destination MAC Address TX_MAC[5]=0xff; //Destination MAC Address //192.168.0.101 > TX_IP: TX_IP[0] = 192; //Destination IP Address TX_IP[1] = 168; //Destination IP Address TX_IP[2] = 0; //Destination IP Address TX_IP[3] = 101; //Destination IP Address //8000 > TX_port TX_port = 8000; //Destination port //1 > ID_Destination; ID_Destination = 1; //}; /////////////////////////////////////////////// флаги: //TX_int[24] = 0; //control = 31 - статус_sys >> //control = 32 - статус_sys << ACK //control = 33 - запись_sys >> //control = 34 - запись_sys << ACK //control = 35 - чтение_EE >> //control = 36 - чтение_EE << ACK //control = 37 - запись_EE >> //control = 38 - запись_EE << ACK //control = 39 - error_key- >> //control = 40 - error_key- << ACK //control = 41 - blok_sys >> //control = 42 - blok_sys << ACK /////////////////////////////////////////////// флаг статус_sys: TX_int[24] = 31; //control = 31 - статус_sys >> /////////////////////////////////////////////// сброс Буфер Номер Key: //b_Key_N_ = 2; //0,1 -Буфер Номер Key -начальное 2 //Key_N_ = 0; //Key_N_ выбор ключей /////////////////////////////////////////////// flag_error_vektor = 0; // сброс флаг error_vektor error_vektor = 0; // сброс error_vektor /////////////////////////////////////////////// goto status_systema; // > status_systema };//проверка вкл. TX_ПК };//проверка TX_UDP_st //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////проверка TX_UDP_st: if (TX_UDP_st) { //счёт TX_UDP_st Time_TX_UDP_st++; //счёт Time_TX_UDP_st }; //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////бузер: //////////////////////////////// TX_ПК: //TX_int[29] = 0; //0b10000000 -лампа: 7 ON/OFF вкл. реле_0 //0b01000000 -лампа: 6 ON/OFF вкл. DS18B20 //0b00100000 -лампа: 5 ON/OFF вкл. термореле //0b00010000 -лампа: 4 ON/OFF вкл. реле_1 //0b00001000 -лампа: 3 ON/OFF вкл. TX_ПК //0b00000100 -лампа: 2 ON/OFF вкл. бузер //0b00000010 -лампа: 1 ON/OFF вкл. резерв_1 //0b00000001 -лампа: 0 ON/OFF TX_control_Modem if (Lampa & 0b00000100) //проверка вкл. бузер: { st_buzer++; //int ////////////////////////////// вкл. бузер: if ( st_buzer & 0b0000000010000000 ) { //128 PORTC.2=1; // вкл. бузер }; ////////////////////////////// вкл. бузер: if (!(st_buzer & 0b0000000010000000)) { //128 PORTC.2=0; // выкл. бузер }; ////////////////////////////// выкл. бузер: if (st_buzer == 1024) { st_buzer = 0; // сброс счёт бузер //int PORTC.2=0; // выкл. бузер Lampa &= 0b11111011; // сброс вкл. бузер /////////////////////////////////////////////// goto status_systema; // > status_systema }; ////////////////////////////// };//проверка вкл. бузер //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////TX_UDP: test(!) /* if (PINC.4 == 0) { TX_UDP_st = 3; //счёт TX_UDP_st Time_TX_UDP_st=1000; //счёт Time_TX_UDP_st //PORTD.6=1; // TX //PORTD.7=1; // RX //delay_ms(1000); // задержка 1 с //PORTD.6=0; // TX //PORTD.7=0; // RX }; */ //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////TX_Modem: test(!) /* if (PINC.4 == 0) { delay_ms(100); /////////////////////////////////////////////// TX_len = 48; TX_Modem(); /////////////////////////////////////////////// //delay_ms(50); //delay_ms(1000); ///////////////////////////////////////////// ID_Destination: //ID_Destination = 1; ///////////////////////////////////////////// ID_Source: //ID_Source = 2; // Server ///////////////////////////////////////////// //TX_int[24] = 0; //сброс флаги: //goto status_systema; // > status_systema /////////////////////////////////////////////// }; */ //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////Сброс blok sys: /**/ if (PINC.4 == 0) { PORTD.6=1; // TX PORTD.7=1; // RX blok_sys = 0; // Сброс blok_sys //-начальное 0. TX_EEPROM(); // > TX_EEPROM delay_ms(1000); // задержка 1 с PORTD.6=0; // TX PORTD.7=0; // RX }; //////////////////////////////////////////////////////////////////////////////// delay_ms(1); //Modem: //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////RX_Modem: //Ждём окончания приёма RX_Modem (таймер 0)... //while (Modem_flag_full==0) {}; //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////проверка флаг Modem_flag_full: if (Modem_flag_full == 0) { goto RX_MACRAW; // RX_Modem_0,1, TV пуст > RX_MACRAW }; Modem_flag_full = 0; // сброс флаг RX_Modem полный /////////////////////////////////////////////// LCD: //PORTD.6=0; // TX //PORTD.7=1; // RX //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////проверка флаг Modem_flag_TSOP: /* if (Modem_flag_TSOP == 1) { // флаг TSOP Modem_flag_TSOP=0; // сброс флаг TSOP TSOPst = Modem_len; // Modem_len > счёт TSOP Modem_len = 0; // сброс Modem_len // int ///////////////////////////////////////////// TSOP_start_0 = Modem_int[1]; // TSOP старт бит 0 TSOP_start_1 = Modem_int[2]; // TSOP старт бит 1 /////////////////////////////////////////////проверка Modem_len: = 68 //TSOP: //4*8*2 = 64 бит + 4 преамбула = 68 //if (Modem_len != 68) { // Modem_len = 0; //сброс Modem_len // int /////////////////////////////////////////////// LCD: PORTD.6=0; // TX PORTD.7=0; // RX /////////////////////////////////////////////вкл Interrupts: // PCMSK2=0b00101010; //вкл (PD7...PD0) // TV,RX_Modem_0,1 // goto RX_MACRAW; //ошибка Modem_len > RX_MACRAW //}; //Modem_len = 0; //сброс Modem_len // int ///////////////////////////////////////////// Modem_int << сдвиг (4) //TSOP: //4*8*2 = 64 бит + 4 преамбула = 68 y1=4; // y1 -int for (y=0; y<68; y++) { // int 68 Modem_int[y]=Modem_int[y1]; // int y1++; // y2 -int }; /////////////////////////////////////////////сборка байт: 48 байт -4,0mc (8 МГц) Modem_st_bit = 0; // сброс счётчик бит // int Modem_mask_bit = 0b00000001; // сброс маска бит Modem_bufer_bayt = 0; // сброс буфер байт Modem_st_bayt = 0; // сброс счётчик байт // int do { if (Modem_int[Modem_st_bit] > 8) { // int Modem_bufer_bayt |= Modem_mask_bit; // буфер байт }; //Modem_st_bit++; // счётчик бит // int Modem_st_bit += 2; // счётчик бит TSOP // int Modem_mask_bit=(Modem_mask_bit<<1); // сдвиг маска бит //////////////////////////////////////////маска бит/счётчик байт if (Modem_mask_bit == 0b00000000) { Modem_mask_bit=0b00000001; // сброс маска бит Modem_int[Modem_st_bayt] = Modem_bufer_bayt; // > Modem_int Modem_bufer_bayt = 0; // сброс буфер байт Modem_st_bayt ++; // счётчик байт // int }; //////////////////////////////////////////маска бит/счётчик байт } while (Modem_st_bayt < 4); // TSOP = 4 ///////////////////////////////////////////// Modem_int > TSOP = 4 TSOP_byte_0 = Modem_int[0]; // TSOP байт 0 TSOP_byte_1 = Modem_int[1]; // TSOP байт 1 TSOP_byte_2 = Modem_int[2]; // TSOP байт 2 TSOP_byte_3 = Modem_int[3]; // TSOP байт 3 /////////////////////////////////////////////вкл Interrupts: PCMSK2=0b00101010; //вкл (PD7...PD0) // RX_Modem_0,1, TV ///////////////////////////////////////////// TX_UDP_st = 3; //счёт TX_UDP_st Time_TX_UDP_st=1000; //счёт Time_TX_UDP_st /////////////////////////////////////////////// LCD: PORTD.6=0; // TX PORTD.7=0; // RX ///////////////////////////////////////////// goto _1; // > _1 }; */ //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////проверка флаг Modem_flag_knopky: /* if (Modem_flag_knopky == 1) {// флаг кнопки Modem_flag_knopky=0; // сброс флаг кнопки Modem_len = 0; // сброс Modem_len // int ////////////////////////////////// delay_ms(100); // ждём переходные процессы кнопки... //////////////////////////////////RX флаги: лампа: (7...0) //TX_int[29] = 0; //0b10000000 -лампа: 7 ON/OFF вкл. реле_0 //0b01000000 -лампа: 6 ON/OFF вкл. DS18B20 //0b00100000 -лампа: 5 ON/OFF вкл. термореле //0b00010000 -лампа: 4 ON/OFF вкл. реле_1 //0b00001000 -лампа: 3 ON/OFF вкл. TX_ПК //0b00000100 -лампа: 2 ON/OFF вкл. бузер //0b00000010 -лампа: 1 ON/OFF вкл. резерв_1 //0b00000001 -лампа: 0 ON/OFF TX_control_Modem /////////////////////////////////////////////// проверка кнопки: if (PIND.3 == 1) {Lampa |= 0b00000010;}; if (PIND.3 == 0) {Lampa &= 0b11111101;}; if (PIND.5 == 1) {Lampa |= 0b00001000;}; if (PIND.5 == 0) {Lampa &= 0b11110111;}; ///////////////////////////////////////////////вкл Interrupts: PCMSK2=0b00101010; //вкл (PD7...PD0) // RX_Modem_0,1, TV /////////////////////////////////////////////// TX_UDP_st = 3; //счёт TX_UDP_st Time_TX_UDP_st=1000; //счёт Time_TX_UDP_st /////////////////////////////////////////////// LCD: PORTD.6=0; // TX PORTD.7=0; // RX /////////////////////////////////////////////// goto _1; // > _1 }; */ //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////проверка флаг Modem_flag_modem: ///////////////////////////////////////////////проверка Modem_len: = 386 //(пакет фиксированной длины) //48 * 8 = 384 бит (0...383) + 1 преамбула + 1 синхро = 386 //if (Modem_len != 386) { //52 * 8 = 416 бит (0...415) + 1 преамбула + 1 синхро = 418 if (Modem_len != 418) { Modem_len = 0; // сброс Modem_len // int /////////////////////////////////////////////// LCD: //PORTD.6=1; // TX //PORTD.7=1; // RX //delay_ms(500); // error Modem_len > задержка 0,5 с //PORTD.6=0; // TX //PORTD.7=0; // RX ///////////////////////////////////////////////вкл Interrupts: //PCMSK2=0b00101010;//вкл (PD7...PD0) // RX_Modem, TV PCMSK2=0b00000010; //вкл (PD1) // Modem_RX goto RX_MACRAW; //ошибка Modem_len > RX_MACRAW }; Modem_len = 0; //сброс Modem_len // int //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////проверка TX_control_Modem: /* //////////////////////////////// TX_control_Modem: //TX_int[29] = 0; //0b10000000 -лампа: 7 ON/OFF вкл. реле_0 //0b01000000 -лампа: 6 ON/OFF вкл. DS18B20 //0b00100000 -лампа: 5 ON/OFF вкл. термореле //0b00010000 -лампа: 4 ON/OFF вкл. реле_1 //0b00001000 -лампа: 3 ON/OFF вкл. TX_ПК //0b00000100 -лампа: 2 ON/OFF вкл. бузер //0b00000010 -лампа: 1 ON/OFF вкл. резерв_1 //0b00000001 -лампа: 0 ON/OFF TX_control_Modem if (Lampa & 0b00000001) //TX_control_Modem: { //////////////////////////////////////////сброс TX_MAC, TX_IP, TX_port > ПК: //if (TX_UDP_st == 5) { //ff:ff:ff:ff:ff:ff > TX_MAC: TX_MAC[0]=0xff; //Destination MAC Address TX_MAC[1]=0xff; //Destination MAC Address TX_MAC[2]=0xff; //Destination MAC Address TX_MAC[3]=0xff; //Destination MAC Address TX_MAC[4]=0xff; //Destination MAC Address TX_MAC[5]=0xff; //Destination MAC Address //192.168.0.101 > TX_IP: TX_IP[0] = 192; //Destination IP Address TX_IP[1] = 168; //Destination IP Address TX_IP[2] = 0; //Destination IP Address TX_IP[3] = 101; //Destination IP Address //8000 > TX_port TX_port = 8000; //Destination port //}; /////////////////////////////////////////////// PORTD.6=1; // TX PORTD.7=0; // RX //TX_len = 470; // TX_len // UDP_TX_len = UDP(42) + TX_len(470) = 512 TX_len = 470; // TX_len // UDP_TX_len = UDP(42) + TX_len(470) = 512 //TX_UDP(); // > TX_UDP() //TX_Eth(); // > TX_Eth() //TX_control_Eth();// > TX_control_Eth() TX_control_Modem();// > TX_control_Modem() //TX_len = 32; // TX_len = 32 //TX_Modem(); // > TX_Modem() PORTD.6=0; // TX PORTD.7=0; // RX /////////////////////////////////////////////// Modem_int << сдвиг (42) y1=42; // y1 -int for (y=0; y<512; y++) { // int 52 Modem_int[y]=Modem_int[y1]; // int y1++; // y2 -int }; /////////////////////////////////////////////// };//TX_control_Modem */ //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////// RX_len: RX_len = 48; // RX_len -начальное 48 /////////////////////////////////////////////// Modem_int << сдвиг (2) /* //48 * 8 = 384 бит (0...383) + 1 преамбула + 1 синхро = 386 y1=2; // y1 -int for (y=0; y<384; y++) { // int 48 Modem_int[y]=Modem_int[y1]; // int y1++; // y2 -int }; */ /////////////////////////////////////////////// Modem_int << сдвиг (1) /* //48 * 8 = 384 бит (0...383) + 1 преамбула + 1 стоп = 386 y1=1; // y1 -int for (y=0; y<384; y++) { // int 48 Modem_int[y]=Modem_int[y1]; // int y1++; // y2 -int }; */ /////////////////////////////////////////////// Modem_int << сдвиг (1) //52 * 8 = 416 бит (0...415) + 1 преамбула + 1 синхро = 418 y1=1; // y1 -int for (y=0; y<416; y++) { // int 52 Modem_int[y]=Modem_int[y1]; // int y1++; // y2 -int }; /////////////////////////////////////////////// /////////////////////////////////////////////// Modem_int_MIN: (0...255) /* Modem_int_MIN = 255; // сброс Modem MIN // int for (y=0; y<384; y++) { // int 48 if (Modem_int[y] < Modem_int_MIN) { // int Modem_int_MIN = Modem_int[y]; // > Modem_int_MIN }; }; /////////////////////////////////////////////// Modem_int_MAX: (0...255) Modem_int_MAX = 0; // сброс Modem MAX // int for (y=0; y<384; y++) { // int 48 if (Modem_int[y] > Modem_int_MAX) { // int Modem_int_MAX = Modem_int[y]; // > Modem_int_MAX }; }; */ /////////////////////////////////////////////// /////////////////////////////////////////////// Modem_int_MIN: (0...255) Modem_int_MIN = 255; // сброс Modem MIN // int for (y=0; y<416; y++) { // int 52 if (Modem_int[y] < Modem_int_MIN) { // int Modem_int_MIN = Modem_int[y]; // > Modem_int_MIN }; }; /////////////////////////////////////////////// Modem_int_MAX: (0...255) Modem_int_MAX = 0; // сброс Modem MAX // int for (y=0; y<416; y++) { // int 52 if (Modem_int[y] > Modem_int_MAX) { // int Modem_int_MAX = Modem_int[y]; // > Modem_int_MAX }; }; /////////////////////////////////////////////// Modem_int_SR: (0...255) Modem_int_SR = Modem_int_MIN + Modem_int_MAX; // int Modem_int_SR = Modem_int_SR / 2; // int /////////////////////////////////////////////// ///////////////////////////////////////////////сборка байт: 48 байт -4,0mc (8 МГц) Modem_st_bit = 0; // сброс счётчик бит // int Modem_mask_bit = 0b00000001; // сброс маска бит Modem_bufer_bayt = 0; // сброс буфер байт Modem_st_bayt = 0; // сброс счётчик байт // int do { /////////////////////////////////////////// if (Modem_int[Modem_st_bit] > Modem_int_SR) { // Modem_int_SR: (0...255) Modem_bufer_bayt |= Modem_mask_bit; // > Modem_bufer_bayt }; Modem_st_bit++; // счётчик бит // int Modem_mask_bit=(Modem_mask_bit<<1); // сдвиг маска бит ///////////////////////////////////////////маска бит/счётчик байт if (Modem_mask_bit == 0b00000000) { Modem_mask_bit=0b00000001; // сброс маска бит Modem_int[Modem_st_bayt] = Modem_bufer_bayt; // > Modem_int Modem_bufer_bayt = 0; // сброс буфер байт Modem_st_bayt ++; // счётчик байт // int }; /////////////////////////////////////////// } //while (Modem_st_bayt < 48); // Modem_len_bayt = 48 while (Modem_st_bayt < 52); // Modem_len_bayt = 52 /////////////////////////////////////////////// /////////////////////////////////////////////// проверка Address Modem: //Address Modem: 0,1,2,3 if (Modem_int[0] != 0x00) { /////////////////////////////////////////////вкл Interrupts: //PCMSK2=0b00101010; //вкл (PD7...PD0) // RX_Modem, TV PCMSK2=0b00000010; //вкл (PD1) // Modem_RX goto RX_MACRAW; // > RX_MACRAW }; if (Modem_int[1] != 0x01) { /////////////////////////////////////////////вкл Interrupts: //PCMSK2=0b00101010; //вкл (PD7...PD0) // RX_Modem, TV PCMSK2=0b00000010; //вкл (PD1) // Modem_RX goto RX_MACRAW; // > RX_MACRAW }; if (Modem_int[2] != 0x02) { /////////////////////////////////////////////вкл Interrupts: //PCMSK2=0b00101010; //вкл (PD7...PD0) // RX_Modem, TV PCMSK2=0b00000010; //вкл (PD1) // Modem_RX goto RX_MACRAW; // > RX_MACRAW }; if (Modem_int[3] != 0x03) { /////////////////////////////////////////////вкл Interrupts: //PCMSK2=0b00101010; //вкл (PD7...PD0) // RX_Modem, TV PCMSK2=0b00000010; //вкл (PD1) // Modem_RX goto RX_MACRAW; // > RX_MACRAW }; /////////////////////////////////////////////// LCD: //PORTD.6=0; // TX //PORTD.7=1; // RX /////////////////////////////////////////////// TX_int << сдвиг UDP(42) /* //0...41- UDP/ARP-42 //42...89- Data-48 // RX_len MAX=250 TX_int (0...250) x1TX=42; // UDP(42) for (xRX=0; xRX TX_int = 48 for (xTX=0; xTX<48; xTX++) { TX_int[xTX] = Modem_int[xTX]; }; //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////проверка флаг TX_ПК: if (flag_TX_PC == 0) { /////////////////////////////////////////////сброс TX_MAC, TX_IP, TX_port > ПК: //ff:ff:ff:ff:ff:ff > TX_MAC: TX_MAC[0]=0xff; //Destination MAC Address TX_MAC[1]=0xff; //Destination MAC Address TX_MAC[2]=0xff; //Destination MAC Address TX_MAC[3]=0xff; //Destination MAC Address TX_MAC[4]=0xff; //Destination MAC Address TX_MAC[5]=0xff; //Destination MAC Address //192.168.0.101 > TX_IP: TX_IP[0] = 192; //Destination IP Address TX_IP[1] = 168; //Destination IP Address TX_IP[2] = 0; //Destination IP Address TX_IP[3] = 101; //Destination IP Address //8000 > TX_port TX_port = 8000; //Destination port }; ///////////////////////////////////////////////TX_UDP_Modem: PORTD.6=1; // TX PORTD.7=0; // RX TX_len = 48; // TX_len = 48 //TX_UDP(); // > TX_UDP() TX_UDP_Modem(); // > TX_UDP_Modem() //TX_Eth(); // > TX_Eth() //TX_Modem(); // > TX_Modem() //TX_TV(); // > TX_TV() PORTD.6=0; // TX PORTD.7=0; // RX ///////////////////////////////////////////////сброс флаг TX_ПК flag_TX_PC = 0; ///////////////////////////////////////////////вкл Interrupts: //PCMSK2=0b00101010; //вкл (PD7...PD0) // RX_Modem, TV PCMSK2=0b00000010; //вкл (PD1) // Modem_RX //////////////////////////////////////////////////////////////////////////////// RX_MACRAW: //goto _1; // > _1 //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////RX: W5500: //проверка INT RX_MACRAW: if (PINB.1 == 1) { goto _1; // MACRAW пуст > _1 }; //пишем: сброс флаг завершение приёма INT Socket_0: (Sn_IR) 0x0002 PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x02; SPI(); tx=0x0C; SPI(); // Address Registers + Control Registers tx=0x04; SPI(); // Data 0x04 -сброс флаг завершение приёма. PORTB.2=1; // SS W5500 /////////////////////////////////////////////// RX: W5500 //читаем размер принятых данных Socket_0 MACRAW: PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x26; SPI(); tx=0x08; SPI(); // Address Registers + Control Registers tx=0x00; SPI(); RX_len=rx; // Data -Sn_RX_RSR0 -размер принятых данных //сарший регистр tx=0x00; SPI(); RX_len=(RX_len<<8)|rx; // Data -Sn_RX_RSR1 -размер принятых данных //младший регистр PORTB.2=1; // SS W5500 /////////////////////////////////////////////// RX: W5500 if (RX_len == 0x00) { goto _1; // MACRAW пуст > _1; }; /////////////////////////////////////////////// LCD: PORTD.6=0; // TX PORTD.7=1; // RX /////////////////////////////////////////////// RX: W5500 //читаем начальный адрес принятых данных Socket_0 Sn_RX_RD MACRAW PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x28; SPI(); tx=0x08; SPI(); // Address Registers + Control Registers tx=0x00; SPI(); add=rx; // Data -Sn_RX_RD0 -начальный адрес принятых данных //сарший регистр tx=0x00; SPI(); add=(add<<8)|rx; // Data -Sn_RX_RD1 -начальный адрес принятых данных //младший регистр PORTB.2=1; // SS W5500 /////////////////////////////////////////////// RX: W5500 //читаем данные с начального адреса буфера Socket_0 RX Buffer MACRAW: PORTB.2=0; // SS W5500 tx=(add>>8); SPI(); tx=add; SPI(); tx=0x18; SPI(); // Address = add // MACRAW // len | Data // len = 0x00 0x00(len=len+Data) add = add + RX_len; //add - начальный/конечный адрес принятых данных // 0x0000...0xFFFF //len - размер полученных данных // 0x0000...0xFFFF // RX_len: // int tx=0x00; SPI(); RX_len=rx; RX_len=(RX_len<<8); tx=0x00; SPI(); RX_len |= rx; // RX_len: = 0x00 0x00(len=len+Data) RX_len -=2; //0...41- UDP/ARP //42...89- Data-48 // RX_len MAX=250 TX_int (0...250) if (RX_len > 250) {RX_len = 250;}; // MACRAW > TX_int (0...250) for (xRX=0; xRX>8); SPI(); // Data -Sn_RX_RD0 -конечный адрес принятых данных //сарший регистр tx=add; SPI(); // Data -Sn_RX_RD1 -конечный адрес принятых данных //младший регистр PORTB.2=1; // SS W5500 /////////////////////////////////////////////// RX: W5500 //пишем команду завершения приема RECV MACRAW: PORTB.2=0; // SS W5500 tx=0x00; SPI(); tx=0x01; SPI(); tx=0x0C; SPI(); // Address Registers + Control Registers tx=0x40; SPI(); // Data -0x40 (команда RECV) PORTB.2=1; // SS W5500 /////////////////////////////////////////////// LCD: PORTD.6=0; // TX PORTD.7=0; // RX //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////RX_ARP:(запрос) /////////////////////////////////////////////// проверка Type ARP: //Type ARP (0x0806): if (TX_int[13] != 0x06) {goto RX_UDP;}; // > RX_UDP /////////////////////////////////////////////// проверка Opcode: (запрос) //Opcode: request (1) (запрос) if (TX_int[21] != 0x01) {goto _1;}; // > _1 /////////////////////////////////////////////// проверка Target IP address: //Target IP address: 192.168.0.3 if (TX_int[38] != 192) {goto _1;}; // > _1 if (TX_int[39] != 168) {goto _1;}; // > _1 if (TX_int[40] != 0) {goto _1;}; // > _1 if (TX_int[41] != 3) {goto _1;}; // > _1 /////////////////////////////////////////////// TX_ARP (ответ): PORTD.6=1; // TX PORTD.7=0; // RX TX_ARP(); // > TX_ARP(ответ) PORTD.6=0; // TX PORTD.7=0; // RX /////////////////////////////////////////////// goto _1; // > _1 //////////////////////////////////////////////////////////////////////////////// RX_UDP: //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////RX_UDP: /////////////////////////////////////////////// проверка Destination MAC: //Destination MAC: (00:08:dc:01:02:03) if (TX_int[0] != 0x00) {goto _1;}; // > _1 if (TX_int[1] != 0x08) {goto _1;}; // > _1 if (TX_int[2] != 0xdc) {goto _1;}; // > _1 if (TX_int[3] != 0x01) {goto _1;}; // > _1 if (TX_int[4] != 0x02) {goto _1;}; // > _1 if (TX_int[5] != 0x03) {goto _1;}; // > _1 /////////////////////////////////////////////// Source MAC > RX_MAC: //RX_MAC[6]={0,0,0,0,0,0}; RX_MAC[0]=TX_int[6]; RX_MAC[1]=TX_int[7]; RX_MAC[2]=TX_int[8]; RX_MAC[3]=TX_int[9]; RX_MAC[4]=TX_int[10]; RX_MAC[5]=TX_int[11]; /////////////////////////////////////////////// проверка Type IP: //Type IP (0x0800): if (TX_int[12] != 0x08) {goto _1;}; // > _1 if (TX_int[13] != 0x00) {goto _1;}; // > _1 /////////////////////////////////////////////// проверка Version: 4, Header length: //Version: 4, Header length: (0x45) if (TX_int[14] != 0x45) {goto _1;}; // > _1 /////////////////////////////////////////////// проверка Differentiated Services Field: //Services Field: (0x00) //if (TX_int[15] != 0x00) {goto _1;}; // > _1 /////////////////////////////////////////////// проверка Total Length: //Total Length: //if (TX_int[16] != 0x00) {goto _1;}; // > _1 //if (TX_int[17] != 0x00) {goto _1;}; // > _1 /////////////////////////////////////////////// проверка Identification: //Identification: //if (TX_int[18] != 0x00) {goto _1;}; // > _1 //if (TX_int[19] != 0x00) {goto _1;}; // > _1 /////////////////////////////////////////////// проверка Fragment offset: //Fragment offset: Don't fragment: 0 //if (TX_int[20] != 0x00) {goto _1;}; // > _1 //if (TX_int[21] != 0x00) {goto _1;}; // > _1 /////////////////////////////////////////////// проверка Time to live: //Time to live: //if (TX_int[22] == 0x00) {goto _1;}; // > _1 /////////////////////////////////////////////// проверка Protocol UDP: //Protocol UDP (17): if (TX_int[23] != 0x11) {goto _1;}; // > _1 /////////////////////////////////////////////// проверка Header checksum IP: //Header checksum IP: //if (TX_int[24] != 0x00) {goto _1;}; // > _1 //if (TX_int[25] != 0x00) {goto _1;}; // > _1 /////////////////////////////////////////////// Source IP > RX_IP: //RX_IP - 0x00 0x00 0x00 0x00 RX_IP[0]=TX_int[26]; RX_IP[1]=TX_int[27]; RX_IP[2]=TX_int[28]; RX_IP[3]=TX_int[29]; /////////////////////////////////////////////// проверка Destination IP: //Destination IP: 192,168,0,3 if (TX_int[30] != 192) {goto _1;}; // > _1 if (TX_int[31] != 168) {goto _1;}; // > _1 if (TX_int[32] != 0) {goto _1;}; // > _1 if (TX_int[33] != 3) {goto _1;}; // > _1 /////////////////////////////////////////////// Source port > RX_port: //Source port: 8000 //if (TX_int[34] != 0x1F) {goto _1;}; // > _1 //if (TX_int[35] != 0x40) {goto _1;}; // > _1 RX_port = TX_int[34]; RX_port = (RX_port<<8) | TX_int[35]; /////////////////////////////////////////////// проверка Destination port: //Destination port: 8000 if (TX_int[36] != 0x1F) {goto _1;}; // > _1 if (TX_int[37] != 0x40) {goto _1;}; // > _1 //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////// RX_len: RX_len -= 42; // RX_len = RX_len - UDP(42) /////////////////////////////////////////////// проверка RX_len(MIN/MAX): if (RX_len != 48){ // Sistema[48] PORTD.6=1; // TX PORTD.7=1; // RX delay_ms(500); // error RX_len: > задержка 0,5 с PORTD.6=0; // TX PORTD.7=0; // RX goto _1; // > _1 }; /////////////////////////////////////////////// TX_int << сдвиг UDP(42) //0...41- UDP/ARP-42 //42...89- Data-48 // RX_len MAX=250 TX_int (0...250) x1TX=42; // UDP(42) for (xRX=0; xRX RX_int (копия) 48 for (xTX=0; xTX<48; xTX++) { //Sistema[48] RX_int[xTX]=TX_int[xTX]; }; /////////////////////////////////////////////// /////////////////////////////////////////////// RX: расшифрование: Key_0: if (Key_N_ == 0){ ///////////////////////////////////////////// RX: Key0 > KeySchedule: if (Key_N_ != b_Key_N_){ Key_0_Key(); //Key_0 > KeySchedule b_Key_N_ = Key_N_; //b_Key_N_ выбор ключей }; ///////////////////////////////////////////// RX: расшифрование: AES_RX(); ///////////////////////////////////////////// RX: crc: fcrcRX(); }; /////////////////////////////////////////////// RX: расшифрование: Key_1: if (Key_N_ == 1){ ///////////////////////////////////////////// RX: Key1 > KeySchedule: if (Key_N_ != b_Key_N_){ Key_1_Key(); //Key_1 > KeySchedule b_Key_N_ = Key_N_; //b_Key_N_ выбор ключей }; ///////////////////////////////////////////// RX: расшифрование: AES_RX(); ///////////////////////////////////////////// RX: crc: fcrcRX(); }; /////////////////////////////////////////////// /////////////////////////////////////////////// /////////////////////////////////////////////// RX: попытка расшифрование: Key_0: if (crcRX != 0){ ///////////////////////////////////////////// RX_int (копия) > TX_int = 48 for (xTX=0; xTX<48; xTX++) { //Sistema[48] TX_int[xTX]=RX_int[xTX]; }; ///////////////////////////////////////////// RX: сброс Буфер Номер Key: b_Key_N_ = 2; //0,1 -Буфер Номер Key -начальное 2 ///////////////////////////////////////////// RX: Key0 > KeySchedule: Key_0_Key(); //Key_0 > KeySchedule ///////////////////////////////////////////// RX: расшифрование: AES_RX(); ///////////////////////////////////////////// RX: crc: fcrcRX(); ///////////////////////////////////////////// RX: crc: if (crcRX == 0){ Key_N_ = 0; b_Key_N_ = Key_N_; //b_Key_N_ выбор ключей }; }; /////////////////////////////////////////////// RX: попытка расшифрование: Key_1: if (crcRX != 0){ ///////////////////////////////////////////// RX_int (копия) > TX_int = 48 for (xTX=0; xTX<48; xTX++) { //Sistema[48] TX_int[xTX]=RX_int[xTX]; }; ///////////////////////////////////////////// RX: сброс Буфер Номер Key: b_Key_N_ = 2; //0,1 -Буфер Номер Key -начальное 2 ///////////////////////////////////////////// RX: Key1 > KeySchedule: Key_1_Key(); //Key_1 > KeySchedule ///////////////////////////////////////////// RX: расшифрование: AES_RX(); ///////////////////////////////////////////// RX: crc: fcrcRX(); ///////////////////////////////////////////// RX: crc: if (crcRX == 0){ Key_N_ = 1; b_Key_N_ = Key_N_; //b_Key_N_ выбор ключей }; }; /////////////////////////////////////////////// расшифрование END //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////// RX: проверка crc: if (crcRX == 0) { ///////////////////////////////////////////// RX: проверка ID_Source: (ЭХО): if (TX_int[23] == 2) { // Server goto _1; //(ЭХО) > _1 }; ///////////////////////////////////////////// RX: RX_MAC > TX_MAC: //TX_MAC[6]={0,0,0,0,0,0}; TX_MAC[0]=RX_MAC[0]; TX_MAC[1]=RX_MAC[1]; TX_MAC[2]=RX_MAC[2]; TX_MAC[3]=RX_MAC[3]; TX_MAC[4]=RX_MAC[4]; TX_MAC[5]=RX_MAC[5]; ///////////////////////////////////////////// RX: RX_IP > TX_IP: //TX_IP - 0x00 0x00 0x00 0x00 TX_IP[0]=RX_IP[0]; TX_IP[1]=RX_IP[1]; TX_IP[2]=RX_IP[2]; TX_IP[3]=RX_IP[3]; ///////////////////////////////////////////// RX: RX_port > TX_port: TX_port = RX_port; ///////////////////////////////////////////// RX: ID_Source > ID_Destination: ID_Destination = TX_int[23]; ///////////////////////////////////////////// ///////////////////////////////////////////// ///////////////////////////////////////////// RX: nonce: //unsigned char flag_nonce = 1; // flag_nonce -начальное 1 //unsigned char nonce[]={ }; // nonce[48] if (flag_nonce == 1){ // flag_nonce -начальное 1 flag_nonce = 0; // сброс flag_nonce ////////////////////////////////// проверка nonce: ////////////////////////////////// TX data_time: / nonce: //TX_int[37] = 0; //часы //TX_int[38] = 0; //минуты //TX_int[39] = 0; //секунды //TX_int[40] = 0; //число //TX_int[41] = 0; //месяц //TX_int[42] = 0; //год //TX_int[43] = 0; //год ////////////////////////////////// проверка nonce: for (xRX=37; xRX<44; xRX++) { if (nonce[xRX] != TX_int[xRX])// проверка: nonce != TX_int { flag_nonce = 1; // установка flag_nonce }; }; ////////////////////////////////// проверка Key_N_ == 1: if (Key_N_ != 1) // проверка: Key_N_ != 1 { flag_nonce = 1; // установка flag_nonce }; ////////////////////////////////// проверка flag_nonce: if (flag_nonce == 1){ flag_error_vektor = 1; // установка флаг error_vektor error_vektor = 1; // установка флаг error_vektor PORTD.6=1; // TX PORTD.7=0; // RX TX_len = 48; // TX_len = 48 TX_UDP(); // > TX_UDP() //TX_Modem(); // > TX_Modem() //TX_TV(); // > TX_TV() PORTD.6=0; // TX PORTD.7=0; // RX goto _1; // > _1 }; ////////////////////////////////// };//flag_nonce == 1 ///////////////////////////////////////////// ///////////////////////////////////////////// nonce END ///////////////////////////////////////////// RX: проверка vektor: error_vektor = 1; // установка флаг error_vektor ///////////////////////////////////////////// RX: vektor_0, Key_N = 0: if (Key_N_ == 0){ for (xRX=1; xRX<16; xRX++) { if (vektor_RX[xRX] > K_int[xRX]) { flag_error_vektor = 0;// сброс флаг error_vektor error_vektor = 0; // сброс error_vektor xRX=16; // стоп цикл } else { if (K_int[xRX] > vektor_RX[xRX]) { xRX=16; // стоп цикл }; }; }; /////////////////////////////////////////// RX: флаг error_vektor if (error_vektor == 0) { for (xRX=1; xRX<16; xRX++) { K_int[xRX] = vektor_RX[xRX]; // запись vektor_0 }; }; };//if (Key_N_ == 0){ ////////////////////////////////////////////// RX: vektor_1, Key_N = 1: if (Key_N_ == 1){ for (xRX=1; xRX<16; xRX++) { if (vektor_RX[xRX] > K_int[xRX+48]) { flag_error_vektor = 0;// сброс флаг error_vektor error_vektor = 0; // сброс error_vektor xRX=16; // стоп цикл } else { if (K_int[xRX+48] > vektor_RX[xRX]) { xRX=16; // стоп цикл }; }; }; /////////////////////////////////////////// RX: флаг error_vektor if (error_vektor == 0) { for (xRX=1; xRX<16; xRX++) { K_int[xRX+48] = vektor_RX[xRX]; // запись vektor_1 }; }; };//if (Key_N_ == 1){ ///////////////////////////////////////////////// crc == 0 } else { ///////////////////////////////////////////////// error_crc: //0...255 - error_key ++ error_key ++; // 0...255 // int if (error_key > 255) {error_key = 255;}; //blok_sys: //-начальное 0. //if (error_key > 100) {blok_sys = 1;}; PORTD.6=1; // TX PORTD.7=1; // RX delay_ms(500); // error_crc > задержка 0,5 с PORTD.6=0; // TX PORTD.7=0; // RX goto _1; // > _1 }; //////////////////////////////////////////////////////////////////////////////// //systema: //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////проверка флаг error_vektor_TX: //TX_int[25] = 0; //0b00001000 -флаг error_key_1 //0b00000100 -флаг error_blok_sys //0b00000010 -флаг error_vektor //0b00000001 -флаг error_EEPROM if (TX_int[25] & 0x02){ //0000 0010 -флаг error_vektor goto _1; // > _1 }; //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////флаг Key_N_: //TX_int[25] = 0; //0b00001000 -флаг error_key_1 //0b00000100 -флаг error_blok_sys //0b00000010 -флаг error_vektor //0b00000001 -флаг error_EEPROM if (Key_N_ == 0) {error_key_1 = 1;} // установить флаг else {error_key_1 = 0;}; // сброс флаг //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////проверка TX_len == RX_len: xTX=TX_int[20]; xTX=(xTX<<8)|TX_int[21]; if (xTX != RX_len){ PORTD.6=1; // TX PORTD.7=1; // RX delay_ms(500); // error RX_len > задержка 0,5 с PORTD.6=0; // TX PORTD.7=0; // RX goto _1; // > _1 }; //////////////////////////////////////////////////////////////////////////////// //switch: //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////проверка ID_Destination: TV: if (TX_int[22] == 3) { ///////////////////////////////////////////// проверка флаг error Система: if (blok_sys || error_vektor || error_EEPROM || error_key || error_key_1) { // ///////////////////////////////////////////// TX_int[24] = 0; //сброс флаги: goto status_systema; // > status_systema }; ////////////////////////////////////////////// TX_TV: //TV SAMSUNG //22h - длительность преамбулы. -4,5 mc //22h - длительность преамбулы. -4,5 mc //07h - адрес устройства (SAMSUNG). //07h - адрес устройства (SAMSUNG). //68h - адрес команды (номер кнопки). //97h - инверсия адрес команды (номер кнопки). //TV_int[0] = 0x07; //07h - адрес устройства (SAMSUNG). //TV_int[1] = 0x07; //07h - адрес устройства (SAMSUNG). //TV_int[2] = 0x68; //68h - адрес команды (номер кнопки). //TV_int[3] =~ TV_int[2]; //97h - инверсия адрес команды (номер кнопки). ////////////////////////////////////////////// TV (номер кнопки): //TX_int[34] = 0; // -TV (номер кнопки) TV_int[2] = TX_int[34]; ////////////////////////////////////////////// TX_TV: PORTD.6=1; // TX PORTD.7=0; // RX TX_TV(); // > TX_TV() PORTD.6=0; // TX PORTD.7=0; // RX ///////////////////////////////////////////// TX_UDP: PORTD.6=1; // TX PORTD.7=0; // RX ID_Source = 3; // TV TX_len = 48; // TX_len = 48 TX_UDP(); // > TX_UDP() //TX_Eth(); // > TX_Eth() //TX_Modem_0(); // > TX_Modem_0() //TX_TV(); // > TX_TV() PORTD.6=0; // TX PORTD.7=0; // RX ///////////////////////////////////////////// goto _1; // > _1 }; //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////проверка ID_Destination: Modem: if (TX_int[22] == 4) { ///////////////////////////////////////////// проверка флаг error Система: if (blok_sys || error_vektor || error_EEPROM || error_key) { // || error_key_1 ///////////////////////////////////////////// TX_int[24] = 0; //сброс флаги: goto status_systema; // > status_systema }; /////////////////////////////////////////////// RX_int > TX_int (копия) 48 for (xTX=0; xTX<48; xTX++) { TX_int[xTX]=RX_int[xTX]; }; /////////////////////////////////////////////// TX_Modem: PORTD.6=1; // TX PORTD.7=0; // RX TX_len = 48; // TX_len = 48 //TX_UDP(); // > TX_UDP() //TX_Eth(); // > TX_Eth() TX_Modem(); // > TX_Modem() //TX_TV(); // > TX_TV() PORTD.6=0; // TX PORTD.7=0; // RX /////////////////////////////////////////////// установить флаг TX_ПК flag_TX_PC = 1; /////////////////////////////////////////////// goto _1; // > _1 }; //////////////////////////////////////////////////////////////////////////////// //systema: //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////проверка ID_Destination: if (TX_int[22] != 2) { // Server goto _1; // > _1 }; //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////флаги: //TX_int[24] = 0; //control = 31 - статус_sys >> //control = 32 - статус_sys << ACK //control = 33 - запись_sys >> //control = 34 - запись_sys << ACK //control = 35 - чтение_EE >> //control = 36 - чтение_EE << ACK //control = 37 - запись_EE >> //control = 38 - запись_EE << ACK //control = 39 - error_key- >> //control = 40 - error_key- << ACK //control = 41 - blok_sys >> //control = 42 - blok_sys << ACK //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////проверка флаг Статус: if (TX_int[24] == 31) { //control = 31 - статус_sys >> TX_int[24] = 32; //control = 32 - статус_sys << ACK //////////////////////////////////таймер_H/время_ON/время_OFF/: //TX_int[35] = 0; //таймер_H/время_ON/время_OFF/ //TX_int[36] = 0; //таймер_L //unsigned char st_Timer = 0; //счёт Timer -таймер_H/время_ON/время_OFF/ //unsigned char hour_ON; //часы ON //unsigned char min_ON; //минуты ON //unsigned char hour_OFF; //часы OFF //unsigned char min_OFF; //минуты OFF //0b00000011 > 0b11000000 //счёт Timer -таймер_H/время_ON/время_OFF/ //Sistema_2[35] = (st_Timer << 6) + slider_2_2_таймер.getValue(); st_Timer = (TX_int[35]>>6); ////////////////////////////////////////////// goto status_systema; // > status_systema }; //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////проверка флаг Запись Система > ОЗУ: if (TX_int[24] == 33) { //control = 33 - запись_sys >> TX_int[24] = 34; //control = 34 - запись_sys << ACK ///////////////////////////////////////////// проверка флаг error Система: if (blok_sys || error_vektor || error_EEPROM || error_key || error_key_1) { // goto status_systema; // > status_systema }; //////////////////////////////////TX Ползунок: (7...0) //TX_int[30] = 0; // -Ползунок 7 Температура MSB (DS18B20) //TX_int[31] = 0; // -Ползунок 6 Температура LSB (DS18B20) //TX_int[32] = 0; // -Ползунок 5 Температура MAX //TX_int[33] = 0; // -Ползунок 4 Температура MIN //TX_int[34] = 0; // -TV (номер кнопки)|ток //slider_7 = TX_int[30]; //slider_6 = TX_int[31]; slider_5 = TX_int[32]; slider_4 = TX_int[33]; //////////////////////////////////таймер_H/время_ON/время_OFF/: //TX_int[35] = 0; //таймер_H/время_ON/время_OFF/ //TX_int[36] = 0; //таймер_L //unsigned char st_Timer = 0; //счёт Timer -таймер_H/время_ON/время_OFF/ //unsigned char hour_ON; //часы ON //unsigned char min_ON; //минуты ON //unsigned char hour_OFF; //часы OFF //unsigned char min_OFF; //минуты OFF //0b00000011 > 0b11000000 //счёт Timer -таймер_H/время_ON/время_OFF/ //Sistema_2[35] = (st_Timer << 6) + slider_2_2_таймер.getValue(); st_Timer = (TX_int[35]>>6); TX_int[35] = TX_int[35] & 0x3F; //0b11000000 // сброс st_Timer if (st_Timer == 0){timer_H = TX_int[35]; timer_L = TX_int[36];}; if (st_Timer == 1){hour_ON = TX_int[35]; min_ON = TX_int[36];}; if (st_Timer == 2){hour_OFF = TX_int[35]; min_OFF = TX_int[36];}; TX_int[35] |= (st_Timer<<6); //////////////////////////////////часы: //TX_int[37] = 0; //часы //TX_int[38] = 0; //минуты //TX_int[39] = 0; //секунды //TX_int[40] = 0; //число //TX_int[41] = 0; //месяц //TX_int[42] = 0; //год //TX_int[43] = 0; //год //unsigned char sec; //секунды //unsigned char min; //минуты //unsigned char hour; //часы //unsigned char day; //число //unsigned char mon; //месяц //unsigned int year; //год sec = TX_int[39]; //секунды min = TX_int[38]; //минуты hour = TX_int[37]; //часы day = TX_int[40]; //число mon = TX_int[41]; //месяц year = TX_int[42]; //год year = (year<<8)|TX_int[43]; //год ///////////////////////////////////////////// goto status_systema; // > status_systema }; //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////проверка флаг лампа (7...4): if (TX_int[27]) { ///////////////////////////////////////////// проверка флаг error Система: if (blok_sys || error_vektor || error_EEPROM || error_key || error_key_1) { // TX_int[27] = 0; // сброс флаги goto status_systema; // > status_systema }; //////////////////////////////////TX флаги: лампа_1: (7...4) //TX_int[27] = 0; //0b10000000 -лампа: 7 ON //0b01000000 -лампа: 7 OFF //0b00100000 -лампа: 6 ON //0b00010000 -лампа: 6 OFF //0b00001000 -лампа: 5 ON //0b00000100 -лампа: 5 OFF //0b00000010 -лампа: 4 ON //0b00000001 -лампа: 4 OFF if (TX_int[27] & 0b10000000) {Lampa |= 0b10000000;}; if (TX_int[27] & 0b01000000) {Lampa &= 0b01111111;}; if (TX_int[27] & 0b00100000) {Lampa |= 0b01000000;}; if (TX_int[27] & 0b00010000) {Lampa &= 0b10111111;}; if (TX_int[27] & 0b00001000) {Lampa |= 0b00100000;}; if (TX_int[27] & 0b00000100) {Lampa &= 0b11011111;}; if (TX_int[27] & 0b00000010) {Lampa |= 0b00010000;}; if (TX_int[27] & 0b00000001) {Lampa &= 0b11101111;}; ///////////////////////////////////////////// TX_int[27] = 0; // сброс флаги ///////////////////////////////////////////// реле: if (Lampa & 0b10000000) {PORTC.0=1;} // вкл. реле_0 else {PORTC.0=0;}; // выкл. реле_0 if (Lampa & 0b00010000) {PORTC.1=1;} // вкл. реле_1 else {PORTC.1=0;}; // выкл. реле_1 ///////////////////////////////////////////// goto status_systema; // > status_systema }; //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////проверка флаг лампа (3...0): if (TX_int[28]) { ///////////////////////////////////////////// проверка флаг error Система: if (blok_sys || error_vektor || error_EEPROM || error_key || error_key_1) { // TX_int[28] = 0; // сброс флаги goto status_systema; // > status_systema }; //////////////////////////////////TX флаги: лампа_0: (3...0) //TX_int[28] = 0; //0b10000000 -лампа: 3 ON //0b01000000 -лампа: 3 OFF //0b00100000 -лампа: 2 ON //0b00010000 -лампа: 2 OFF //0b00001000 -лампа: 1 ON //0b00000100 -лампа: 1 OFF //0b00000010 -лампа: 0 ON //0b00000001 -лампа: 0 OFF if (TX_int[28] & 0b10000000) {Lampa |= 0b00001000;}; if (TX_int[28] & 0b01000000) {Lampa &= 0b11110111;}; if (TX_int[28] & 0b00100000) {Lampa |= 0b00000100;}; if (TX_int[28] & 0b00010000) {Lampa &= 0b11111011;}; if (TX_int[28] & 0b00001000) {Lampa |= 0b00000010;}; if (TX_int[28] & 0b00000100) {Lampa &= 0b11111101;}; if (TX_int[28] & 0b00000010) {Lampa |= 0b00000001;}; if (TX_int[28] & 0b00000001) {Lampa &= 0b11111110;}; ///////////////////////////////////////////// TX_int[28] = 0; // сброс флаги ///////////////////////////////////////////// бузер: //0b00000100 -лампа: 2 ON/OFF //if (Lampa & 0b00000100) { //PORTC.2=1; // вкл. бузер //delay_ms(500); //PORTC.2=0; // выкл. бузер //Lampa &= 0b11111011; // сброс бузер //}; ///////////////////////////////////////////// goto status_systema; // > status_systema }; //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////проверка флаг Чтение EEPROM: if (TX_int[24] == 35) { //control = 35 - чтение_EE >> TX_int[24] = 36; //control = 36 - чтение_EE << ACK ///////////////////////////////////////////// проверка флаг error Система: if (blok_sys || error_vektor || error_EEPROM || error_key || error_key_1) { // goto status_systema; // > status_systema }; ///////////////////////////////////////////// TX_int > RX_int (копия) = 48 for (xTX=0; xTX<48; xTX++) { //Sistema[48] RX_int[xTX]=TX_int[xTX]; }; ///////////////////////////////////////////// RX_EEPROM(); // Чтение EEPROM: (EEPROM > ОЗУ) ///////////////////////////////////////////// реле: if (Lampa & 0b10000000) {PORTC.0=1;} // вкл. реле_0 else {PORTC.0=0;}; // выкл. реле_0 if (Lampa & 0b00010000) {PORTC.1=1;} // вкл. реле_1 else {PORTC.1=0;}; // выкл. реле_1 ///////////////////////////////////////////// RX_int (копия) > TX_int = 48 for (xTX=0; xTX<48; xTX++) { //Sistema[48] TX_int[xTX]=RX_int[xTX]; }; ///////////////////////////////////////////// goto status_systema; // > status_systema }; //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////проверка флаг Запись EEPROM: if (TX_int[24] == 37) { //control = 37 - запись_EE >> TX_int[24] = 38; //control = 38 - запись_EE << ACK ///////////////////////////////////////////// проверка флаг error Система: if (blok_sys || error_vektor || error_key || error_key_1) { // || error_EEPROM goto status_systema; // > status_systema }; ///////////////////////////////////////////// TX_int > RX_int (копия) = 48 for (xTX=0; xTX<48; xTX++) { //Sistema[48] RX_int[xTX]=TX_int[xTX]; }; ///////////////////////////////////////////// TX_EEPROM(); // Запись EEPROM: (ОЗУ > EEPROM) ///////////////////////////////////////////// RX_int (копия) > TX_int = 48 for (xTX=0; xTX<48; xTX++) { //Sistema[48] TX_int[xTX]=RX_int[xTX]; }; ///////////////////////////////////////////// goto status_systema; // > status_systema }; //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////проверка флаг error_key-: if (TX_int[24] == 39) { //control = 39 - error_key- >> TX_int[24] = 40; //control = 40 - error_key- << ACK ///////////////////////////////////////////// проверка флаг error Система: if (blok_sys || error_vektor || error_key_1) { // || error_key || error_EEPROM goto status_systema; // > status_systema }; ////////////////////// //TX_int[26] = 0; //0...255 - error_key-- error_key --; // int if (error_key > 255) {error_key = 0;}; ////////////////////// goto status_systema; // > status_systema }; //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////проверка флаг blok_sys: if (TX_int[24] == 41) { //control = 41 - blok_sys >> TX_int[24] = 42; //control = 42 - blok_sys << ACK ///////////////////////////////////////////// проверка флаг error Система: if (error_vektor || error_key_1) { // || blok_sys|| error_EEPROM || error_key goto status_systema; // > status_systema }; ///////////////////////////////////////////// blok_sys = 1; // blok_sys //-начальное 0. /////////////////////////////////////////////// TX_int > RX_int (копия) = 48 for (xTX=0; xTX<48; xTX++) { //Sistema[48] RX_int[xTX]=TX_int[xTX]; }; ///////////////////////////////////////////// TX_EEPROM(); // запись EEPROM: (ОЗУ > EEPROM) ///////////////////////////////////////////// RX_int (копия) > TX_int = 48 for (xTX=0; xTX<48; xTX++) { //Sistema[48] TX_int[xTX]=RX_int[xTX]; }; ///////////////////////////////////////////// goto status_systema; // > status_systema }; ///////////////////////////////////////////////////////////////////////флаги END //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////верификация: Клиент = Сервер: //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////проверка флаг статус_sys << ACK: //control = 31 - статус_sys >> //control = 32 - статус_sys << ACK //control = 33 - запись_sys >> //control = 34 - запись_sys << ACK //control = 35 - чтение_EE >> //control = 36 - чтение_EE << ACK //control = 37 - запись_EE >> //control = 38 - запись_EE << ACK //control = 39 - error_key- >> //control = 40 - error_key- << ACK //control = 41 - blok_sys >> //control = 42 - blok_sys << ACK if (TX_int[24] == 32) { //control = 32 - статус_sys << ACK ////////////////////////////////////////////////////////проверка error_vektor: if (error_vektor) { // || blok_sys || error_EEPROM || error_key || error_key_1 goto _1; // > _1 }; //////////////////////////////////RX флаги: лампа (7...0) //TX_int[29] = 0; //0b10000000 -лампа: 7 ON/OFF //0b01000000 -лампа: 6 ON/OFF //0b00100000 -лампа: 5 ON/OFF //0b00010000 -лампа: 4 ON/OFF //0b00001000 -лампа: 3 ON/OFF //0b00000100 -лампа: 2 ON/OFF //0b00000010 -лампа: 1 ON/OFF //0b00000001 -лампа: 0 ON/OFF ////////////////////////////////// //TX_int[29] = 0; if (TX_int[29] != Lampa) { goto _1; }; // > _1 //////////////////////////////////TX Ползунок: (7...0) //TX_int[30] = 0; //Ползунок 7 Температура MSB (DS18B20) //TX_int[31] = 0; //Ползунок 6 Температура LSB (DS18B20) //TX_int[32] = 0; //Ползунок 5 Температура MAX //TX_int[33] = 0; //Ползунок 4 Температура MIN //TX_int[34] = 0; //TV (номер кнопки)|ток //TX_int[35] = 0; //таймер_H //TX_int[36] = 0; //таймер_L if (TX_int[30] != slider_7) { goto _1; }; // > _1 if (TX_int[31] != slider_6) { goto _1; }; // > _1 if (TX_int[32] != slider_5) { goto _1; }; // > _1 if (TX_int[33] != slider_4) { goto _1; }; // > _1 //if (TX_int[35] != (timer>>8)) { goto _1; }; // > _1 //if (TX_int[36] != timer) { goto _1; }; // > _1 ////////////////////////////////////////////////////////////////////////////// TX_UDP_st = 0; //сброс счёт TX_UDP_st Time_TX_UDP_st=0; //сброс счёт Time_TX_UDP_st }; //////////////////////////////////////////////////////////////////////////////// goto _1; // > _1 status_systema: //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////// vektor: //TX_int[0] = ID_Source; //TX_int[1]...TX_int[15] = vektor[1]...vektor[15]; ////////////////////////////////// LocalHost: //TX_int[16] = TX_IP[0]; // TX_IP > TX_int //TX_int[17] = TX_IP[1]; // TX_IP > TX_int //TX_int[18] = TX_IP[2]; // TX_IP > TX_int //TX_int[19] = TX_IP[3]; // TX_IP > TX_int ////////////////////////////////// len: //TX_int[20] =(TX_len>>8); //TX_int[21] =TX_len; ////////////////////////////////// ID_Destination: //TX_int[22] = ID_Destination; ////////////////////////////////// ID_Source: //TX_int[23] = ID_Source; ////////////////////////////////// флаги: //TX_int[24] = 0; //control = 31 - статус_sys >> //control = 32 - статус_sys << ACK //control = 33 - запись_sys >> //control = 34 - запись_sys << ACK //control = 35 - чтение_EE >> //control = 36 - чтение_EE << ACK //control = 37 - запись_EE >> //control = 38 - запись_EE << ACK //control = 39 - error_key- >> //control = 40 - error_key- << ACK //control = 41 - blok_sys >> //control = 42 - blok_sys << ACK ////////////////////////////////// флаги error: //TX_int[25] = 0; //0b00001000 -флаг error_key_1 //0b00000100 -флаг error_blok_sys //0b00000010 -флаг error_vektor //0b00000001 -флаг error_EEPROM TX_int[25] = (error_key_1<<3); // error_key_1 TX_int[25] |= (blok_sys<<2); // error_blok_sys TX_int[25] |= (error_vektor<<1); // error_vektor TX_int[25] |= error_EEPROM; // error_EEPROM ////////////////////////////////// флаги error: //TX_int[26] = 0; TX_int[26] = error_key; // int 0...255 - error_key ////////////////////////////////// TX флаги: лампа (7...4) //TX_int[27] = 0; TX_int[27] = 0; //сброс TX флаги: лампа (7...4) ////////////////////////////////// TX флаги: лампа (3...0) //TX_int[28] = 0; TX_int[28] = 0; //сброс TX флаги: лампа (3...0) ////////////////////////////////// ACK флаги: лампа (7...0) //TX_int[29] = 0; //0b10000000 -лампа: 7 ON/OFF //0b01000000 -лампа: 6 ON/OFF //0b00100000 -лампа: 5 ON/OFF //0b00010000 -лампа: 4 ON/OFF //0b00001000 -лампа: 3 ON/OFF //0b00000100 -лампа: 2 ON/OFF //0b00000010 -лампа: 1 ON/OFF //0b00000001 -лампа: 0 ON/OFF TX_int[29] = Lampa; ////////////////////////////////// TX Ползунок: (7...0) //TX_int[30] = 0; //Ползунок 7 Температура MSB (DS18B20) //TX_int[31] = 0; //Ползунок 6 Температура LSB (DS18B20) //TX_int[32] = 0; //Ползунок 5 Температура MAX //TX_int[33] = 0; //Ползунок 4 Температура MIN TX_int[30] = slider_7; //Ползунок 7 Температура MSB TX_int[31] = slider_6; //Ползунок 6 Температура LSB TX_int[32] = slider_5; //Ползунок 5 Температура MAX TX_int[33] = slider_4; //Ползунок 4 Температура MIN ////////////////////////////////// датчик тока: //TX_int[34] = 0; //TV (номер кнопки)|ток //tok = 0; // сброс датчик тока //for (xGS=0; xGS<40; xGS++) { // счёт ток 50 гц * 2 = 40 мс adc(5); u=ADCW; // канал ADC 5 //if (u > tok) tok = u; // АЦП > датчик тока //delay_ms(1); // 1 мс //}; TX_int[34] = (u>>2); //TV (номер кнопки)|ток //////////////////////////////////таймер_H/время_ON/время_OFF/: //TX_int[35] = 0; //таймер_H/время_ON/время_OFF/ //TX_int[36] = 0; //таймер_L //unsigned char st_Timer = 0; //счёт Timer -таймер_H/время_ON/время_OFF/ //unsigned char hour_ON; //часы ON //unsigned char min_ON; //минуты ON //unsigned char hour_OFF; //часы OFF //unsigned char min_OFF; //минуты OFF //0b00000011 > 0b11000000 //счёт Timer -таймер_H/время_ON/время_OFF/ //Sistema_2[35] = (st_Timer << 6) + slider_2_2_таймер.getValue(); //st_Timer = (TX_int[35]>>6); if (st_Timer == 0){TX_int[35] = timer_H; TX_int[36] = timer_L;}; if (st_Timer == 1){TX_int[35] = hour_ON; TX_int[36] = min_ON;}; if (st_Timer == 2){TX_int[35] = hour_OFF; TX_int[36] = min_OFF;}; TX_int[35] |= (st_Timer<<6); ////////////////////////////////// TX data_time: //TX_int[37] = 0; //часы //TX_int[38] = 0; //минуты //TX_int[39] = 0; //секунды //TX_int[40] = 0; //число //TX_int[41] = 0; //месяц //TX_int[42] = 0; //год //TX_int[43] = 0; //год TX_int[37] = hour;//часы TX_int[38] = min; //минуты TX_int[39] = sec; //секунды TX_int[40] = day; //число TX_int[41] = mon; //месяц TX_int[42] = (year>>8); //год TX_int[43] = year; //год ////////////////////////////////// crc: //TX_int[44] = 0; //crc //TX_int[45] = 0; //crc //TX_int[46] = 0; //crc //TX_int[47] = 0; //crc ////////////////////////////////// контроль RX_TSOP: //Modem_int[]={ //48 байт * 8 бит = 386 (0...385) /* TX_int[37] = TSOPst; // счёт TSOP TX_int[38] = TSOP_start_0; // TSOP старт бит 0 TX_int[39] = TSOP_start_1; // TSOP старт бит 1 TX_int[40] = TSOP_byte_0; // TSOP байт 0 TX_int[41] = TSOP_byte_1; // TSOP байт 1 TX_int[42] = TSOP_byte_2; // TSOP байт 2 TX_int[43] = TSOP_byte_3; // TSOP байт 3 */ ////////////////////////////////// контроль RX_Modem: //Modem_int[]={ //48 байт * 8 бит = 386 (0...385) /* TX_int[37] = Modem_int[379]; TX_int[38] = Modem_int[380]; TX_int[39] = Modem_int[381]; TX_int[40] = Modem_int[382]; TX_int[41] = Modem_int[383]; TX_int[42] = Modem_int[384]; TX_int[43] = Modem_int[385]; */ //////////////////////////////////////////////////////////////////////////////// //DDRB.5=1; // выход SCK Eth //DDRB.3=1; // выход MOSI Eth //ждём готовность SPI Eth... TX_W5500 //delay_ms(1); PORTD.6=1; // TX PORTD.7=0; // RX ID_Source = 2; // Server TX_len = 48; // TX_len = 48 TX_UDP(); // > TX_UDP() //TX_Eth(); // > TX_Eth() //TX_Modem(); // > TX_Modem() //TX_TV(); // > TX_TV() PORTD.6=0; // TX PORTD.7=0; // RX //DDRB.5=0; // вход SCK Eth //DDRB.3=0; // вход MOSI Eth //////////////////////////////////////////////////////////////////////////////// goto _1; // > _1 } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////// vektor: //TX_int[0] = ID_Source; //TX_int[1]...TX_int[15] = vektor[1]...vektor[15]; //////////////////////////////////LocalHost: //TX_int[16] = IP_LocalHost_int[0]; // TX_IP[0] > TX_int //TX_int[17] = IP_LocalHost_int[1]; // TX_IP[1] > TX_int //TX_int[18] = IP_LocalHost_int[2]; // TX_IP[2] > TX_int //TX_int[19] = IP_LocalHost_int[3]; // TX_IP[3] > TX_int ////////////////////////////////// len: //TX_int[20] = 0; //TX_int[21] = 48; ////////////////////////////////// ID_Destination: //TX_int[22] = ID_Destination; ////////////////////////////////// ID_Source: //TX_int[23] = ID_Source; ////////////////////////////////// TX флаги: //TX_int[24] = 0; //control = 31 - статус_sys >> //control = 32 - статус_sys << ACK //control = 33 - запись_sys >> //control = 34 - запись_sys << ACK //control = 35 - чтение_EE >> //control = 36 - чтение_EE << ACK //control = 37 - запись_EE >> //control = 38 - запись_EE << ACK //control = 39 - error_key- >> //control = 40 - error_key- << ACK //control = 41 - blok_sys >> //control = 42 - blok_sys << ACK ////////////////////////////////// RX флаги: //TX_int[25] = 0; //0b00001000 -флаг error_key_1 //0b00000100 -флаг error_blok_sys //0b00000010 -флаг error_vektor //0b00000001 -флаг error_EEPROM ////////////////////////////////// RX флаги: error_key++: //TX_int[26] = 0; //0...255 - error_key++ ////////////////////////////////// TX флаги: лампа: (7...4) //TX_int[27] = 0; //0b10000000 -лампа: 7 ON //0b01000000 -лампа: 7 OFF //0b00100000 -лампа: 6 ON //0b00010000 -лампа: 6 OFF //0b00001000 -лампа: 5 ON //0b00000100 -лампа: 5 OFF //0b00000010 -лампа: 4 ON //0b00000001 -лампа: 4 OFF ////////////////////////////////// TX флаги: лампа: (3...0) //TX_int[28] = 0; //0b10000000 -лампа: 3 ON //0b01000000 -лампа: 3 OFF //0b00100000 -лампа: 2 ON //0b00010000 -лампа: 2 OFF //0b00001000 -лампа: 1 ON //0b00000100 -лампа: 1 OFF //0b00000010 -лампа: 0 ON //0b00000001 -лампа: 0 OFF ////////////////////////////////// RX флаги: лампа: (7...0) //TX_int[29] = 0; //0b10000000 -лампа: 7 ON/OFF //0b01000000 -лампа: 6 ON/OFF //0b00100000 -лампа: 5 ON/OFF //0b00010000 -лампа: 4 ON/OFF //0b00001000 -лампа: 3 ON/OFF //0b00000100 -лампа: 2 ON/OFF //0b00000010 -лампа: 1 ON/OFF //0b00000001 -лампа: 0 ON/OFF ////////////////////////////////// TX Ползунок: (7...0) //TX_int[30] = 0; //Ползунок 7 Температура MSB (DS18B20) //TX_int[31] = 0; //Ползунок 6 Температура LSB (DS18B20) //TX_int[32] = 0; //Ползунок 5 Температура MAX //TX_int[33] = 0; //Ползунок 4 Температура MIN //TX_int[34] = 0; //TV (номер кнопки)|ток //TX_int[35] = 0; //таймер_H/время_ON/время_OFF/ //TX_int[36] = 0; //таймер_L ////////////////////////////////// TX data_time: / nonce //TX_int[37] = 0; //часы //TX_int[38] = 0; //минуты //TX_int[39] = 0; //секунды //TX_int[40] = 0; //число //TX_int[41] = 0; //месяц //TX_int[42] = 0; //год //TX_int[43] = 0; //год ////////////////////////////////// crc //TX_int[44] = 0; //crc //TX_int[45] = 0; //crc //TX_int[46] = 0; //crc //TX_int[47] = 0; //crc //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////TX_Eth: //if (PINC.4 == 0) { // TX_Eth(); //}; //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////программатор: //if (PINC.0 == 0) { // PORTD.1=0; // выкл // выход SCK (внешняя) PD1 // PORTD.0=1; // вкл // выход SCK (внутреняя) PD0 // while (1) {}; // ждём программатор... //}; //////////////////////////////////////////////////////////////////////////////// //delay_ms(1); // 1ms - (8 МГц) //delay_us(2500); // 2,5ms - (20 МГц) //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////счёт auto_init: /* st_auto_init_RX_Ethernet ++; /////////////////////////////////////////////////////////////проверка auto_init: if (st_auto_init_RX_Ethernet > 60000) { // MAX = 60 c. /////////////////////////////////////////////// TX_ARP_router (запрос): DDRB.5=1; // выход SCK DDRB.3=1; // выход MOSI //ждём готовность SPI... TX_W5500 delay_ms(1); PORTD.6=1; // TX PORTD.7=0; // RX //TX_ARP(); // > TX_ARP (ответ) TX_ARP_router(); // > TX_ARP_router (запрос) PORTD.6=0; // TX PORTD.7=0; // RX DDRB.5=0; // вход SCK DDRB.3=0; // вход MOSI /////////////////////////////////////////////// }; /////////////////////////////////////////////////////////////проверка auto_init: if (st_auto_init_RX_Ethernet > 65000) { // MAX = 65 c. st_auto_init_RX_Ethernet = 0; // сброс счёт st_auto_init_RX_Ethernet // int init_RX_Ethernet(); // > init_RX_Ethernet // int ////////////////////////////////// //TX_int[114] = 0xFF; // код ошибки 0xFF //TX_int[115] = 0xFF; // код ошибки 0xFF //goto TX_W5500; // > TX_W5500 //контроль }; */ //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////RX_Eth: //проверка INT RX_Eth: /* if (PINC.3 == 1) { goto _1; // RX_Eth пуст > _1 }; /////////////////////////////////////////////// RX: ждём окончания приёма... st_auto_init_RX_Ethernet = 0; // сброс счёт st_auto_init_RX_Eth // int //ждём окончания приёма... RX_Ethernet //delay_ms(1); // 1ms - (8 МГц) //delay_us(2500); // 2,5ms - (20 МГц) //8+512+4=524байт=4192бит=419,2us*2,5=1048us delay_us(1100); // 1,1ms - (20 МГц) /////////////////////////////////////////////// RX: SCK (внутреняя) PD0 PORTD.1=0; // выкл // выход SCK (внешняя) PD1 PORTD.0=1; // вкл // выход SCK (внутреняя) PD0 //ждём FIFO полный... RX_Eth //delay_ms(1); // 1ms - (8 МГц) //delay_us(2500); // 2,5ms - (20 МГц) //8+512+4=524байт=4192бит=419,2us*2,5=1048us delay_us(1100); // 1,1ms - (20 МГц) /////////////////////////////////////////////// RX: SS: PORTC.2=1; // RX_Ethernet SS //ждём готовность SPI... RX_Eth //delay_ms(1); delay_us(10); // 10us - (20 МГц) /////////////////////////////////////////////// RX: SS: PORTC.2=0; // RX_Ethernet SS //ждём готовность SPI... RX_Eth //delay_ms(1); delay_us(10); // 10us - (20 МГц) /////////////////////////////////////////////// RX: SPI DDRB.5=1; // выход SCK DDRB.3=1; // выход MOSI //ждём готовность SPI... RX_Eth //delay_ms(1); delay_us(10); // 10us - (20 МГц) PORTC.2=0; // SS RX_Ethernet for (xRX=0; xRX<512; xRX++) { //delay_ms(1); tx=0x00; SPI(); TX_int[xRX]=rx; }; PORTC.2=1; // SS RX_Eth DDRB.5=0; // вход SCK DDRB.3=0; // вход MOSI /////////////////////////////////////////////// RX: //ждём готовность SPI... RX_Eth //delay_ms(1); delay_us(10); // 10us - (20 МГц) /////////////////////////////////////////////// RX: SCK (внешняя) PD1 PORTD.0=0; // выкл // выход SCK (внутреняя) PD0 /////////////////////////////////////////////// RX: SS: PORTC.2=0; // RX_Eth SS /////////////////////////////////////////////// RX: SCK (внешняя) PD1 PORTD.1=1; // вкл // выход SCK (внешняя) PD1 /////////////////////////////////////////////// RX END //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////// RX: ~инверсия Eth: //if (PINC.4 == 0) { // for (xRX=0; xRX<512; xRX++) { // TX_int[xRX] =~ TX_int[xRX]; // }; //}; /////////////////////////////////////////////// //unsigned char st_bayt_RX_Eth; // счётчик байт RX_Eth //unsigned char bufer_bayt_RX_Eth; // буфер байт RX_Eth //unsigned char flag_RX_Eth; // флаг RX_Eth //unsigned char sdvig_RX_Eth; // сдвиг RX_Eth //unsigned char bufer_sdvig_RX_Eth; // буфер сдвиг RX_Eth //unsigned char mask_RX_Eth; // маска RX_Eth //unsigned char bufer_RX_Eth; // буфер RX_Eth //unsigned int xEth; // xEth - счёт //unsigned int x1Eth; // x1Eth - счёт //unsigned int x2Eth; // x2Eth - счёт /////////////////////////////////////////////// RX: поиск синхро: "11" st_bayt_RX_Eth = 0; // сброс счётчик байт RX_Eth sdvig_RX_Eth = 0; // сброс sdvig_RX_Eth flag_RX_Eth = 0; // сброс флаг RX_Eth //////////////////////////// for (xEth=4; xEth<8; xEth++) { // счётчик байт -смещение =4 mask_RX_Eth = 0b10000000; // сброс маска RX_Eth ////////////////////////// for (x1Eth=1; x1Eth<9; x1Eth++) { // счётчик сдвиг =8 if (TX_int[xEth] & mask_RX_Eth) { flag_RX_Eth++; } else { flag_RX_Eth = 0;}; ///////////////////////// if (flag_RX_Eth > 1) { st_bayt_RX_Eth = xEth; // запись st_bayt_RX_Eth sdvig_RX_Eth = x1Eth; // запись sdvig_RX_Eth x1Eth = 100; // стоп счётчик сдвиг xEth = 100; // стоп счётчик байт }; ////////////////////////// mask_RX_Eth = (mask_RX_Eth >> 1); // маска RX_Eth }; }; /////////////////////////////////////////////// RX: проверка синхро: "11" if (flag_RX_Eth < 2) { TX_int[114] = 0x11; // код ошибки 0x11 TX_int[115] = 0xFF; // код ошибки 0xFF goto TX_W5500; // error синхро: "11" > TX_W5500 //контроль }; /////////////////////////////////////////////// RX: сдвиг массив: << синхро: "11" x1Eth = st_bayt_RX_Eth; x2Eth = st_bayt_RX_Eth; x2Eth += 1; bufer_sdvig_RX_Eth = 8 - sdvig_RX_Eth; // буфер сдвиг RX_Eth ////////////////////////// for (xRX=0; xRX<500; xRX++) { TX_int[xRX] = (TX_int[x1Eth] << sdvig_RX_Eth); bufer_RX_Eth = (TX_int[x2Eth] >> bufer_sdvig_RX_Eth); TX_int[xRX] = TX_int[xRX] | bufer_RX_Eth; x1Eth ++; x2Eth ++; }; /////////////////////////////////////////////// RX: Data reflected: 0x01 > 0x80 for (xRX=0; xRX<500; xRX++) { bufer_bayt_RX_Eth = 0; // сброс буфер байт RX_Eth mask_RX_Eth = 0b00000001; // сброс маска RX_Eth ////////////////////////// for (x1Eth=0; x1Eth<8; x1Eth++) { bufer_bayt_RX_Eth = (bufer_bayt_RX_Eth << 1); if (TX_int[xRX] & mask_RX_Eth) { bufer_bayt_RX_Eth |= 1; }; mask_RX_Eth = (mask_RX_Eth << 1); }; ////////////////////////// TX_int[xRX] = bufer_bayt_RX_Eth; }; */ //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////ARP_Eth: ///////////////////////////////////////////////проверка Type ARP: /* //Type ARP (0x0806): //if (TX_int[13] != 0x06) {goto RX_UDP;}; // > RX_UDP if (TX_int[13] != 0x06) {goto RX_UDP_Eth;}; // > RX_UDP_Eth /////////////////////////////////////////////// проверка Opcode: (запрос) //Opcode: request (1) (запрос) if (TX_int[21] != 0x01) {goto _1;}; // > _1 //if (TX_int[21] != 0x01) {goto TX_W5500;}; // > TX_W5500 //контроль /////////////////////////////////////////////// проверка Target IP address: //Target IP address: 192.168.0.3 if (TX_int[38] != 192) {goto _1;}; // > _1 if (TX_int[39] != 168) {goto _1;}; // > _1 if (TX_int[40] != 0) {goto _1;}; // > _1 if (TX_int[41] != 3) {goto _1;}; // > _1 //if (TX_int[38] != 192) {goto TX_W5500;}; // > TX_W5500 //if (TX_int[39] != 168) {goto TX_W5500;}; // > TX_W5500 //if (TX_int[40] != 0) {goto TX_W5500;}; // > TX_W5500 //if (TX_int[41] != 3) {goto TX_W5500;}; // > TX_W5500 /////////////////////////////////////////////// /////////////////////////////////////////////// RX: crcEth: ARP: =60 UDP_TX_len = 60; //контроль fcrcEth(); /////////////////////////////////////////////// RX: crcEth: (!) // последний байт не работает (!) RXcrcEth &= 0x00FFFFFF; crcEth &= 0x00FFFFFF; //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////// RX: проверка crcEth: if (RXcrcEth == crcEth) { /////////////////////////////////////////////// TX_ARP (ответ): DDRB.5=1; // выход SCK DDRB.3=1; // выход MOSI //ждём готовность SPI... TX_W5500 delay_ms(1); PORTD.6=1; // TX PORTD.7=0; // RX TX_ARP(); // > TX_ARP (ответ) //TX_ARP_router();// > TX_ARP_router (запрос) PORTD.6=0; // TX PORTD.7=0; // RX DDRB.5=0; // вход SCK DDRB.3=0; // вход MOSI /////////////////////////////////////////////// goto _1; // > _1 /////////////////////////////////////////////////////////////RXcrcEth == crcEth //////////////////////////////////////////////////////////////////////////////// } else { /////////////////////////////////////////////////////////////////error_ crcEth: //0...255 - error_key ++ //error_key ++; // 0...255 // int //if (error_key > 255) {error_key = 255;}; //blok_sys: //-начальное 0. //if (error_key > 100) {blok_sys = 1;}; PORTD.6=1; // TX PORTD.7=1; // RX //delay_ms(3000); // error_key > задержка 3 с //PORTD.6=0; // TX //PORTD.7=0; // RX //goto _1; // > _1 /////////////////////////////////////////////// TX_int[114] = 0x02; // код ошибки 0x02 TX_int[115] = 0xFF; // код ошибки 0xFF goto TX_W5500; // > TX_W5500 //контроль }; */ //////////////////////////////////////////////////////////////////////////////// //RX_UDP_Eth: //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////RX_UDP_Eth: /* /////////////////////////////////////////////// проверка Destination MAC: //Destination MAC: (00:08:dc:01:02:03) if (TX_int[0] != 0x00) {goto _1;}; // > _1 if (TX_int[1] != 0x08) {goto _1;}; // > _1 if (TX_int[2] != 0xdc) {goto _1;}; // > _1 if (TX_int[3] != 0x01) {goto _1;}; // > _1 if (TX_int[4] != 0x02) {goto _1;}; // > _1 if (TX_int[5] != 0x03) {goto _1;}; // > _1 /////////////////////////////////////////////// Source MAC > TX_MAC: //TX_MAC[6]={0,0,0,0,0,0}; TX_MAC[0]=TX_int[6]; TX_MAC[1]=TX_int[7]; TX_MAC[2]=TX_int[8]; TX_MAC[3]=TX_int[9]; TX_MAC[4]=TX_int[10]; TX_MAC[5]=TX_int[11]; /////////////////////////////////////////////// проверка Type IP: //Type IP (0x0800): if (TX_int[12] != 0x08) {goto _1;}; // > _1 if (TX_int[13] != 0x00) {goto _1;}; // > _1 /////////////////////////////////////////////// проверка Version: 4, Header length: //Version: 4, Header length: (0x45) //if (TX_int[14] != 0x45) {goto _1;}; // > _1 /////////////////////////////////////////////// проверка Differentiated Services Field: //Services Field: (0x00) //if (TX_int[15] != 0x00) {goto _1;}; // > _1 /////////////////////////////////////////////// проверка Total Length: //Total Length: //if (TX_int[16] != 0x00) {goto _1;}; // > _1 //if (TX_int[17] != 0x00) {goto _1;}; // > _1 /////////////////////////////////////////////// проверка Identification: //Identification: //if (TX_int[18] != 0x00) {goto _1;}; // > _1 //if (TX_int[19] != 0x00) {goto _1;}; // > _1 /////////////////////////////////////////////// проверка Fragment offset: //Fragment offset: Don't fragment: 0 //if (TX_int[20] != 0x00) {goto _1;}; // > _1 //if (TX_int[21] != 0x00) {goto _1;}; // > _1 /////////////////////////////////////////////// проверка Time to live: //Time to live: //if (TX_int[22] == 0x00) {goto _1;}; // > _1 /////////////////////////////////////////////// проверка Protocol UDP: //Protocol UDP (17): if (TX_int[23] != 0x11) {goto _1;}; // > _1 /////////////////////////////////////////////// проверка Header checksum IP: //Header checksum IP: //if (TX_int[24] != 0x00) {goto _1;}; // > _1 //if (TX_int[25] != 0x00) {goto _1;}; // > _1 /////////////////////////////////////////////// Source IP > TX_IP: //TX_IP - 0x00 0x00 0x00 0x00 TX_IP[0]=TX_int[26]; TX_IP[1]=TX_int[27]; TX_IP[2]=TX_int[28]; TX_IP[3]=TX_int[29]; /////////////////////////////////////////////// проверка Destination IP: //Destination IP: 192,168,0,3 if (TX_int[30] != 192) {goto _1;}; // > _1 if (TX_int[31] != 168) {goto _1;}; // > _1 if (TX_int[32] != 0) {goto _1;}; // > _1 if (TX_int[33] != 3) {goto _1;}; // > _1 /////////////////////////////////////////////// Source port > RX_port: // RX_port - 0x00 0x00 RX_port=TX_int[34]; RX_port=(RX_port<<8)|TX_int[35]; /////////////////////////////////////////////// проверка Destination port: //Destination port: 8000 if (TX_int[36] != 0x1F) {goto _1;}; // > _1 if (TX_int[37] != 0x40) {goto _1;}; // > _1 /////////////////////////////////////////////// /////////////////////////////////////////////// Length > RX_len: //(Length = Protocol UDP(8) + Data(18) = 26) //0x00,0x1a, // 38,39- Length: 26 RX_len=TX_int[38]; RX_len=(RX_len<<8)|TX_int[39]; /////////////////////////////////////////////// RX_len: Data(48) //(Length = Protocol UDP(8) + Data(48) = 56) //56 + 34 = 90 RX_len += 34; //RX_len = UDP(42) + Data(48) = 90 /////////////////////////////////////////////// RX_len: //0...41- UDP/ARP //42...89- Data-48 //90...249- Key-160 //250...253- crcEth-4 // RX_len MAX=250 TX_int (0...250) //if (RX_len > 253) {RX_len = 253;}; // проверка MAX =253 /////////////////////////////////////////////// RX_len: //0...41- UDP/ARP //42...89- Data-48 //90...249- Key-160 //250...253- crcEth-4 // RX_len MAX=500 TX_int (0...511) if (RX_len > 500) {RX_len = 500;}; // проверка MAX =500 /////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////// RX: crcEth: RX_UDP_Eth: =90 //UDP_TX_len = 90; //контроль UDP_TX_len = RX_len; //UDP(42) + TX_len(48) fcrcEth(); /////////////////////////////////////////////// RX: crcEth: (!) // последний байт не работает (!) RXcrcEth &= 0x00FFFFFF; crcEth &= 0x00FFFFFF; /////////////////////////////////////////////// RX: проверка crcEth: if (RXcrcEth == crcEth) { goto RX_systema; // > RX_systema /////////////////////////////////////////////// RXcrcEth == crcEth //////////////////////////////////////////////////////////////////////////////// } else { /////////////////////////////////////////////// error_ crcEth: //0...255 - error_key ++ //error_key ++; // 0...255 // int //if (error_key > 255) {error_key = 255;}; //blok_sys: //-начальное 0. //if (error_key > 100) {blok_sys = 1;}; PORTD.6=1; // TX PORTD.7=1; // RX //delay_ms(3000); // error_key > задержка 3 с //PORTD.6=0; // TX //PORTD.7=0; // RX //goto _1; // > _1 /////////////////////////////////////////////// TX_int[114] = 0x03; // код ошибки 0x03 TX_int[115] = 0xFF; // код ошибки 0xFF goto TX_W5500; // > TX_W5500 //контроль }; */ //////////////////////////////////////////////////////////////////////////////// //TX_W5500: //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////контроль: /**/ // TX_int[114] = 0x00; // код ошибки 0x00 // TX_int[115] = 0x00; // код ошибки 0x00 /* ////////////////////////////////////// TX_int[116] =(RX_len>>8); TX_int[117] =RX_len; ////////////////////////////////////// TX_int[118] = RXcrcEth; TX_int[119] = RXcrcEth>>8; TX_int[120] = RXcrcEth>>16; TX_int[121] = RXcrcEth>>24; ////////////////////////////////////// TX_int[122] = crcEth; TX_int[123] = crcEth>>8; TX_int[124] = crcEth>>16; TX_int[125] = crcEth>>24; ////////////////////////////////////// TX_int[126] = st_bayt_RX_Eth; //контроль TX_int[127] = sdvig_RX_Eth; //контроль /////////////////////////////////////////////// /////////////////////////////////////////////// TX_W5500: DDRB.5=1; // выход SCK Eth DDRB.3=1; // выход MOSI Eth //ждём готовность SPI... TX_W5500 delay_ms(1); PORTD.6=1; // TX PORTD.7=0; // RX TX_len = 470; // TX_len // UDP_TX_len = UDP(42) + TX_len(470) = 512 //TX_UDP(); // > TX_UDP() //TX_Eth(); // > TX_Eth() TX_control_Eth();// > TX_control_Eth() //TX_len = 32; // TX_len = 32 //TX_Modem(); // > TX_Modem() PORTD.6=0; // TX PORTD.7=0; // RX DDRB.5=0; // вход SCK Eth DDRB.3=0; // вход MOSI Eth /////////////////////////////////////////////// очистка буфера: for (xRX=0; xRX<512; xRX++) { TX_int[xRX] = 0; }; //////////////////////////////////////////////////////////////////////////////// goto _1; // > _1 */ ////////////////////////////////////////////////////////////////////////////////