www.mikrocontroller.net

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


Autor: Stephan Schwarz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Code?

Gruß,
Patrick...

Autor: Maestro (Gast)
Datum:

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

Autor: Thomas Burkhardt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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


Viele Grüße

Autor: Stephan Schwarz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
W98,AT90s2313,C

stimmt schon mit dem Volatile, muss ich malzt damit testen

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Stephan Schwarz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Stephan Schwarz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Stephan Schwarz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Stephan Schwarz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Schwarz.Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.