Forum: Mikrocontroller und Digitale Elektronik Ereigniszählung funktioniert nicht


von anfänger0815 (Gast)


Lesenswert?

Hallo Forum, ich mal wieder nur ein Stück Code dabei. Tut mir schon 
leid, daß immer nur ein Stückchen dabei ist, aber das gesammte Programm 
zusammen zu stellen ist ein rießiger Aufwand, da der Code über zig 
Dateien verteilt ist. Ich hoffe es macht auch nur das Teil, daß dabei 
ist.
Ich habe an Pin2 des Atmege 8535 ein Rechtecksignal anstehen PB1 (T1). 
Ich möchte dieses Signal in einem Zeitfenster von 200 mS zählen. Der 
Programmteil "zaehler1_zaehlen" wird alle 200 mS angesprungen. Im 
Programm teil "zaehler1_messen_vor" werden alle Voreinstellungen 
gemacht.
 So jetzt zu meinem Code:
1
zaehler1_messen_vor:
2
  ldi tmp1,0
3
  out TCCR1A,tmp1
4
  sts zaehl_speicher_zaehler,tmp1
5
;Zaehler Reagiert auf steigende Flanke an T1/Pin2
6
   ldi tmp1,0b00000111
7
   out TCCR1B,tmp1
8
;Timer Interupt Mask bei überlauf des Zählers
9
;wird der Überlaufint für T1 angesprungen
10
  in tmp1,TIMSK
11
  ori tmp1, (1<<TOIE1)
12
  out TIMSK,tmp1
13
  ret
14
;--------------------------------------------------------------------------
15
zaehler1_zaehlen:
16
  push xl
17
  push xh
18
  push tmp4
19
  in tmp4,sreg
20
  push tmp4
21
  mov tmp4,r0
22
  push tmp4
23
  mov tmp4,r1
24
  push tmp4
25
  push tmp5
26
  push tmp6
27
  push tmp7
28
  push tmp8
29
  push tmp9
30
  
31
zaehler1_zaehlen_100:
32
;Die aktuellen Zählerständende sofort laden und Int wiedr freigeben
33
;von den gespeicherten subtrahieren
34
  cli
35
  in tmp5,ICR1L
36
  in tmp7,ICR1H
37
  lds tmp9,zaehler1_hoch_tmp_tmp
38
  sei
39
40
;Die Zählerstände der letzten Messung laden und von den aktuellen
41
;Zählerständen subtrahieren
42
  lds tmp4,zaehler1_nieder_tmp
43
  sts zaehler1_nieder_tmp,tmp5
44
  sub tmp5,tmp4
45
46
  lds tmp6,zaehler1_mittel_tmp
47
  sts zaehler1_mittel_tmp,tmp7
48
  sbc tmp7,tmp6
49
50
  lds tmp8,zaehler1_hoch_temp
51
  sts zaehler1_hoch_temp,tmp9
52
  sbc tmp9,tmp8
53
  brcc zaehler1_zaehlen_200
54
;Bei einem negativen Ergebnis, in eine positive
55
;Zahl umwaneln
56
  com tmp5
57
  com tmp7
58
  com tmp9
59
  ldi tmp4,1
60
  add tmp5,tmp4
61
  ldi tmp4,0
62
  adc tmp7,tmp4
63
  adc tmp9,tmp4    
64
65
;Ab hier müßte ein Ergebnis zur Verfügung stehen 
66
  
67
zaehler1_zaehlen_ende:
68
  pop tmp9
69
  pop tmp8
70
  pop tmp7
71
  pop tmp6
72
  pop tmp5
73
  pop tmp4
74
  mov r1,tmp4
75
  pop tmp4
76
  mov r0,tmp4
77
  pop tmp4
78
  out sreg,tmp4
79
  pop tmp4
80
  pop xh
81
  pop xl
82
  ret
83
;-------------------------------------------------------------------------

Ich bekomme mit diesem Prog. keine Zählwerte in die Register
  in tmp5,ICR1L
  in tmp7,ICR1H
Und weiß nicht warum. Das komische ist aber, daß der Überlaufzähler 
anscheinend weiterläuft, also beim Überschreiten den T1 um eins 
weitergezählt wird. Kann mir jemand sagen warum, bzw. was ich 
nichtbeachtet habe?

von Karl H. (kbuchegg)


Lesenswert?

> ;Zaehler Reagiert auf steigende Flanke an T1/Pin2

> Ich bekomme mit diesem Prog. keine Zählwerte in die Register
> in tmp5,ICR1L
> in tmp7,ICR1H

Mir scheint, du hast da irgendwas falsch verstanden.
Den Input Capture kriegst du nur, wenn du am ICP Pin eine Flanke 
hättest.

Deiner Beschreibung nach, willst du hier den Wert von TCNT1L bzw. TCNT1H 
benutzen. Denn so wie ich den Rest interpretiere, lässt du den Timer von 
einem externen Takt takten, nämlich genau von dem zu messenden Signal.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Wieviele Pulse erwartest du eigentlich in diesen 200ms?

Kann es wirklich sein, dass in 200ms ein 16 Bit Zähler einen Überlauf 
erreicht? Immerhin reden wir dann schon davon, dass deine angelegte 
Frequenz größer als 327kHz sein muss. Bei diesen Frequenzen wirds aber 
dann sowieso schon haarig, weil dann schon jeder Taktzyklus im Programm 
zählt um den du den Timer früher oder später ausliest.

Wenn du aber diese Frequenzen nicht erreichst, dann brauchst du dir die 
Arbeit mit Overflow Behandlung und 24 Bit Arithmetik nicht machen. 
Einfach vom Endstand den Anfangsstand abziehen, wobei alle Zählerstände 
unsigned behandelt werden und gut ists. Du brauchst dann auch keine 
Sonderbehandlung für den 'negativ Fall'.

: Bearbeitet durch User
von anfänger0815 (Gast)


Lesenswert?

Das Problem ist, daß ich keine Informationen aus dem Zähler bekomme. 
Immer wenn ich ICR1L ICR1H auslese, lese ich nur Nullen aus. Das ist 
mein Problem, iwi.

von anfänger0815 (Gast)


Lesenswert?

Ich habe da eine Antwort voll übersehen. Ich möchte keinen Input Capture 
ich mnöchte einfach die Impulse am Eingang zählen. Und der Generator der 
an dem Pin angeshlossen ist läuft mit ca. 350 kHz.

von anfänger0815 (Gast)


Lesenswert?

Frage ich mal anders, zu was ist der Eingang T1 am ATmega 8535 da?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

anfänger0815 schrieb:
> Frage ich mal anders, zu was ist der Eingang T1 am ATmega 8535 da?

Wenn du Timer1 in den externen Clock Modus setzt, wird er mit jedem Puls 
an T1 um eins hochgezählt. Das nennt sich 'External Event Counter' im 
Datenblatt. Und zwar (Table 49) bei
CS12-CS10 : 110 bei der fallenden Flanke des Signals an T1 und bei
CS12-CS10 : 111 bei der steigenden Flanke.

von anfänger0815 (Gast)


Lesenswert?

Genau das was ich will. Nur das Problem, wenn ich wie oben beschrieben 
die zwei Register auslese, bekomme ich keiner Werte. Keine Ahnung woran 
das liegen kann. Vielleicht jemand von Euch eine Ahnung was ich falsch 
mache?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Du liest ja auch das ICP Register aus und nicht TCNT1. Also:
0. TCCR1B auf externen Takt setzen.
1. TCNT1 auf 0 setzen.
2. Ereignisse zählen.
3. TCNT1 erhält das Ergebnis.
Das setzt natürlich saubere, aufbereitete Pulse ohne Prellen an T1 
voraus.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

anfänger0815 schrieb:
> Genau das was ich will. Nur das Problem, wenn ich wie oben beschrieben
> die zwei Register auslese,

Ja.
Aber du liest die falschen Register aus.

Die Zählung passiert ganz normal im TCNT Registerpärchen.
Da is nix mit ICP

von anfänger0815 (Gast)


Lesenswert?

Jetzt noch eine, naja, dumme Frage. Kann es sein, daß wenn man den Int 
nicht sperrt vor dem Auslesen, daß dann der Proz keine Daten freigibt?

von anfänger0815 (Gast)


Lesenswert?

Ich ziehe die Frage zurück. Der Prozessor gibt auch seine Daten preis 
wenn der Int ncht gesperrt wird. iwi habe ich ab und an 
Verständigungsprobleme mit dem Assembler. Es funktioniert. Vielen 
herzlichen Dank für eure Hilfe.

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.