/* * Greifer_Kredit_Atmega8.c * * Created: 03.03.23 23:33:41 * Author: Thomas */ #include #include //AVR Interrupt Vektoren #include #include #define F_CPU 1000000 #define F_TIMER 200 #define PERIOD ((F_CPU/F_TIMER)-1) #include // ************************************************************************************************ // Globale Variablen // sind auch in allen Unterroutinen verwendbar. // ************************************************************************************************ volatile uint8_t display[2]; volatile uint8_t flag100ms; char hex2display[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x02}; void update_display(int counter) { display[0] = hex2display[counter%10]; display[1] = hex2display[counter/10]; } // ******************************************************************* // Timerinterrupt 1 // // F_TIMER 200 Hz // ******************************************************************* ISR (TIMER1_COMPA_vect) { static uint8_t cnt; // Zaehler für digit static uint8_t cnt10Hz; PORTD |= (1<<7) | (1<<6); // alle digits ausschalten, low active cnt++; if (cnt > 1) cnt = 0; switch (cnt) { case 0: PORTB = display[0]; // code fuer 1er Stelle PORTD &= ~(1<<7); // digit 1 aktivieren break; case 1: PORTB = display[1]; // code für 12er Stelle PORTD &= ~(1<<6); // digit 2 aktivieren break; } cnt10Hz++; if ( cnt10Hz == (F_TIMER/10) ) { cnt10Hz = 0; flag100ms = 1; } } // ************************************************************************************************ // Initialisierung // ************************************************************************************************ void initial(void) { // **** Einrichten von Timer 1 *************** // **** Einrichten von Ein- und Ausgängen *************** DDRB = 0xff; // PortB Ausgänge DDRD = 0xff; // PortD Ausgänge DDRC = 0x00; // PortC Eingänge Bit 1-7; Ausgang Bit 0 PORTC = (1< 0) counter--; } in_old = in; update_display(counter); } } }