Hi zusammen,
ich bin langsam am verzweifeln.. :D ich möchte an einem Attiny 24 die
Dauer eines Signals messen. Jedesmal wenn sich der Pegel am Pin A0
ändert, soll der aktuelle Zählerstand im Timer/Counter 0 ausgelesen
werden und in einer Variable gespeichert werden.
Der Pinchange-Interrupt funktioniert... Der Counter liefert jedoch immer
scheinbar zufällige Werte..
Ich hoffe einer von euch kann mir helfen und ich kann mich dann schön
ärgern, was es für ein dummer Fehler war :D
Dirk L. schrieb:> Der Pinchange-Interrupt funktioniert... Der Counter liefert jedoch immer> scheinbar zufällige Werte..> Ich hoffe einer von euch kann mir helfen und ich kann mich dann schön> ärgern, was es für ein dummer Fehler war :D
LOL.
Was erwartest du von einem 8-bit Zähler und 1-2MHz Zählerfrequenz ?
Also das Programm stoppt die Zeit seit dem letzten Flankenwechsel - ist
das so beabsichtigt? Das ist nicht das, was ich unter
> Dauer eines Signals messen
verstehen würde. Und der Timer0 läuft bei 256 über, aber scheint ja klar
zu sein ("uint8_t").
Bei einer Taktfrequenz von 8 Mhz und einem Prescaler von 8 sollte der
Counter doch eine Zählfrequenz von 1 Mhz haben? Das Signal, das ich
auslesen will hat einen Pegelwechsel alle 100 us. Der Timer sollte doch
dann in 100 us bis zu einem Wert um die 100 gezählt haben?
S. Landolt schrieb:> Also das Programm stoppt die Zeit seit dem letzten Flankenwechsel - ist> das so beabsichtigt? Das ist nicht das, was ich unter>> Dauer eines Signals messen> verstehen würde. Und der Timer0 läuft bei 256 über, aber scheint ja klar> zu sein ("uint8_t").
Vielleicht habe ich mich etwas unklar ausgedrückt.. ich versuche die
Zeit zwischen zwei Flankenwechseln zu messen.
S. Landolt schrieb:> Das heißt, das Signal hat etwa 10 kHz und ungefähr Tastgrad 0.5?
Das Signal hat 5 kHz, Tastgrad 0.5, 100 us low <-> 100 us high,
Periodendauer 200 us.
Dirk L. schrieb:> Das Signal hat 5 kHz, Tastgrad 0.5, 100 us low <-> 100 us high,> Periodendauer 200 us.
Wie stabil ist das Ganze (Rise, Spikes) ?
Dirk L. schrieb:> Der Pinchange-Interrupt funktioniert... Der Counter liefert jedoch immer> scheinbar zufällige Werte..
Woher weisst du das ?
Wird nirgendwo ausgegeben und dass du Portwechsel mit bloßem Auge
beobachten kannst, bezweifle ich...
Osca schrieb:>welches Signal möchte er messen?
Die blau markierten Bereiche im Anhang sollen gemessen werden. Diese
sind, wenn das Signal anliegt, immer 100 us land. Wenn das Signal nicht
anliegt möchte ich das in der if Abfrage feststellen können.
Marc V. schrieb:> Wie stabil ist das Ganze (Rise, Spikes) ?
Das Signal wird von einem anderen uC generiert. Kann davon ausgehen,
dass es sehr stabil ist (mit Oszi gemessen).
> Dirk L. schrieb:>> Der Pinchange-Interrupt funktioniert... Der Counter liefert jedoch immer>> scheinbar zufällige Werte..>> Woher weisst du das ?>> Wird nirgendwo ausgegeben und dass du Portwechsel mit bloßem Auge> beobachten kannst, bezweifle ich...
Habe vorher einen Pin toggeln lassen, wenn der Interrupt ausgelöst
wurde, das hat man auf dem Oszi schön gesehen.
Die Werte des Counters habe ich über den Debugger ausgelesen, das deckt
sich auch mit dem, was ich auf dem Oszi sehen kann.
Tja, ich habe das jetzt mal fliegend aufgebaut, speise ich 5 kHz mit 50
% ein, leuchtet die LED, bei deutlich anderer Frequenz bleibt sie aus.
Jetzt weiß ich nicht weiter.
Dirk L. schrieb:> Habe vorher einen Pin toggeln lassen, wenn der Interrupt ausgelöst> wurde, das hat man auf dem Oszi schön gesehen.
Ja und warum schliesst du den Oszi nicht auch auf PortA.0 und
vergleichst die zwei Signale ?
Marc V. schrieb:> Dirk L. schrieb:>> Habe vorher einen Pin toggeln lassen, wenn der Interrupt ausgelöst>> wurde, das hat man auf dem Oszi schön gesehen.>> Ja und warum schliesst du den Oszi nicht auch auf PortA.0 und> vergleichst die zwei Signale ?
Genau das habe ich ja gemacht. Das Signal vom Attiny lief etwas nach war
aber ansonsten identisch, weshalb ich darauf geschlossen habe, dass der
Pinchange-Interrupt funktionieren muss.
S. Landolt schrieb:> Tja, ich habe das jetzt mal fliegend aufgebaut, speise ich 5 kHz mit 50> % ein, leuchtet die LED, bei deutlich anderer Frequenz bleibt sie aus.> Jetzt weiß ich nicht weiter.
Vielen Dank für deine Mühe! Hast du die LED high- oder low aktiv? Am Pin
sollte ja eine 1 anliegen, wenn der Pegel länger als 120 us oder kürzer
als 80 us war, demnach müsste bei korrektem Signal dann eine 0 anliegen.
S. Landolt schrieb:> Vielleicht läuft es ja mit abgehängtem Debugger?
Da ändert sich leider nichts.. habe es jetzt mit drei verschiedenen
Chips probiert...
S. Landolt schrieb:> Bei mir ist die LED ist zwischen PA1 und Vcc angeschlossen, also das> Verhalten ist korrekt.
Okay.. und du verwendest auch eine ATtiny 24?
Dirk L. schrieb:> TCNT0 = 0x00;
Das Rücksetzen des Zählers am Ende der INT-Routine versaut dir das
Messergebnis. Timer immer durchlaufen lassen.
Wenn du bei einem 10000m-Läufer nach jeder 400m-Runde die Stoppuhr
drückst, dann die Rundenzeit abliest und aufschreibst, dann die Stoppuhr
auf Null stellst und neu startest, dann kommt Murks raus.
S. Landolt schrieb:> Der ATtiny24A läuft tatsächlich mit 8 MHz, nicht mit 1 MHz wie> geliefert?
Ohje es ist wohl echt zu warm... Habe das beim ersten Chip umgestellt,
bei dem scheint tatsächlich der Timer kaputt zu sein. Bei den anderen
beiden habe ich es dann natürlich vergessen.
1000 Dank und sorry für den ganzen Aufwand.
> 1000 Dank und sorry für den ganzen Aufwand.
Keine Ursache, gern geschehen - gegenüber dem, was derzeit im Unterforum
'Webseite' läuft, war das hier geradezu erfrischend.
Übrigens:
> Timer kaputt
habe ich in rund 20 Jahren AVR8 noch nicht gesehen.