-
-
Erfahrener Benutzer
Roboter Genie
Timer0 nach 1sec Überlauf
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
-
Erfahrener Benutzer
Roboter-Spezialist
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!
-
Erfahrener Benutzer
Robotik Einstein
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/dl...le&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.
-
Erfahrener Benutzer
Roboter-Spezialist
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...
-
Erfahrener Benutzer
Roboter Genie
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?
-
Erfahrener Benutzer
Roboter-Spezialist
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.
-
Erfahrener Benutzer
Roboter Genie
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
-
Erfahrener Benutzer
Robotik Einstein
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.
-
Erfahrener Benutzer
Roboter Genie
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 ^^
-
Erfahrener Benutzer
Robotik Einstein
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.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen