/* * Greifer_Kredit_Atmega8.c * * Created: 03.03.23 23:33:41 * Author: Thomas */ #include #include //AVR Interrupt Vektoren #include #include #include // ************************************************************************************************ // Globale Variablen // sind auch in allen Unterroutinen verwendbar. // ************************************************************************************************ volatile unsigned char blinkmerker = 0; //Globale Variable Blinktakt volatile unsigned int counter =0; volatile char array[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x02}; //********************************* void display_ansteuern(void) { // Wenn "blinkmerker" =1 dann wird der PortB1 gesetzt, ansonsten wird er zurückgesetzt. if (blinkmerker) { //PORTB &=~_BV(6); PORTD |= _BV(6); PORTD &=~_BV(7); PORTB = array[(counter % 10)]; // Einerstelle von 'counter' ausgeben } else { if (counter>4) { //PORTB |= _BV(6); PORTD &=~_BV(6); PORTD |= _BV(7); // Toggle 10er-Stelle PORTB = array[((counter - (counter % 10))/10)]; // Zehnerstelle von 'counter' ausgeben } } } // ******************************************************************* // Timerinterrupt 1 // // Zeit für den Aufruf dieser Routine: // Zeit = 1 / (1.000.000/(1024*488) = 0,499sec // ******************************************************************* ISR (TIMER1_OVF_vect) // signal handler for tcnt1 overflow interrupt { //erste Möglichkeit einen Portpin zu toggeln: //if ( PINB & (1<<0) ) PORTB &=~_BV(0) ; // else PORTB |= _BV(0) ; // Direkte Programmierung der Aktion in der Interruptroutine // nur bei sehr kurzen Programmteilen sinnvoll, // da generell die Abarbeitung von Interrupts möglichst kurz sein sollte. //zweite Möglichkeit einen Portpin zu toggeln: if(blinkmerker) blinkmerker=0; else blinkmerker=1; // Die Auswertung von "blinkmerker" wird im Hauptprogramm vorgenommen TCNT1 = 65536-15; // Die 488 werden von 65536 abgezogen, // da der Timerroutine bei einem Überlauf aufgerufen wird display_ansteuern(); } // ************************************************************************************************ // Initialisierung // ************************************************************************************************ void initial(void) { // **** Einrichten von Timer 1 *************** TCCR1B = (1<0) { counter =counter -1; _delay_ms(200); while ( !(PINC & (1<