Forum: Mikrocontroller und Digitale Elektronik ATMEGA88 Timer 1 OCR1A-Interrupt


von Manfred Schön (Gast)


Lesenswert?

Hallöchen

Bei meinem ersten AVR-Projekt großteils in Assembler bin ich mir noch zu 
unsicher ob ich alles richtig mache.
Daher wäre es toll wenn sich jemand finden konnte der mal ein Auge auf 
den Code werfen könnte.

Ich verwendet Timer 1 in dreifacher Weise.

1. Als Zeitmessung
2. Als Zeitüberlaufüberwachung
3. Als Zeitverzögerung

Zum Start der Zeitmessung starte in den Timer und setze die 
OCR1A-Register auf den Zählerwert der maximalen Zeit ( Zeilen 1 - 6 )
Wird die Zeit überschritten ( der Zäherstand von Timer1 erreicht den 
Wert von OCR1A so wird der Interrupt aufgrufen - die 
Zeitüberlaufüberwachung wir behandelt)
Erfolgt keine Zeitüberschreitung bis der Programmablauf die Zeile 111 
erreicht, so wird der Zählerwert ausgelesen ( Zeitmessung ) , der Timer 
gestoppt, der Zählerwert ins OCR1A-register gschrieben, der Timer auf 
Null gesetzt und wieder gestartet.
Wenn nun der Zählerstand von Timer1 den Wert von OCR1A erreicht so wird 
wieder der Interrupt aufgerufen und darin die gewünschte Aktion 
ausgeführt ( Zeitverzögerung )

Das ganz funktioniert soweit ganz gut. Bin aber nicht sicher ob ich 
alles ganz richtig programmiert habe.

Wäre daher toll wenn sich jemand finden würde, der den Code 
kontrollieren könnte.  VIELEN DANK.
==============================================================

1   Tccr1a = &H00
2   Tccr1b = &H0E                                            ' Takt 
extern
3   Tccr1c = &H00
4
5   Ocr1ah = &HF0
6   Ocr1al = &H00

7      ldi r24,0
8      Out Tcnt1h , R24                                      ' Zähler 
rücksetzen
9      Out Tcnt1l , R24

10  On Oc1a Oc1a_int Nosave

11  Enable Interrupts
12 Enable Oc1a

~~~~
~~~~
restlicher Code
~~~~
~~~~


111      in R19ctradc1l,TCNT1L
112      in R20ctradc1h,TCNT1H

113      ldi r24,&H08
114      sts TCCR1B,r24                                        ' Timer 1 
stoppen

115      sts OCR1AH, R20ctradc1h                               ' 
Zählergrenzwert auf Triggerverzögerung setzen
116      sts OCR1AL, R19ctradc1l

117      ldi r24,0
118      Out Tcnt1h , R24                                      ' Zähler 
rücksetzen
119      Out Tcnt1l , R24
120      ldi r24,&H0E

121      sts TCCR1B,r24                                        ' Timer 1 
starten

===================================================================

mfg
Manfred Schön

von Manfred Schön (Gast)


Lesenswert?

Hallöchen

Wollt es nur wieder nach vorne bringen - sonst liest es ja keiner mehr 
;-)

hmg
Mandi

von Manfred Schön (Gast)


Lesenswert?

Hallöchen

In dem Forum ist soviel los.
Hat keiner erbarmen mit mir ?

hmg
Mandi

von Johannes M. (johnny-m)


Lesenswert?

Wenn es "ganz gut" funktioniert, warum suchst Du dann krampfhaft nach 
Fehlern? Abgesehen davon: Was soll das in den ersten Zeilen sein? Etwa 
BASCOM?

von Manfred Schön (Gast)


Lesenswert?

Hallöchen

Da BASCOM leider den ATMEGA88 nicht richtig unterstützt musste ich 
einiges in Inline-Assembler machen.

Auch wenn was funktionert kann man es besser machen und noch was lernen.

Hab' erst heute wo gelesen: Erfahrung ist nichts wenn man es 30 Jahre 
lang falsch gemacht hat !!

hmg
Mandi

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.