Gast
#763591
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