#include // (8 МГц) #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; //////////////////////////////////////////////////////////////////////////////// // W5500: // 3,3 V - 80 mA. - 10 МБит/c // 3,3 V - 135 mA. - 100 МБит/c // Socket_0 - MACRAW //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// счёт: unsigned char x; // x - счёт //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// SPI: unsigned char tx; // tx - SPI unsigned char rx; // rx - SPI ////////////////////////////////// SPI: void SPI(void) { SPDR=tx; while(!(SPSR & (1<<7))); rx=SPDR; } //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// буфер: /////////////////////////////////////////////// TX_int unsigned char TX_int[32]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //042,069//2A,45 //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// TX_Modem: unsigned char TX_Modem_Mask; // маска unsigned char TX_Modem_st; // счёт байт /////////////////////////////////////////////// void TX_Modem_0(void) { PORTC.0= 1; // Преамбула... Ждём пока RX проснётся... delay_us(10); /////////////////////////////////////////////// for (TX_Modem_st=0; TX_Modem_st<32; TX_Modem_st++) { /////////////////////////////////////////////// TX Data: TX_Modem_Mask=0b00000001; do { // "1"= 12мкс (80...85 тиков) , "0"= 8мкс (45...50 тиков), 1<>0 (64 тиков). // 100 кГц PORTC.0= ~PORTC.0; // TX_int - 32 > TX_Modem delay_us(5); if (TX_int[TX_Modem_st] & TX_Modem_Mask) { delay_us(4); }; TX_Modem_Mask=(TX_Modem_Mask<<1); } while (TX_Modem_Mask); /////////////////////////////////////////////// }; PORTC.0= 0; // сброс /////////////////////////////////////////////// очистка буфера TX_int: //for (x=0; x<32; x++) { // TX_int[x] = 0; //}; //////////////////////////////////////////////// } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void TX_Modem_1(void) { PORTC.1= 1; // Преамбула... Ждём пока RX проснётся... delay_us(10); /////////////////////////////////////////////// for (TX_Modem_st=0; TX_Modem_st<32; TX_Modem_st++) { /////////////////////////////////////////////// TX Data: TX_Modem_Mask=0b00000001; do { // "1"= 12мкс (80...85 тиков) , "0"= 8мкс (45...50 тиков), 1<>0 (64 тиков). // 100 кГц PORTC.1= ~PORTC.1; // TX_int - 32 > TX_Modem delay_us(5); if (TX_int[TX_Modem_st] & TX_Modem_Mask) { delay_us(4); }; TX_Modem_Mask=(TX_Modem_Mask<<1); } while (TX_Modem_Mask); /////////////////////////////////////////////// }; PORTC.1= 0; // сброс /////////////////////////////////////////////// очистка буфера TX_int: //for (x=0; x<32; x++) { // TX_int[x] = 0; //}; //////////////////////////////////////////////// } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void TX_Modem_2(void) { PORTC.2= 1; // Преамбула... Ждём пока RX проснётся... delay_us(10); /////////////////////////////////////////////// for (TX_Modem_st=0; TX_Modem_st<32; TX_Modem_st++) { /////////////////////////////////////////////// TX Data: TX_Modem_Mask=0b00000001; do { // "1"= 12мкс (80...85 тиков) , "0"= 8мкс (45...50 тиков), 1<>0 (64 тиков). // 100 кГц PORTC.2= ~PORTC.2; // TX_int - 32 > TX_Modem delay_us(5); if (TX_int[TX_Modem_st] & TX_Modem_Mask) { delay_us(4); }; TX_Modem_Mask=(TX_Modem_Mask<<1); } while (TX_Modem_Mask); /////////////////////////////////////////////// }; PORTC.2= 0; // сброс /////////////////////////////////////////////// очистка буфера TX_int: //for (x=0; x<32; x++) { // TX_int[x] = 0; //}; //////////////////////////////////////////////// } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void TX_Modem_3(void) { PORTC.3= 1; // Преамбула... Ждём пока RX проснётся... delay_us(10); /////////////////////////////////////////////// for (TX_Modem_st=0; TX_Modem_st<32; TX_Modem_st++) { /////////////////////////////////////////////// TX Data: TX_Modem_Mask=0b00000001; do { // "1"= 12мкс (80...85 тиков) , "0"= 8мкс (45...50 тиков), 1<>0 (64 тиков). // 100 кГц PORTC.3= ~PORTC.3; // TX_int - 32 > TX_Modem delay_us(5); if (TX_int[TX_Modem_st] & TX_Modem_Mask) { delay_us(4); }; TX_Modem_Mask=(TX_Modem_Mask<<1); } while (TX_Modem_Mask); /////////////////////////////////////////////// }; PORTC.3= 0; // сброс /////////////////////////////////////////////// очистка буфера TX_int: //for (x=0; x<32; x++) { // TX_int[x] = 0; //}; //////////////////////////////////////////////// } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void TX_Modem_4(void) { PORTC.4= 1; // Преамбула... Ждём пока RX проснётся... delay_us(10); /////////////////////////////////////////////// for (TX_Modem_st=0; TX_Modem_st<32; TX_Modem_st++) { /////////////////////////////////////////////// TX Data: TX_Modem_Mask=0b00000001; do { // "1"= 12мкс (80...85 тиков) , "0"= 8мкс (45...50 тиков), 1<>0 (64 тиков). // 100 кГц PORTC.4= ~PORTC.4; // TX_int - 32 > TX_Modem delay_us(5); if (TX_int[TX_Modem_st] & TX_Modem_Mask) { delay_us(4); }; TX_Modem_Mask=(TX_Modem_Mask<<1); } while (TX_Modem_Mask); /////////////////////////////////////////////// }; PORTC.4= 0; // сброс /////////////////////////////////////////////// очистка буфера TX_int: //for (x=0; x<32; x++) { // TX_int[x] = 0; //}; //////////////////////////////////////////////// } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// RX_Modem: void RX_Modem_0(void) { /////////////////////////////////////////////// //Читаем данные Modem_RX: PORTB.0=0; // SS RX_Modem delay_us(10); // Ждём пока RX_Modem проснётся... /////////////////////////////////////////////// Modem_RX > TX_int for (x=0; x<32 ; x++) { tx=0x00; SPI(); TX_int[x]=rx; // RX_int - 32 delay_us(2); // Ждём пока RX_Modem подготовит данные... }; /////////////////////////////////////////////// PORTB.0=1; // SS RX_Modem } void RX_Modem_1(void) { /////////////////////////////////////////////// //Читаем данные RX_Modem: PORTB.1=0; // SS RX_Modem delay_us(10); // Ждём пока RX_Modem проснётся... /////////////////////////////////////////////// Modem_RX > TX_int for (x=0; x<32 ; x++) { tx=0x00; SPI(); TX_int[x]=rx; // RX_int - 32 delay_us(2); // Ждём пока RX_Modem подготовит данные... }; /////////////////////////////////////////////// PORTB.1=1; // SS RX_Modem } void RX_Modem_2(void) { /////////////////////////////////////////////// //Читаем данные RX_Modem: PORTB.2=0; // SS RX_Modem delay_us(10); // Ждём пока RX_Modem проснётся... /////////////////////////////////////////////// Modem_RX > TX_int for (x=0; x<32 ; x++) { tx=0x00; SPI(); TX_int[x]=rx; // RX_int - 32 delay_us(2); // Ждём пока RX_Modem подготовит данные... }; /////////////////////////////////////////////// PORTB.2=1; // SS RX_Modem } void RX_Modem_3(void) { /////////////////////////////////////////////// //Читаем данные RX_Modem: PORTB.6=0; // SS RX_Modem delay_us(10); // Ждём пока RX_Modem проснётся... /////////////////////////////////////////////// Modem_RX > TX_int for (x=0; x<32 ; x++) { tx=0x00; SPI(); TX_int[x]=rx; // RX_int - 32 delay_us(2); // Ждём пока RX_Modem подготовит данные... }; /////////////////////////////////////////////// PORTB.6=1; // SS RX_Modem } void RX_Modem_4(void) { /////////////////////////////////////////////// //Читаем данные RX_Modem: PORTB.7=0; // SS RX_Modem delay_us(10); // Ждём пока RX_Modem проснётся... /////////////////////////////////////////////// Modem_RX > TX_int for (x=0; x<32 ; x++) { tx=0x00; SPI(); TX_int[x]=rx; // RX_int - 32 delay_us(2); // Ждём пока RX_Modem подготовит данные... }; /////////////////////////////////////////////// PORTB.7=1; // SS RX_Modem } /* //////////////////////////////////////////////////////////////////////////////// // Pin change 0-7 interrupt service routine (PB0...PB7) interrupt [PCINT0] void pin_change_isr0(void) { } //////////////////////////////////////////////////////////////////////////////// // Pin change 8-14 interrupt service routine (PC0...PC6) interrupt [PCINT1] void pin_change_isr1(void) { } */ /**/ //////////////////////////////////////////////////////////////////////////////// // Pin change 16-23 interrupt service routine (PD0...PD7) interrupt [PCINT2] void pin_change_isr2(void) { } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void main(void) { /////////////////////////////////////////////// SPI (мастер) DDRB.5=1; // выход SCK PORTB.5=0; // выход SCK DDRB.4=0; // вход MISO PORTB.4=0; // вход MISO DDRB.3=1; // выход MOSI PORTB.3=0; // выход MOSI DDRB.2=1; // выход SS PORTB.2=1; // выход SS /////////////////////////////////////////////// SS DDRB.7=1; // выход SS PORTB.7=1; // выход SS DDRB.6=1; // выход SS PORTB.6=1; // выход SS DDRB.1=1; // выход SS PORTB.1=1; // выход SS DDRB.0=1; // выход SS PORTB.0=1; // выход SS /////////////////////////////////////////////// SPI (слейв) //DDRB.5=0; // вход SCK //PORTB.5=0; // вход SCK //DDRB.4=1; // выход MISO //PORTB.4=0; // выход MISO //DDRB.3=0; // вход MOSI //PORTB.3=0; // вход MOSI //DDRB.2=0; // вход SS //PORTB.2=0; // вход SS /////////////////////////////////////////////// TX_Switch DDRC.4=1; // выход TX_Switch PORTC.4=0; // выход TX_Switch DDRC.3=1; // выход TX_Switch PORTC.3=0; // выход TX_Switch DDRC.2=1; // выход TX_Switch PORTC.2=0; // выход TX_Switch DDRC.1=1; // выход TX_Switch PORTC.1=0; // выход TX_Switch DDRC.0=1; // выход TX_Switch PORTC.0=0; // выход TX_Switch /////////////////////////////////////////////// INT_Switch DDRD.4=0; // вход INT_Switch PORTD.4=1; // вход INT_Switch + DDRD.3=0; // вход INT_Switch PORTD.3=1; // вход INT_Switch + DDRD.2=0; // вход INT_Switch PORTD.2=1; // вход INT_Switch + DDRD.1=0; // вход INT_Switch PORTD.1=1; // вход INT_Switch + DDRD.0=0; // вход INT_Switch PORTD.0=1; // вход INT_Switch + /////////////////////////////////////////////// TX_Modem //DDRB.1=1; // выход TX_Modem //PORTB.1=0; // выход TX_Modem //DDRB.7=1; // выход INT TX_Modem //PORTB.7=1; // выход INT TX_Modem /////////////////////////////////////////////// RX_Modem //DDRB.0=1; // выход SS RX_Modem //PORTB.0=1; // выход SS RX_Modem //DDRC.0=0; // вход INT RX_Modem //PORTC.0=1; // вход INT RX_Modem + /////////////////////////////////////////////// GS //DDRC.5=0; // GS //PORTC.5=1; // GS /////////////////////////////////////////////// контроль 2, 3, 4 //DDRD.2=1; // контроль 2 //PORTD.2=0; // контроль 2 //DDRD.3=1; // контроль 3 //PORTD.3=0; // контроль 3 //DDRD.4=1; // контроль 4 //PORTD.4=0; // контроль 4 /////////////////////////////////////////////// контроль //DDRD.5=1; // контроль_error_EEPROM //PORTD.5=0; // контроль_error_EEPROM //DDRD.6=1; // контроль_TX //PORTD.6=0; // контроль_TX //DDRD.7=1; // контроль_RX //PORTD.7=0; // контроль_RX ///////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////// SPI: SPCR=0x50; // 8 МГц/4 = 2 МГц -режим мастер //SPCR=0x40; // 8 МГц/4 = 2 МГц -режим слейв /* //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// RX_Modem (TIM0): // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 8000,000 kHz // Mode: Normal top=FFh // OC0A output: Disconnected // OC0B output: Disconnected // "1"= 12мкс (80...85 тиков) , "0"= 8мкс (45...50 тиков), 1<>0 (64 тиков). // 100 кГц TCCR0A=0x00; TCCR0B=0x00; // выкл Timer 0 //TCCR0B=0x01; // вкл Timer 0 TCNT0=0x00; // сброс счёт Timer 0 OCR0A=0x00; OCR0B=0x00; //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////// timeout RX_Modem (TIM1): // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 8000,000 kHz // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: On // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; //TCCR1B=0x01; // вкл Timer 1 =0,008 //TCCR1B=0x02; // вкл Timer 1 =0,065 //TCCR1B=0x03; // вкл Timer 1 =0,522 TCCR1B=0x00; // выкл Timer 1 TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; /////////////////////////////////////////////// // 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 Switch: // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: Off (PB0...PB7) // Interrupt on any change on pins PCINT8-14: Off (PC0...PC6) // Interrupt on any change on pins PCINT16-23: On (PD0...PD7) EICRA=0x00; EIMSK=0x00; PCICR=0x04; PCMSK2=0b00011111; // (PD0...PD4) PCIFR=0x04; /* // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: On // Interrupt on any change on pins PCINT8-14: On // Interrupt on any change on pins PCINT16-23: On EICRA=0x00; EIMSK=0x00; PCICR=0x07; PCMSK0=0x01; // (PB0...PB7) // PORTB.0 PCMSK1=0x01; // (PC0...PC6) // PORTC.0 PCMSK2=0x01; // (PD0...PD7) // PORTD.0 PCIFR=0x07; */ //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////Global enable interrupts: //#asm("sei") // вкл Global Interrupts //#asm("cli") // выкл Global Interrupts //////////////////////////////////////////////////////////////////////////////// _1: //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////// Interrupts: #asm("sei") // вкл Interrupts //#asm("cli") // выкл Interrupts /////////////////////////////////////////////// очистка буфера TX_int: for (x=0; x<32; x++) { TX_int[x] = 0; }; //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// sleep: //Modem_timeaut_sleep ++; // таймаут sleep //if (Modem_timeaut_sleep > 10) { // Modem_timeaut_sleep = 0; // сброс таймаут sleep //Sleep: //SMCR – Sleep Mode Control Register //0... .... - Reserved //.0.. .... - Reserved //..0. .... - Reserved //...0 .... - Reserved //.... 0... - SM2 - выбора режима сна //.... .1.. - SM1 - выбора режима сна -Режим выключения (Powerdown) //.... ..0. - SM0 - выбора режима сна //.... ...1 - SE - Разрешение перевода в режим сна SMCR=0x05; #asm("sleep") //}; //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// Switch: /////////////////////////////////////////////// Interrupts: //#asm("sei") // вкл Interrupts #asm("cli") // выкл Interrupts /////////////////////////////////////////////// PIND.0 > TX_Modem_1,2,3,4 if (PIND.0 == 0) { RX_Modem_0(); /////////////////////////////////////////////// TX_Modem_1(); //TX_Modem_2(); //TX_Modem_3(); //TX_Modem_4(); /////////////////////////////////////////////// }; /////////////////////////////////////////////// /////////////////////////////////////////////// PIND.1 > TX_Modem_0 if (PIND.1 == 0) { RX_Modem_1(); TX_Modem_0(); }; /////////////////////////////////////////////// /////////////////////////////////////////////// PIND.2 > TX_Modem_0 if (PIND.2 == 0) { RX_Modem_2(); TX_Modem_0(); }; /////////////////////////////////////////////// /////////////////////////////////////////////// PIND.3 > TX_Modem_0 if (PIND.3 == 0) { RX_Modem_3(); TX_Modem_0(); }; /////////////////////////////////////////////// /////////////////////////////////////////////// PIND.4 > TX_Modem_0 if (PIND.4 == 0) { RX_Modem_4(); TX_Modem_0(); }; /////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// goto _1; // > _1 //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// }