Hallo zusammen, ich hoffe dass ihr mir helfen könnt atmeg8 mit quarz 3686400Hz prescaler=1024 3686400hz/1024=3600 normalerweise soll das programm mir für 1s gz=3600 aus gz=ueberlauf*56535+tcnt1 ausgeben. dh vor einem ein überlauf sogar.aber ich bekomme 1016. ich bin.... //---------------------------------------------------------------------- -------------------------- #include "i2cUs.h" #include "lcd.h" #include <avr/interrupt.h> #include <avr/delay.h> char ch[20]="\0"; char cl[20]="\0"; volatile unsigned char ueberlauf=0; ISR (TIMER1_OVF_vect) { ueberlauf++; TCNT1 = 0; } int main(void) TCNT1=0; // Timer Daten Register Timer1 High auf 0 Setzen TCCR1B |= (1<<CS12)|(1<<CS10); //Timer Starten mit Vorteiler 1024 _delay_ms(1000);//zum testen der zeit TCCR1B &= ~((1<<CS12)|(1<<CS11)|(1<<CS10));//stop des counters TIMSK |= (1<<TOIE1); sei(); lcdInit(); lcdGoto(1,4) ; itoa(TCNT1,ch,10) itoa(ueberlauf,cl,10); lcdWriteText(ch);//aktuelle Zählerstand lcdGoto(2,4) ; lcdWriteText(cl);//anzahl von überlauf return 0; } vielen dank im voraus.
F_CPU korrekt definiert? Ohne Definition geht er von einem Default von 1MHz aus, damit wartet dann dein _delay_ms() um ca. Faktor 3,6 zu wenig, das würde mit deinem Zählerwert hinkommen. Ausserdem solltest du den Overflow-Interrupt vor dem Delay aktivieren, sonst könnte er auch dann nicht auslösen, wenn es wirklich zu einem Overflow käme ;-) Andreas
_delay_ms(1000);//zum testen der zeit ist SEHR SEHR ungenau steht auch in der delay.h
blubb schrieb: > ist SEHR SEHR ungenau SEHR SEHR genaue aussage... @samir: - lies mal deine compiler-warnings. - der main funktion fehlt die öffnende { - ueberlauf ist ein char, damit 8bit breit und kann nicht größer als 255 werden... - timer-register musst du weder initialisieren, noch zurücksetzen. - deiner formel für die zeit fehlt eine 1. siehe datenblatt.
Und natürlich die übliche Frage: Ist der Quarz über die Fusebits auch aktiviert?
samir schrieb: > atmeg8 mit quarz 3686400Hz prescaler=1024 3686400hz/1024=3600 > normalerweise soll das programm mir für 1s gz=3600 > aus gz=ueberlauf*56535+tcnt1 ausgeben. dh vor einem ein überlauf > sogar.aber ich bekomme 1016. > ich bin.... Wenn man bei einem 8 Bit-Counter/Timer mit ISR auf Überlauf wartet, ist die Rechnung: 3686400hz/1024/256 die isr wird 1x aufgerufen, wenn der Timer überläuft. Im Falle von 8 bit also alle 256 x 3686400/1024stel Hz (im Besten Fall, wenn nicht durch andere Interrupts unterbrochen).
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.