// ***** Inludes. #include #include #include #include #include //#include //#include #include typedef uint8_t ui8; typedef int8_t i8; typedef uint16_t ui16; typedef int16_t i16; typedef uint32_t ui32; typedef int32_t i32; typedef unsigned char ucha; typedef unsigned char byte; // ***** Defines. #if !defined (F_CPU) #define F_CPU 7372800 // uC-Takt 7,3728 MHz #endif #define TAKT F_CPU #define FOSC F_CPU #define USART0_BAUD 9600 #define USART1_BAUD 9600 #define MYUBRR0 (FOSC/16/USART0_BAUD-1) #define MYUBRR1 (FOSC/16/USART1_BAUD-1) #if !defined (__AVR_ATmega128__) #error __AVR_ATmega128__ not defined ! #endif #define sleep() asm volatile ("sleep" "\n\t" :: ) // Idle-Mode ermöglichen // +++ Definition: Projekt-Netznamen (korrespondiert mit Schaltplänen) #define EXT_DIG1 PINB4 // Port BB, Eingang #define EXT_DIG2 PINB0 // Port BB, Eingang #define EXT_DIG3 PINE7 // Port EEEEE, Eingang #define EXT_DIG4 PINE6 // Port EEEEE, Eingang #define EXT_DIG5 PINE5 // Port EEEEE, Eingang #define EXT_DIG6 PINE4 // Port EEEEE, Eingang #define EXT_DIG7 PINE3 // Port EEEEE, Eingang #define EXT_DIG8 PINE2 // Port EEEEE, Eingang #define MUX_ANA1 PINF0 // Port FFFFFF, ADC-Betrieb, Eingang #define MUX_ANA2 PINF1 // Port FFFFFF, ADC-Betrieb, Eingang #define MUX_ANA3 PINF2 // Port FFFFFF, ADC-Betrieb, Eingang #define MUX_ANA4 PINF3 // Port FFFFFF, ADC-Betrieb, Eingang #define MUX_ANA5 PINF4 // Port FFFFFF, ADC-Betrieb, Eingang #define MUX_ANA6 PINF5 // Port FFFFFF, ADC-Betrieb, Eingang #define MUX_ANA7 PINF6 // Port FFFFFF, ADC-Betrieb, Eingang #define MUX_ANA8 PINF7 // Port FFFFFF, ADC-Betrieb, Eingang #define MUXSEL PORTA // Port A, Ausgang #define MUXSEL1 PINA4 // Port A, Ausgang #define MUXSEL2 PINA5 // Port A, Ausgang #define MUXSEL3 PINA0 // Port A, Ausgang #define MUXSEL4 PINA1 // Port A, Ausgang #define MUXSEL5 PINA6 // Port A, Ausgang #define MUXSEL6 PINA7 // Port A, Ausgang #define MUXSEL7 PINA2 // Port A, Ausgang #define MUXSEL8 PINA3 // Port A, Ausgang #define LED_BIT(port, bitnummer) (((volatile struct leds *)&port)->b##bitnummer) #define LEDSTAT1 LED_BIT(PORTC, 6) // Port CCC, Ausgang #define LEDSTAT2 LED_BIT(PORTC, 7) // Port CCC, Ausgang #define LEDSTAT3 LED_BIT(PORTG, 2) // Port GGGGGGG, Ausgang #define CH1_RXD PIND2 // Port DDDD, USART1, Eingang #define CH1_TXD PIND3 // Port DDDD, USART1, Ausgang #define CH3_RXD PINE0 // Port EEEEE, USART0, Eingang #define CH3_TXD PINE1 // Port EEEEE, USART0, Ausgang #define ANA_BIT(port, bitnummer) (((volatile struct ananum *)&port)->b##bitnummer) #define ANANUM1 ANA_BIT(PORTB, 6) // Port BB, Eingang #define ANANUM2 ANA_BIT(PORTB, 7) // Port BB, Eingang #define ANANUM3 ANA_BIT(PORTG, 3) // Port GGGGGGG, Eingang #define ANANUM4 ANA_BIT(PORTG, 4) // Port GGGGGGG, Eingang #define on 1 #define off 0 // +++ Definition: USART Buffer #define USART0_R_BUFF_SIZE 64 // 2,4,8,16,32,64,128 or 256 bytes #define USART0_T_BUFF_SIZE 64 // 2,4,8,16,32,64,128 or 256 bytes #define USART0_R_BUFF_MASK (USART0_R_BUFF_SIZE - 1) #define USART0_T_BUFF_MASK (USART0_T_BUFF_SIZE - 1) #if (USART0_R_BUFF_SIZE & USART0_R_BUFF_MASK) #error Empfangspuffer-Größe ist nicht durch 2 teilbar #endif #if (USART0_T_BUFF_SIZE & USART0_T_BUFF_MASK) #error Sendepuffer-Größe ist nicht durch 2 teilbar #endif #define USART1_R_BUFF_SIZE 64 // 2,4,8,16,32,64,128 or 256 bytes #define USART1_T_BUFF_SIZE 64 // 2,4,8,16,32,64,128 or 256 bytes #define USART1_R_BUFF_MASK (USART1_R_BUFF_SIZE - 1) #define USART1_T_BUFF_MASK (USART1_T_BUFF_SIZE - 1) #if (USART1_R_BUFF_SIZE & USART1_R_BUFF_MASK) #error Empfangspuffer-Größe ist nicht durch 2 teilbar #endif #if (USART1_T_BUFF_SIZE & USART1_T_BUFF_MASK) #error Sendepuffer-Größe ist nicht durch 2 teilbar #endif /********************** ***** Prototypen ***** **********************/ void startinit (void); void USART0_Init(unsigned int ubrr); byte USART0_Receive(void); void USART0_Transmit(unsigned char data); void USART1_Init(unsigned int ubrr); byte USART1_Receive(void); void USART1_Transmit(unsigned char data); void do_initblink(unsigned int muster); void USART_ISR_test(void); void ANAAnzahl(void); void LEDOnOff(unsigned int lednummer, unsigned int PulsMS); void AlleLEDOn(void); void AlleLEDOff(void); void check_ANAAnzahl(void); /*********************************************** ***** Globale und statische Deklarationen ***** ***********************************************/ // "0" = NIO; "1" = IO // 0000'000x: 'start' gestartet // 0000'00x0: 'ports' durchlaufen // 0000'0x00: 'adc' durchlaufen // 0000'x000: 'usart0' durchlaufen // 000x'0000: 'usart1' durchlaufen // 00x0'0000: 'blink' durchlaufen // 0x00'0000: frei // x000'0000: frei static struct { byte start : 1; byte ports : 1; byte adc : 1; byte usart0 : 1; byte usart1 : 1; byte blink : 1 ; byte free1 : 1 ; byte free2 : 1 ; } reginit; static struct { unsigned char paketnummer; // --- 1 Byte unsigned dig1 : 1; // - unsigned dig2 : 1; // | unsigned dig3 : 1; // | unsigned dig4 : 1; // |_ 1 Byte unsigned dig5 : 1; // | unsigned dig6 : 1; // | unsigned dig7 : 1; // | unsigned dig8 : 1; // - unsigned ana1 : 10; // - unsigned ana2 : 10; // |_ 5 Bytes unsigned ana3 : 10; // | unsigned ana4 : 10; // - unsigned ana5 : 10; // - unsigned ana6 : 10; // |_ 5 Bytes unsigned ana7 : 10; // | unsigned ana8 : 10; // - unsigned ana9 : 10; // - unsigned ana10 : 10; // |_ 5 Bytes unsigned ana11 : 10; // | unsigned ana12 : 10; // - unsigned ana13 : 10; // - unsigned ana14 : 10; // |_ 5 Bytes unsigned ana15 : 10; // | unsigned ana16 : 10; // - } sensdata1; struct ananum { byte b0 : 1; byte b1 : 1; byte b2 : 1; byte b3 : 1; byte b4 : 1; byte b5 : 1; byte b6 : 1; byte b7 : 1; } __attribute__((_packed_)); struct leds { byte b0 : 1; byte b1 : 1; byte b2 : 1; byte b3 : 1; byte b4 : 1; byte b5 : 1; byte b6 : 1; byte b7 : 1; } __attribute__((_packed_)); static unsigned int anaanzahl; static byte USART0_RxBuf[USART0_R_BUFF_SIZE]; static volatile byte USART0_RxHead; static volatile byte USART0_RxTail; static byte USART0_TxBuf[USART0_T_BUFF_SIZE]; static volatile byte USART0_TxHead; static volatile byte USART0_TxTail; static byte USART1_RxBuf[USART1_R_BUFF_SIZE]; static volatile byte USART1_RxHead; static volatile byte USART1_RxTail; static byte USART1_TxBuf[USART1_T_BUFF_SIZE]; static volatile byte USART1_TxHead; static volatile byte USART1_TxTail; ui8 programmodus = 1; // Variable für den Programmlauf: 0 = normal, 1 = Test, 2 = Test (LED blinken) // ***** Globale Initialisierung des Systems. void startinit (void) { ANANUM1 = 1; ANANUM2 = 1; ANANUM3 = 1; ANANUM4 = 1; // Port Direction Register; 0 = input (i); 1 = output (o) DDRA = 0xff; // I/O: iiiiiiii DDRB = (1<>8); UBRR0L = (byte)ubrr; // USART-Empfänger und -Sender aktivieren UCSR0B = ( ( 1 << RXCIE0 ) | ( 1 << RXEN0 ) | ( 1 << TXEN0 ) ); // Frame-Format setzen: 8 Datenbits, 2 Stopbits UCSR0C = (1<>8); UBRR1L = (byte) ubrr; // USART-Empfänger und -Sender aktivieren UCSR1B = ( ( 1 << RXCIE1 ) | ( 1 << RXEN1 ) | ( 1 << TXEN1 ) ); // Frame-Format setzen: 8 Datenbits, 2 Stopbits UCSR1C = (1< enable UART interrupts while(1) { USART0_Transmit(USART0_Receive()); // Echo the received character USART1_Transmit(USART1_Receive()); // Echo the received character wdt_reset(); } } /************************************** ***** Interrupt Service Routinen ***** **************************************/ ISR(ADC_vect) // ADC Conversion Complete { // ... ; }