Hi!
Ich finde überall nur Tuts und Beiträge zum Timer0 oder zum Timer1 bei
anderen ATMs, ich möchte aber den Timer1 mit meinem ATMega644 nutzen.
Hab mich jetzt durch das Datenblatt geforstet und dabei ist folgendes
raus gekommen, bin mir aber immer noch nicht sicher.
Könnte bitte jemand mal drüber schauen, ob ich alles richtig verstanden
habe?
Ich arbeite mit 20MHz und möchte eine einstellbare ADC Abfrage im Takt
des Timer1 erreichen.(Also keine Ausgang steuern).
Das möchte ich durch unterschiedliche Werte in OCR1A einstellen.
Wenn ich nun zB einen Rythmus von 50us erreichen möchte, "rechne" ich
folgendermassen:
20MHz ergibt eine Taktfrequenz von 0,05us.
Ich nehme keinen Teiler, um eine schöne Ganzzahl pro Timertakt zu
bekommen.
Somit muss ich 1000 (0x03E8) Takte warten, um 50us zu erreichen.
Diesen Wert schreibe ich in OCR1A und lasse den Timer im CTC Modus
laufen.
Also würde die Initialisierung so aussehen, oder fehlt mir noch ein
Register oder irgendwas??
1
.org OC1Aaddr ; Timer/Counter1 Compare Match A
2
jmp Timer1blabla
3
...
4
...
5
6
;TCCR1A
7
;COM1 A/B 0/1 Output Pins: 00 -> aus!
8
;WGM1 0/1 00-> CTC mit WGM1 2/3 richtig gesetzt in TCCR1B
Ein kleiner Fehler: der Endwert ist nicht 1000, sondern 999. Denn der
Zähler fängt ja bei 0 an.
Lass die nicht gesetzten Bits (also (0<<COM1A1) usw.) lieber weg. Da
könnte es sein, dass das falsch übersetzt wird. Zumindestens hat es bei
mir schon mal zu Problemen im Simulator geführt, die Bits wurden falsch
gesetzt (habe die Sache aber noch nicht weiter verfolgt).
Zumal man sich diese Schreibweise sowieso lieber nicht angewöhnen
sollte, denn wenn man mal in C arbeitet, kommt man schnell mal auf den
gedanken, mit dieser Syntax ein Bit zu löschen 8was ja nicht geht).
Ansonsten sieht das Programm auf den ersten Blick richtig aus. Hab jetzt
aber nicht im Datenblatt die einzelnen Bits kontrolliert. Ich würde es
nun einfach mal testen, und wenns nicht läuft alles noch mal überprüfen.
Hi,
der Code sieht weitgehend vollständig und korrekt aus. Wenn ich mich
recht erinnere, müsstest du für Vorteiler 1 das Bit CS10 setzen, sonst
läuft der Timer nicht.
Ansonsten: Einfach ausprobieren ob's tut ;)
Oh, das ging ja schnell, Danke!
Hab bis Montag meine Hardware leider nicht zur Hand aber werd´s dann
sofort ausprobieren.
Hast Recht, hab um eine Stelle vertan, CS10 muss gesetzt werden.
Und zu den ?????? :
??? :-)
Werds gleich löschen, keine Ahnung, wo das herkommt.
Könnte ich jetzt in meinem Hauptprogramm "einfach nur" mein OCR1AH/L
ändern oder muss ich jedes Mal jedes Register neu schreiben?
Hi
>Könnte ich jetzt in meinem Hauptprogramm "einfach nur" mein OCR1AH/L>ändern oder muss ich jedes Mal jedes Register neu schreiben?
OCR1AH/L reicht.
MfG Spess
Eine eigene Frage?
Dieser Thread ist über 16 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.