Forum: Mikrocontroller und Digitale Elektronik Möglichkeiten in einer IR-Routine


von Stephan Schwarz (Gast)


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?

von OldBug (Gast)


Lesenswert?

Code?

Gruß,
Patrick...

von Maestro (Gast)


Lesenswert?

Ist möglich, Du hast bestimmt nur vergessen, falls Du in C
programmierst, sie als volatile zu deklarieren.

von Thomas Burkhardt (Gast)


Lesenswert?

Hi,

zumindest spricht nichts dagegen. (welcher Controller, System,
Sprache?)


Viele Grüße

von Stephan Schwarz (Gast)


Angehängte Dateien:

Lesenswert?

W98,AT90s2313,C

stimmt schon mit dem Volatile, muss ich malzt damit testen

von OldBug (Gast)


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

von Stephan Schwarz (Gast)


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.

von OldBug (Gast)


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

von Stephan Schwarz (Gast)


Angehängte Dateien:

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.

von OldBug (Gast)


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

von Stephan Schwarz (Gast)


Angehängte Dateien:

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?

von Stephan Schwarz (Gast)


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.

von Peter D. (peda)


Lesenswert?

@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

von Schwarz.Stephan (Gast)


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?

von OldBug (Gast)


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

von Peter D. (peda)


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

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.