Möglichkeiten in einer IR-Routine

Gast #86909
Lesenswert?

Hallo

bin ich in während dem Ablauf einer IR Routine auf irgendiwe
eingeschränkt, oder kann ich in der Routine alles so handhaben, wie in
einer Funktion (Unterprogramm). Ich kann zur Zeit nicht auf eine
Globale Variable zugreifen oder sie abändern.
sollte doch möglich sein oder?
Gast #86914
Lesenswert?

Na, der Code kann eigentlich nur Fehler produzieren.
Zwei mal i deklariert, und nicht volatile.
Delays in ISRs sind "unschön", da die Interruptroutinen möglichst
schnell abgearbeitet werden sollen! Und Delays im ms-Bereich sind eh
schon "Ewigkeiten" für nen Mikrocontroller.

Gruß,
Patrick...
Gast #86915
Lesenswert?

OK OK   Es ist Montag und das WE war echt zu kurz zum erholen.

Die ms Delay`s hab ich in der ISR, weil mein Auge nicht so schnell ist
die der µC und ich mit LED sichtbar mache, wo ich mich gerade befinde
im Programmablauf ( ISR oder Main ).
OK es funktioniert jetzt ja auch, wobei Volatile nicht unbedingt
notwendig zusein scheind.
Meine globale Varibale soll eigentlich ein ENUM sein.
Wenn ich ein Enum inkementiere und er am letzten Wert angekommen ist
kann ich ja nicht weiter inkrementieren. Gibtes auch eine anderen Enum
TYP bei dem ich automatisch wieder beim ersten Werte beginne.
Ansonsten muss ich das wohl mit einem Shiftbefehl erledigen.
Gast #86916
Lesenswert?

Variablen, die von mehr als einer Funktion verwendet werden, müssen
volatile deklariert sein! Der Compiler kann zur Compilezeit nicht
feststellen, daß die Variable vielleicht auch in einem anderen Kontext
als dem gerade aktuell zu kompilierenden verwendet wird. Dadurch kann
es zu inkonsistenten Inhalten der gleichen(!) Variable kommen.
Siehe hierzu auch die FAQs der avr-libc.

Gruß,
Patrick...
Gast #86917
Lesenswert?

Das Problem mit der globalen Variablen in der ISR besteht leider immer
noch.
Die Variable ist vom TYP ENUM, mache ich daraus einen INT Wert.
Funktioniert der Zugriff.
Ausserdem kann ich aus der ISR kein Unterprogramm aufrufen. Welches
aber von Main aus aufgerufen einwandfrei Funktioniert.

Hab beides von Main aus mal getestet, da funktioniert das dann auch.
Angehängte Dateien:
Gast #86918
Lesenswert?

>Ausserdem kann ich aus der ISR kein Unterprogramm aufrufen. Welches
>aber von Main aus aufgerufen einwandfrei Funktioniert.
>
>Hab beides von Main aus mal getestet, da funktioniert das dann auch.

Was heist das denn "kann kein Unterprogramm aufrufen"?
Ich vermute, daß Deine ISR einfach nur zu lang wird! Du wartest ja
mindestens 130ms in Deiner ISR. Wie schon mal gesagt: warten in einer
ISR ist alles andere als gut! Einige wenige Zyklen sind da schon noch
ok, aber 130ms um Potenzen zu viel.

Gruß,
Patrick...
Gast #86919
Lesenswert?

HAllo Patrick

schau dir doch bitte mal den angehangenen Code an.
Ich hab aus der ISR nun die Delays rausgenommen. Bei dem einfachen
Progrämmchen kann ich mir aber kaum vorstellen, das das ganze EInfluss
auf den Ablauf hat. In komplexen Programmen ist es natürlich logisch
die ISR`s kurz zuhalten.
In der ISR wird von mir nur ein INT Wert dekrementiert. Wenn ich diesen
Werte sofort in der ISR an einem Port ausgebe funktioniert das
inkrementieren auch. Aber wenn ich die Variable in Main auswerten will
( diesen Teil habe ich im Moment auskommentiert ) kann ich dort keine
Änderung feststellen. Da es sich aber um eine Globale Variable handelt
müsste das doch eigentlich funktionieren. Im Moment macht es mir den
Anschein, als ob die Varibale in der ISR als lokale Abgehandelt wird.
Schöner wäre natürlich eh, die Variable per Call by Referenz zu
übergeben. Funktioniert das eigentlich auch, und wenn wie?
Angehängte Dateien:
Gast #86920
Lesenswert?

Also ich wollte nur mal sagen, es funktioniert nun.
Ehrlich gesagt weiss ich nicht genau warum.
Und eigentlich hab ich auch nicht viel geändert.
d.H.  Natürlich ist es möglich Globale Variablen in einer ISR
abzuändern und in einem anderen BeispielCode hab ich gesehn, das auch
Funktionen von dort aus aufgerufen werden können.
Da die globalen Variablen in einer sauberen Programmierung wohl zu
vermeiden sind frga ich mich im Moment nur, ab ich der ISR den auch
Paramter übergeben kann.
Gast #86922
Lesenswert?

hmmmmm.....   Breitband??????   du meinst 1 Zeile passt nicht komplett
auf den Bildschirm?

Ich schreibe im PN2 aus dem WINAVR Packet.  WIN98.

Bei mir sieht das recht "normal" auf dem Screen aus. Nur beim
Ausdruck passen die langen Zeile ncht so recht.

Aber der Übersichthalber mag ich es nicht, wenn Kommentare über mehrere
Zeilen gehen.

Sorry wegen dem verückt werden, aber ich kann dir da mal ne Gute Tel.
Nummmer von einem netten Mann der gut Zuhören kann geben?
Gast #86923
Lesenswert?

Um Platzsparend und übersichtlich zwischen ISR und anderen Funktionen
(endlos-Schleife aus main) Kommunizieren zu können, verwendet man halt
globale Variablen.
Wenn ich mich da richtig erinnere, dann ist die Anzahl der Befehle in
einer ISR stark begrenz. Vermutlich wird durch den Aufruf von delay_ms
einfach nur eine Horde von NOPs in die ISR kopiert, wodurch dann der
Platz in der ISR verbraucht wird.
ISRs IMMER sxchnell und kurz halten! Egal wie komplex die Anwendung
ist!

Gruß,
Patrick...
#86924
Lesenswert?

"Bei mir sieht das recht "normal" auf dem Screen aus."

Klicke einfach mal direkt im IE auf den Link, dann sieht es nicht mehr
"normal" aus.


Ich vermute mal, der PN2 vergewaltigt den Tabulator.

Vielleicht hat er eine Option, um Tabulatoren immer als Leerzeichen zu
speichern.
Dann sieht es immer gleich aus, egal womit man es sich ansieht.


Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren