Forum: Mikrocontroller und Digitale Elektronik Timer1 (!!) beim ATMega644


von Sven B. (svenba)


Lesenswert?

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
9
10
    ldi    temp1, (0<<COM1A1)|(0<<COM1A0)|(0<<COM1B1)|(0<<COM1B0)|(0<<FOC1A)|(0<<FOC1B)|(0<<WGM11)|(0<<WGM10)
11
    sts    TCCR1A, temp1
12
13
; TCCR1B : 
14
; CS10-12 Clock Select 000 : Teiler 1 
15
;WGM1 2/3 10 -> CTC mit OCR1A
16
    ldi    temp1, (0<<ICNC1)|(0<<ICES1)|(0<<5)|(0<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(0<<CS10)  
17
    sts    TCCR1B, temp1
18
19
; OCR1A High und Low : Vergleichwert
20
; Default : 000A  ; ERST HIGH, dann LOW beschreiben !!!
21
  ldi temp1, 0xE8
22
  sts OCR1AH, temp1
23
  ldi temp1, 0x03
24
  sts OCR1AL, temp1
25
26
27
;Timer Interrupt Enable 
28
; OCIE1A Output Compare Interrupt Enable
29
    lds    temp1, TIMSK1
30
    sbr    temp1, 1<<OCIE1A
31
    sts    TIMSK1, temp1
32
33
main:
34
      blabla
35
      rjmp main
36
37
Timer1blabla:
38
"push sreg"
39
...
40
"pop sreg"
41
reti

von Uwe .. (uwegw)


Lesenswert?

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.

von Philipp B. (philipp_burch)


Lesenswert?

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 ;)

von spess53 (Gast)


Lesenswert?

Hi

>ldi    temp1, (0<<ICNC1)|(0<<ICES1)|(0<<5)|(0<<WGM13)|(1<<WGM12)....
                                       /\
                                     ??????

MfG Spess

von Sven B. (svenba)


Lesenswert?

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?

von spess53 (Gast)


Lesenswert?

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

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.