Hallo zusammen, habe eine ziemliche "Newbie"-Frage: Ich programmiere die ATMegas 2560/1 mit der gcc-Lib in C und bin auf ein merkwürdiges Problem gestoßen (Clock extern ist 14.745.600 Hz): Habe bislang mit TIMER0 und TIMER2 gearbeitet und OvFlw - Interrupts ausgewertet. Nun habe ich erkannt, dass ja TIMER2 und nicht TIMER0 auf den externen Uhrenquartz reagiert. Ist mir vorher gar nicht aufgefallen, da ich unter Benutzung von TIMER0 die angezeigten Sekunden nie geeicht hatte und diese nur wenig langsamer liefen als die realen Sekunden ...! Auf die PreScaler habe ich auch nicht richtig geachtet ...einfach nur Trial and Error! (Bin halt Newbie). Dinge gibt's,die gibts gar nicht! Nun aber mein Problem (nachdem ich etwas weiter überlegt habe ...): Habe nun das Register TCCR2B |= (1<<CS22) | (1<<CS20); //Counter/Timer2 Prescaler 128 exakt so belegt ... und siehe da, die Sekunden werden nun wirklich als Sekunden angezeigt (EIN Interrupt pro Sekunde) . Wenn ich nun aber ein wenig rechne, stelle ich fest, dass ja der PreScaler des Prozessors auch noch einen Divisor haben muß - ansonsten kommen ich ja nie auf meine 32768 Hz des Uhrenquarzes: Nach Adam Riese müßte also das CLKPR – Clock Prescale Register die Bit-Belegung für 256 enthalten. (128*256=32768). Es gibt aber keine Stelle in meinem Programm, wo ich CLKPR belegt habe- definitiv! Wo bitte schön, kommt die Belegung CLKPR |= (1 << CLKPS3) (entspricht PreScaler 256) her ??? Ich habe die Mikroprozessoren mit Beispielprogrammen bekommen. Kann es sein, dass diese Einstellungen schon einmal vorgenommen worden sind und permanent erhalten bleiben ? Oder ist der PreScaler defaultmässig auf 256 ab Werk eingestellt ..? Andersherum, wenn man den Chip neu programmiert, werden dann nicht die Default Werte gesetzt (No PreScaler), wenn man hierzu keine Belegung im Programm vorgibt? Definitiv war in den Fuse Bits der PreScaler 8 (CKDIV8) nicht eingeschaltet (nur als Ergänzung)! Oder gibt es irgendwelche Default Einstellungen in der gcc-Lib (programmiere mit AVR Studio) Bin ziemlich ratlos! Wo ist der Wald? Vielen Dank für Eure Mithilfe.
Prescaler für die Clock des Timer0 ist 128, der Quarz 32768 Hz. Das heißt, das dein Timer0 mit 256 Hz zählt, also ungefähr alle 4 ms ein Wert höher. Der Timer0 ist 8 bit breit, also zählt er von 0 bis 255, dann fängt er wieder bei 0 an. Genau dann wird ein Timer Overflow ausgelöst, der dann natürlich immer wieder im 1-Sekundentakt ausgelöst wird.
Flo schrieb: > Prescaler für die Clock des Timer0 ist 128, der Quarz 32768 Hz. > > Das heißt, das dein Timer0 mit 256 Hz zählt, also ungefähr alle 4 ms ein > Wert höher. > Der Timer0 ist 8 bit breit, also zählt er von 0 bis 255, dann fängt er > wieder bei 0 an. Genau dann wird ein Timer Overflow ausgelöst, der dann > natürlich immer wieder im 1-Sekundentakt ausgelöst wird. Upps - danke! Das habe ich ja natürlich garnicht beachtet. Der Overflow passiert ja erst ab 255 ...! Jau! Alles klar - 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.