Forum: Mikrocontroller und Digitale Elektronik ISR globale Variable


von Sven (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Cyblord -. (cyblord)


Lesenswert?

> 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

von Peter II (Gast)


Lesenswert?

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.

von Sven (Gast)


Lesenswert?

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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Cyblord -. (cyblord)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

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. ;-)

von Sven (Gast)


Lesenswert?

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.

von Sven (Gast)


Lesenswert?

Würde das genügen wenn ich aus der Konstanten Zahl 65536 eine 65536L 
mache?

von Stefan E. (sternst)


Lesenswert?

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).

von Sven (Gast)


Lesenswert?

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?

von Stefan E. (sternst)


Lesenswert?

Sven schrieb:
> Variable time ununterbrochen den Wert 0 besitzt

Wie stellst du das fest?

von Sven (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.