PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie berechne ich die Timerzeit (Prescale,...)???



drivepro82
01.09.2008, 12:01
Hallo
Habe ein Testprogramm, in dem ein Timer jede Sekunde einen Befehl ausführt. Leider verstehe ich nicht, wie sich die Zeit dieser Sekunde berechnet. Der Prescale-Befehl teil soweit ich das verstanden habe den Systemclock durch die entsprechende Zahl, hier 256. Der Systemclock ist denke ich die Quarzfrequenz, also 16MHz. 16Mhz/256= 62500.
Wie komme ich mit der timervorgabe von 3036 auf die eine Sekunde, bis zum erreichen des Timers?? Kann mir jemand die berechnung erklären?

So sehen Teile des Programms aus:

Config Timer1 = Timer , Prescale = 256
Const Timervorgabe = 3036

Der Timer wird dann folgendermaßen aufgerufen:

On Timer1 Timer_irq
Enable Timer1
.
.
.
Timer_irq:
Timer1 = Timervorgabe
Impulseprosekunde = Zaehlerirq0
Zaehlerirq0 = 0
Return

Danke für die Hilfe!

uwegw
01.09.2008, 12:36
Der Timer hat am Eingang den Quarztakt von 16MHz. Dieser wird mit dem Prescaler (Vorteiler) nochmals verringert (nur bei jedem 256sten Takt zählt der Timer weiter). Das hast du ja schon selbst herausgefunden.
Bei Prescaler 256 wird dein Timer also mit 16 000 000 Hz/ 256 = 62500 Hz getaktet.

Ein 16bit-Timer kann von 0 bis 65535 zählen, also 65536 Schritte. Daher läuft er bei 62500Hz Eingangstakt 62500/65535 = 0,95367mal pro Sekunde über, was einer Periode von 1,0485Hz entspricht. So viel willst du aber nicht haben. Also musst du in der ISR den Timer mit einem Wert vorladen, damit er nicht bei 0 beginnt, sondern bei einem größeren Wert.
Du willst 1Hz erreichen. Dafür muss der Timer quasi den Takt durch 62500/1= 62500 teilen, also schon alle 65200 Takte einen Interrupt auslösen. Damit er dies macht, wird er mit 65536-62500= 3036 vorgeladen. Dann zählt er immer von 3036 bis 65535 durch, und zwar in genau einer Sekunde.

PicNick
01.09.2008, 14:04
Ich hab mir da mal ein Excel-Sheet für die Berechnung gemacht, vielleicht hilft dir das was zum Verständnis.

MHZ, Zielfrequenz und Timer-Type füllt man aus, dann gibt rechts keine, eine oder mehrere Lösungen

Beispiel 16 MHZ Quarz, 1000 Hz sollen es werden (1 mS) Zähler 256 (=8Bit)

-tomas-
01.09.2008, 15:28
Ich empfehle den Modus "Clear Timer on Compare (CTC)".
Es entfällt das Nachladen und die Ungenauigkeit aus der PUSH Orgie von Bascom, wenn es eine ISR betritt.
BASCOM unterstützt das leider nur mäßig, einfach die Register von Hand setzen.

Wenn es genau 1 Sekunde sein soll und 8Mhz Taktfrequenz reichen, empfehle ich den async-Modus mit ext. 32khz-Quarz von Timer2.

Config Timer2 = Timer , ASYNC = 1 , Prescale = 128