PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer0 nach 1sec Überlauf



Bammel
13.08.2008, 22:16
Hallo,
ich habe gerade damit angefangen µC's zu programmieren. und da ich nun nen bisl rum experimentiere brauche ich den timer0 so das er immer nach ca 1sec überläuft. (müsste nciht exakt sein aber annähernt)
wenn man das noch errechenn kann und nciht tricksen muss wie wäre die rechnung? udn wieviel Hz ist eine sec? kann man das überhaupt so sagen?
@mom habe ich es mit dem timer1 gelöst was ich aber bei meinem weiteren vorhaben nicht nutzen kann da ich damit ne pwm erzeugen möchte.

daten:
ATmega8
mit 3,6864mHz
ist das myAVR USB board.

mfg und danke, Bammel

zerush
13.08.2008, 22:28
3,6864MHz bedeutet 3,6864 Mio. Clocks / s.

Hz = 1/s

Timer0 hat leider kein Compare Register, du musst also Timer2 verwenden.
Wenn du bei Timer2 nun nen Prescaler von 1024 einstellst, hast du am Timer2 noch genau 3,6kHz. Jetzt musst du ins Compare Register (OCR2) nur noch den Wert 3600 schreiben und schon hast du exakt jede Sekunde nen Compare-Match. Allerdings musst du den CTC-Mode beim Timer2 wählen!

Genaueres am besten einfach im Datenblatt vom Mega8 nachlesen!

EDIT: Da merke ich grade, 3600 passt da leider gar nicht rein, weils ein 8Bit Timer ist!

uwegw
13.08.2008, 22:28
Den Timer0 des M8 kann man nicht auf so lange Zeiten einstellen. Lass ihn zb alle 50ms überlaufen und zähle die Überläufe, bis du 20 erreicht hast.

Berechnen lassen sich Timer-Werte zb mit avrcalc:
https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=123
Du müsstest also in der ISR den Timer mit 0x4c vorladen.


In Hz werden Frequenzen angegeben, was einer gewissen Zahl von Ereignissen pro Sekunde entspricht. Du willst einen Takt pro Sekunden, also 1 Hz.

zerush
13.08.2008, 22:36
Wenn du für die PWM keine 16Bit Werte benötigst, kannst du PWM auch mit Timer2 erzeugen. Dann kannst du Timer1 verwenden und so verfahren, wie ich es oben beschrieben habe...

Bammel
13.08.2008, 22:56
ich werde es mal mit der variante probieren udn die überläufe zählen. danke schonmal melde mich dann wenn ichs probiert habe.

edit:
ich steige durhc das avrcalc programm irgendwie nicht durch.
wie könnte ich mir den die 50ms errechnen?

zerush
13.08.2008, 23:43
Also mit nem Prescaler von 1024 hast du 3,6kHz.

Für 50ms brauchst du 1/0,05s = 20 Überläufe pro Sekunde.
3600Hz / 20 = 180. Das ist die Anzahl Ticks, die der Timer zählen muss.
Dementsprechend muss er mit 256-180 = 76 vorgeladen werden.

Bammel
14.08.2008, 17:00
Danke!!! den weg so einzuschlagen hatte ich noch garnciht bedacht also mit dem vorladen.

werde es heute abend mal testen. und geb dann ncohmals bescheid

uwegw
14.08.2008, 17:15
Das ist eigentlich die übliche Methode,Timer0 zu benutzen. Der kann ja recht wenig, aber um alle paar Milisekunden regelmäßige Aktionen wie Taster entprellen auszuführen, reicht das. Und bei 50ms fällt auch die Prozessorbelastung durch die Interrupts nicht so sehr ins Gewicht. Bei schnelleren Sachen wie der PWM ist es dagegen sehr von Vorteil, wenn ein besser ausgestatteter Timer die meisten Sachen nebenbei in Hardware erledigen kann. Darum haben die meisten AVRs auch mehrere Timer mit unterschiedlich vielen Fähigkeiten.

Bammel
14.08.2008, 17:31
okay. danke dir.
mein problem ist eigentlich das ich das ganze mit den hz errechnen und dann den taklt und wielange ne sekunde ist nicht so recht verstanden habe oder nicht peil. obwohl ich in mathe recht gut bin. naja wnen ich es einmal verstanden habe läuft das auch ^^

uwegw
14.08.2008, 18:41
Zur Mathematik:
Der Timer hat am Eingang den Quarztakt von 3,6864MHz. Dieser wird mit dem Prescaler (Vorteiler) nochmals verringert, einstellbar sind beim Timer0 des M8 die Werte 1:1 (direkte Weitergabe), 1:8, 1:64, 1:256 und 1:1024 (nur bei jedem 1024sten Takt zählt der Timer weiter).

Bei Prescaler 1024 wird dein Timer also mit 3686400/1024= 3600 Hz getaktet.

Ein 8bit-Timer kann von 0 bis 255 zählen, also 256 Schritte. Daher läuft er bei 3600 Hz Eingangstakt 3600/256 = 14 mal pro Sekunde über, was einer Periode von 71Hz 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 50ms Periode erreichen, was 20Hz entspricht (1/0,05). Für 20 Hz muss der Timer quasi den Takt durch 3600/20= 180 teilen, also schon alle 180 Takte einen Interrupt auslösen. Damit er dies macht, wird er mit 256-180= 76 vorgeladen. Dann zählt er immer von 76 bis 256 durch, und zwar in genau 50ms.



Zu avrcalc:
In der mittleren Abteilung den Quarztakt einstellen.
Unten erfolgen dann die Timerberechnungen.
Zunächst links den Prescaler* auswählen. Dann im rechten Eingabefeld die gewünschte Zeit (50ms) und daneben die Einheit (mSec) eingeben. Dann "UpDate", und in den grauen Feldern erscheinen die Ergebnisse. Du brauchst hier den Wert "or reload timer every ISR w/" bei "TCNT0=". Da steht dann 0x4c, was dezimal 76 ergibt.

Falls man den richtigen Wert nicht kennt, einfach durchprobieren. Wenn ein Prescaler für die gewünschte Zeit nicht möglich ist, erscheint ??? in der Ausgabe. Und manchmal lässt sich eine Zeit nicht exakt erreichen (zb 51ms). Das kann man ganz links bei "actual timer ISR" sehen, wo der tatsächlich erzeugte Wert gezeigt wird.

Bammel
14.08.2008, 19:52
wieviel hz hat den jetzt ne sekunde? 100?

ich muss mir das alels glaube ich nochmal in ruhe durch den kopf gehen lassen. ^^

aber sehr herzlichen dank. das hat mir shcon sehr geholfen

zerush
14.08.2008, 20:21
1 Hz bedeutet "eins pro Sekunde"
1kHz bedeutet "1000 pro Sekunde"

Bei 100Hz gibt es also 100 Takte pro Sekunde.

Hz ist der Kehrwert zur Zeit und somit kann man nicht sagen "wieviel Hz eine s" hat...

Bammel
14.08.2008, 20:32
Danke Danke Danke!!!

das funktioniert aller erste sahne... sogar viel besser als meine variante mit dem timer1 wobei mir eben aufgefallen ist das ich das da im prinzip genauso geamcht hab nur das es ungefähr jede sec übergelaufen ist.

habs nun aber so geamcht das der alle 0,5 sec den wert ändert. das ist besser...

aber nochmals viele dank.

edit:
@zerush: achso danke... also ist die her imemr eine anzahl an takten pro sekunde!? super das erleichtert mir ja schonmal einiges.
dürfte ich dich über icq mal nen bisl löchern wenn ich aml fragen habe?