Hallo ich habe ein kleines Programmierproblem. Ich soll mit dem Mikrocontroller ATTiny24 eine Frequenz einlesen und ungefähr doppelt so schnell wieder ausgeben. Zum Einlesen benutze ich den 16-Bit Timer mit einer Auflösung von 1us pro DigitalWert und den Input-Capture Interrupt. Zum ausgeben benutze ich den 8 Bit Timer, der jedoch hier vernachlässigt werden kann. Mein Problem ist, dass ich zwar das Eingangssignal mit einer Mittelwertbildung im ICR1 Interrupt berechnen kann, dieses Ergebnis jedoch nicht weitrhin in der main Routine zur verfügung steht. Mein Latein ist dabei am Ende, ich habe 1 Tag ununterbrochen getestet und ich verstehe nicht, warum mein berechnetes Eingangssignal in der Main Routine den Wert 0 besitzt. Ich hoffe ihr könnt mir helfen. Im Anhang der abgespeckte Code (Port- und 8-Bit Timer Initialisierung fehlt), an dem ich verzweifel. Zu erwähnen ist, dass ich mit einem Frequenzgenerator eine Testfrequenz von 50Hz eingestellt habe.
> Mein Problem ist, dass ich zwar das Eingangssignal mit einer > Mittelwertbildung im ICR1 Interrupt berechnen kann, dieses Ergebnis > jedoch nicht weitrhin in der main Routine zur verfügung steht. Stichwort: volatile
mach mal das cli(); und sei() aus den ISR raus, das ist dort falsch. [c] 65535*Overflow [c] wird mit 16bit gerechnet, das kommt nicht sinnvolles raus.
wie darf ich das mit dem stichwort volatile verstehen? Ich benutze es doch für die Variable time... Ok, wenn nichts sinnvolles rauskommt, dann würde trotzdem die Variable time nicht den Wert 0 besitzen oder täusche ich mich da?
Sven schrieb: > Hallo ich habe ein kleines Programmierproblem. Ja, offenbar. In Headerfiles werden keine Variablen deklariert. Dort werden sie bestenfalls definiert und mit dem Schlüsselwort "extern" bekannt gemacht. Zum 65535*overflow zwei Worte: 1. Ist die Zahl 65535 mit an Sicherheit grenzender Wahrscheinlichkeit falsch und es ist 65536 gemeint 2. Wird diese Rechnung mit 16 Bit gemacht und erzeugt deshalb sicher einen Overflow
Sven schrieb: > wie darf ich das mit dem stichwort volatile verstehen? Ich benutze es > doch für die Variable time... Habe dein Programm nicht angeschaut, aber die von mir zitierte Beschreibung deutete auf ein fehlendes Volatile hin.
Lothar M. schrieb: > Zum 65535*overflow zwei Worte: > 1. Ist die Zahl 65535 mit an Sicherheit grenzender Wahrscheinlichkeit > falsch und es ist 65536 gemeint > 2. Wird diese Rechnung mit 16 Bit gemacht und erzeugt deshalb sicher > einen Overflow Und mit korrigieren von Punkt 1 hätte sich dann auch gleich Punkt 2 erledigt. ;-)
Okay, also kann ich das so verstehen, dass die Main als auch die ISR die Variable time kennen, aber einen unterschiedlichen Speicherbereich für diese Bereit halten? Ja mit dem Overflow bzw. mit meiner Berechnung möchte ich nur die exakte Zeit bestimmen, da ich den 16-Bit Timer im Dauerlauf laufen lasse.
Würde das genügen wenn ich aus der Konstanten Zahl 65536 eine 65536L mache?
Sven schrieb: > Würde das genügen wenn ich aus der Konstanten Zahl 65536 eine 65536L > mache? Mit 65536 könntest du auch auf das L verzichten, denn das ist schon ein long (65535 ist ein unsigned int).
Ok, danke erstmal dafür, jedoch ist mir noch nicht klar, wieso meine Variable time ununterbrochen den Wert 0 besitzt. Zwar habe ich die Variable in der Header Datei definiert, müsste doch nach einer gewissen Zeit den Wert ändern oder täusche ich mich da?
Habe das einmal mit dem Debugger getestet und zudem eine If anweisung eingepflegt die einen Nicht belegten Pin auf High schaltet, sofern der Wert der Variablen time ungleich 0 ist
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.