Ich benutzt den Timer1 zum Messen der Periodendauer eines Eingangssignals. Dazu habe ich in TCCR1B ICNC1, ICES1 und den Prescaler auf 64, sowie in TIMSK1 ICIE1 gesetzt. Der AVR läuft mit 16MHz. So dauert es bis einem Overflow ca 262ms. Jetzt habe ich hier Testweise ein Signal erzeugt, das 1ms High-Pegel und 8ms Low-Pegel liefert. Das kommt auch, hab ich mit einem LA geprüft. In meinem Programm wird der TIM1_CAPT Interrupt abgefangen und dort ICR1L und ICR1H ausgelesen. Beide sind aber immer 0 .. hier sollte etwas in der Richtung 2250 drin stehen, warum bekomme ich hier aber immer 0? Danke schon mal^^ MfG Jonathan
1 | .include "tn84Adef.inc" |
2 | |
3 | |
4 | .def tmp = r16 |
5 | .def zerol = r8 |
6 | .def zeroh = r9 |
7 | |
8 | |
9 | .org 0x0000 |
10 | rjmp main ; RESET |
11 | reti ; INT0 |
12 | reti ; PCINT0 |
13 | reti ; PCINT1 |
14 | reti ; WDT |
15 | rjmp TIM1_CAPT_vect ; TIM1_CAPT |
16 | reti ; TIM1_COMPA |
17 | reti ; TIM1_COMPB |
18 | reti ; TIM1_OVF |
19 | reti ; TIM0_COMPA |
20 | reti ; TIM0_COMPB |
21 | reti ; TIM0_OVF |
22 | reti ; ANA_COMP |
23 | reti ; ADC |
24 | reti ; EE_RDY |
25 | reti ; USI_STR |
26 | reti ; USI_OVF |
27 | |
28 | |
29 | |
30 | ; setup stack pointer |
31 | main: ldi tmp, high(RAMEND) |
32 | out SPH, tmp |
33 | ldi tmp, low(RAMEND) |
34 | out SPL, tmp |
35 | |
36 | ; setup zero registers |
37 | clr zerol |
38 | clr zeroh |
39 | |
40 | ; setup timer |
41 | ldi tmp, (ICNC1) | (1<<ICES1) | (1<<CS11) | (1<<CS10) |
42 | out TCCR1B, tmp |
43 | |
44 | sbi TIMSK1, ICIE1 |
45 | |
46 | sei |
47 | |
48 | loop: rjmp loop |
49 | |
50 | |
51 | |
52 | |
53 | TIM1_CAPT_vect: |
54 | in r16, ICR1L |
55 | in r17, ICR1H |
56 | |
57 | cp r16, zerol |
58 | cpc r17, zerol |
59 | brne test |
60 | |
61 | in r18, PORTA |
62 | ldi r19, (1<<2) |
63 | eor r18, r19 |
64 | out PORTA, r18 |
65 | |
66 | test: |
67 | |
68 | ; reset TCNT1 |
69 | out TCNT1H, zerol |
70 | out TCNT1L, zerol |
71 | |
72 | ; TODO |
73 | |
74 | ; check: timer ovfl |
75 | sbis TIFR1, TOV1 |
76 | rjmp TIM1_CAPT_end |
77 | |
78 | ; TODO |
79 | sbi TIFR1, TOV1 |
80 | |
81 | TIM1_CAPT_end: |
82 | reti |
Ist ein bisschen blöd eingerückt, da ich eine Tabulatorbreite von 4 benutze ...
:
Bearbeitet durch User
Dir fehlt der Teil der PORTA2 wieder ausschaltet. So reicht es, dass einmal ein Capture bei 0 passiert ist (vlt. gleich beim Init einen gefangen oder so) und die LED leuchtet für immer.
Nein die LED wird immer umgeschaltet. Die 4 Zeilen als C-Code wären:
1 | PORTA ^= (1<<2); |
Und an der LED liegt genau die Hälfte der Eingangsfrequenz an, passt also.
> ldi tmp, (ICNC1) | (1<<ICES1) | (1<<CS11) | (1<<CS10)
Vor dem ICNC1 fehlt '1<<'; auch fehlt zu Beginn ein sbi DDRA,(1<<2).
S. Landolt schrieb: > auch fehlt zu Beginn ein sbi DDRA,(1<<2). Habe unnötigen Code rausgelöscht, das scheint da mit raus gekommen zu sein. S. Landolt schrieb: > Vor dem ICNC1 fehlt '1<<' Ahh genau den selben Fehler hatte ich irgendwann schonmal. Danke das wirds wohl sein, denn ICNC1=7 also wurde hier Clock Select auf External clock source gesetzt, logisch, dass es dann nicht geht ... EDIT: Jop jetzt klappt alles danke :)
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.