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 und möchte noch was lernen.

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