ISR globale Variable

Gast #4947308
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.
Angehängte Dateien:
Gast #4947323
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.
Gast #4947359
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?
Moderator (Firma: Titel) Persönliche Seite #4947372
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
#4947383
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. ;-)
Gast #4947395
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.
Gast #4947415
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?
Gast #4947431
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.