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.
> das Resultat bleibt sich gleich. (klar, es schwankt ab und an).
Was soll man dazu sagen?
Ich wuerd mal im interrupt einen freien Pin toggeln, um zu sehen, ob der capture interrupt auch im richtigen moement kommt.
Pascal Enz wrote:
> Der Noise-Cancler ist aktiv.
Das stimmt schon mal nicht.
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?
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 ?
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 |
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.