#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 - счёт //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// буфер: /////////////////////////////////////////////// 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(void) { PORTB.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 кГц PORTB.1= ~PORTB.1; // RX_int > 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); /////////////////////////////////////////////// }; PORTB.1= 0; // сброс /////////////////////////////////////////////// очистка буфера TX_int: //for (x=0; x<32; x++) { // TX_int[x] = 0; //}; //////////////////////////////////////////////// } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // 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 /////////////////////////////////////////////// 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_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.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 RX_Modem: // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: On (PB0...PB7) // Interrupt on any change on pins PCINT8-14: Off (PC0...PC6) // Interrupt on any change on pins PCINT16-23: Off (PD0...PD7) EICRA=0x00; EIMSK=0x00; PCICR=0x01; PCMSK0=0x04; // (PB0...PB7) // PORTB.2 // SPI PCIFR=0x01; /* // 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") // вкл Global Interrupts //#asm("cli") // выкл Global 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") //}; //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// TX_Modem: /////////////////////////////////////////////// Interrupts: //#asm("sei") // вкл Global Interrupts #asm("cli") // выкл Global Interrupts /////////////////////////////////////////////// //PORTB.7=1; // установить INT Modem_RX //while (PINB.2==1) {}; // Ждём SS... /////////////////////////////////////////////// SPI и SS: //DDRB.4=1; // вкл. выход MISO x = 0; // сброс счёт буфер RX_int[x] _2: //SPDR=RX_int[x]; // Начальное RX_int[0] > SPDR while( (!(SPSR & (1<<7))) && (PINB.2==0) ); // Ждём окончания передачи SPI или сброс SS... TX_int[x]=SPDR; x++; if (x>31) {x=31;}; // счёт TX_int[x] if (PINB.2==0) {goto _2;}; // проверяем SS > _2: /////////////////////////////////////////////// //DDRB.4=0; // выкл. выход MISO //PORTB.7=0; // сброс INT Modem_RX PORTB.7=0; // выход INT TX_Modem -начало передачи TX_Modem(); // > TX_Modem() PORTB.7=1; // выход INT TX_Modem -конец передачи //////////////////////////////////////////////////////////////////////////////// goto _1; // > _1 //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// }