Forum: Mikrocontroller und Digitale Elektronik ICR1 immer 0?


von Jonathan K. (burgerohnealles)


Lesenswert?

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

von Max D. (max_d)


Lesenswert?

Poste deinen Code

von Jonathan K. (burgerohnealles)


Lesenswert?

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
von Max D. (max_d)


Lesenswert?

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.

von Jonathan K. (burgerohnealles)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

> ldi tmp, (ICNC1) | (1<<ICES1) | (1<<CS11) | (1<<CS10)
Vor dem ICNC1 fehlt '1<<'; auch fehlt zu Beginn ein sbi DDRA,(1<<2).

von Jonathan K. (burgerohnealles)


Lesenswert?

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
Noch kein Account? Hier anmelden.