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:
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?
> ;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.
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'.
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.
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.
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.
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?
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.
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
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.