Forum: Mikrocontroller und Digitale Elektronik Frequenzmessung über ICP


von Pascal E. (pascalenz)


Angehängte Dateien:

Lesenswert?

Habe mich bereits einmal bei euch im Forum bemerkbar gemacht.

Ich will über den ICP ein 58kHz Rechtecksignal messen.

Den Atmega128 betreibe ich mit 8MHz.
Der Noise-Cancler ist aktiv.

Die Übertragung über RS232 funktioniert soweit.

Das Problem ist, dass egal ob ich ein generiertes 1kHz Signal, oder die 
geforderten 58kHz in den Pin ICP einspeise, das Resultat bleibt sich 
gleich. (klar, es schwankt ab und an).

Die Frequenzauswertung wird über das zugehörige .net Programm 
ausgewertet.

Danke fürs Antworten.

von Gast (Gast)


Lesenswert?

> das Resultat bleibt sich gleich. (klar, es schwankt ab und an).

Was soll man dazu sagen?

von Ohh (Gast)


Lesenswert?

Ich wuerd mal im interrupt einen freien Pin toggeln, um zu sehen, ob der 
capture interrupt auch im richtigen moement kommt.

von Stefan E. (sternst)


Lesenswert?

Pascal Enz wrote:

> Der Noise-Cancler ist aktiv.

Das stimmt schon mal nicht.

von Pascal E. (pascalenz)


Lesenswert?

Habe einen Pin Togglen lassen.

Das ICF wird ordnungsgemäss gesetzt und die Routine abgerufen.
Auch die Overflow-Routine wird ausgelöst (am Oszi gemessen).


Das komische ist, dass das Overflow-Register immer mit dem Wert 192dez. 
ausgegeben wird.
Das Overflow-Register befindet sich auf R21.

Jemand weitere Ideen?

von Ohh (Gast)


Lesenswert?

Ja. Der Overflow hat damit eigentlich gar nichts zu tun. Der kommt 
eigentlich immer bei 256, ref 65536. Der Capture Event liest nur den 
Zaehler aus und wirft den Zaehlerwert in das Captureregister. Wenn man 
sich fuer die Periodelaenge interessiert, sollte man den Zaehler im 
capture interrupt nullen. Nein ?

von Pascal E. (pascalenz)


Lesenswert?

Ich messe die Differenz der zwei ICP Interrupts. Zeit zwei minus Zeit 
eins gibt die Taktdifferenz. Dazu das Overflow-Register mit 65536 
multiplizieren und dazuaddieren.

Also das Rechenprinzip ist mir klar.

Ich habe den Code nun mal so abgeändert, dass ich das Overflow-Register 
auf den Wert 100d fixiere und ihn auch nicht hochzählen lasse.
Trotzdem kommt bei der Übertragung der Wert 178 für R21 heraus.
1
overflow:
2
push temp
3
in temp,SREG
4
push temp
5
6
ldi mpr,100
7
mov overf,mpr
8
9
10
pop temp
11
out sreg,temp
12
pop temp
13
reti
1
polling_meas:
2
3
ldi temp,1
4
cpse finito,temp
5
rjmp polling_meas
6
cli
7
ldi zeichen,'@'
8
rcall serout
9
mov zeichen,time11
10
rcall serout
11
mov zeichen,time12
12
rcall serout
13
mov zeichen,time21
14
rcall serout
15
mov zeichen,time22
16
rcall serout
17
mov zeichen,overf
18
rcall serout
19
ldi finito,0
20
ldi status,0
21
rjmp init

von Johannes M. (johnny-m)


Lesenswert?

> out TCNT1L,temp
> out TCNT1H,temp
Das ist die falsche Reihenfolge! Beim Schreiben muss erst das High-Byte 
ausgegeben werden.

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.