Forum: Mikrocontroller und Digitale Elektronik Prescaler ATMEGA 2560 /1 im Auslieferungszustand ?


von John S. (student)


Lesenswert?

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.

von Flo (Gast)


Lesenswert?

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.

von John S. (student)


Lesenswert?

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
Noch kein Account? Hier anmelden.