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?
Ist möglich, Du hast bestimmt nur vergessen, falls Du in C programmierst, sie als volatile zu deklarieren.
Hi, zumindest spricht nichts dagegen. (welcher Controller, System, Sprache?) Viele Grüße
W98,AT90s2313,C stimmt schon mit dem Volatile, muss ich malzt damit testen
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...
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.
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...
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.
>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...
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?
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.
@Stephan, das ist mir schon bei Holger aufgefallen. Womit erzeugt und liest man denn solche Super-Breitwand-Programme ? Ich werd ja fast verrückt beim hin- und herscrollen. Peter
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?
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...
"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
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.