Hallo, ich habe ein Problem mit der Zeitberechnung beim Atmega8. Ich benutze eine Vorlage aus dem Tutorial, die ich auf den Atmega8 angepasst habe. Ich gebe die Sekunden auf einem kleinen 2-Segment-Display aus. Dabei wird jedoch nicht jede Sekunde ein neuer Wert ausgegebensonder etwa alle 2, der Timer läuft also irgendwie zu langsam. Woran kann es liegen? Hier der Quelltext: /* uC:Atmega8*/ #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> //Variablen für die Zeit volatile unsigned int millisekunden; volatile unsigned int sekunde; volatile unsigned int minute; volatile unsigned int stunde; /**********************************************************/ /*******************************************************/ int main(void) { volatile unsigned int lSetup = 0; volatile unsigned int merk; volatile unsigned int temp; merk = 0; temp = 0; DDRC = 0b00001111; /* Output */ DDRD = 0b00000000; /* Input */ PINC = 0b00001111; /* internal Pullups */ // Timer 0 konfigurieren TCCR2 = (1<<WGM21); // CTC Modus TCCR2 = (1<<CS21); // Prescaler 8 // ((1000000/8)/1000) = 125 OCR2 = 125-1; // Compare Interrupt erlauben TIMSK |= (1<<OCIE2); // Global Interrupts aktivieren sei(); while(1) { /* Sekunde ausgeben */ temp = merk % 10; // Einer PORTC = temp; temp = (merk - temp) / 10; // 10 Zehner PORTC = temp + 16; } } /* Der Compare Interrupt Handler wird aufgerufen, wenn TCNT0 = OCR0A = 125-1 ist (125 Schritte), d.h. genau alle 1 ms */ ISR (TIMER2_COMP_vect) { millisekunden++; if(millisekunden == 1000) { sekunde++; millisekunden = 0; if(sekunde == 60) { minute++; sekunde = 0; } if(minute == 60) { stunde++; minute = 0; } if(stunde == 24) { stunde = 0; } } }
Michael Rochel schrieb: > Dabei > wird jedoch nicht jede Sekunde ein neuer Wert ausgegebensonder etwa alle > 2, der Timer läuft also irgendwie zu langsam. Woran kann es liegen? Höchst erstaunlich, dass da überhaupt was sinnvolles ausgegeben wird, wo doch keine der Zeit-Variablen in die Ausgabe mit einfließt. Wir sehen also mal wieder nicht den echten Code, sondern nur irgendwas Verstümmeltes. Nun denn, hier ist dein Problem:
1 | TCCR2 = (1<<WGM21); // CTC Modus |
2 | TCCR2 = (1<<CS21); // Prescaler 8 |
Welchen Inhalt genau hat TCCR2 nach diesen zwei Zeilen wohl?
ja es ist nur ein Teil des Codes, ich wollte nur die wesentlichen Zeilen posten. Der Variablen merk wird natürlich der Wert von Sekunde zugeiesen. Habe meinen Fehler jetzt verstanden, 'TCCR2 |= (1<<CS21);' dürfte es lösen. Vielen Dank
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.