www.mikrocontroller.net

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


Autor: Sven B. (svenba)
Datum:

Bewertung
0 lesenswert
nicht 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??
.org OC1Aaddr  ; Timer/Counter1 Compare Match A
jmp Timer1blabla
...
...

;TCCR1A
;COM1 A/B 0/1 Output Pins: 00 -> aus!
;WGM1 0/1 00-> CTC mit WGM1 2/3 richtig gesetzt in TCCR1B

    ldi    temp1, (0<<COM1A1)|(0<<COM1A0)|(0<<COM1B1)|(0<<COM1B0)|(0<<FOC1A)|(0<<FOC1B)|(0<<WGM11)|(0<<WGM10)
    sts    TCCR1A, temp1

; TCCR1B : 
; CS10-12 Clock Select 000 : Teiler 1 
;WGM1 2/3 10 -> CTC mit OCR1A
    ldi    temp1, (0<<ICNC1)|(0<<ICES1)|(0<<5)|(0<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(0<<CS10)  
    sts    TCCR1B, temp1

; OCR1A High und Low : Vergleichwert
; Default : 000A  ; ERST HIGH, dann LOW beschreiben !!!
  ldi temp1, 0xE8
  sts OCR1AH, temp1
  ldi temp1, 0x03
  sts OCR1AL, temp1


;Timer Interrupt Enable 
; OCIE1A Output Compare Interrupt Enable
    lds    temp1, TIMSK1
    sbr    temp1, 1<<OCIE1A
    sts    TIMSK1, temp1

main:
      blabla
      rjmp main

Timer1blabla:
"push sreg"
...
"pop sreg"
reti

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: Sven B. (svenba)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.