mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Gleicher Interrupt - unterschiedlicher Code ausführen


Autor: David Mika (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend,

ich steige gerade in die AVR Assembler Programmierung ein.
Nun stehe ich vor einem logischem Problem(?).
Ich benutzer einen Timer(Timer0) im Mega8. Sobald dieser läuft wird ein
Interrupt ausgelöst. Soweit sogut. Das funktioniert auch.

Ich möchte diesen Timer öfters im Programm benutzen, jedoch jedesmal
für einen anderen Zweck und somit soll auch jedesmal ein anderer Code
ausgeführt werden.

Ist dieses irgendwie möglich? Bin noch ein echt blutiger Anfänger ....

 Danke für evtl. Tips und Antworten im Vorraus.

 Viele Grüße

   David

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
setz in der jeweiligen Routine ein Flag und frag Dieses in der ISR ab um
dort den passenden Code auszuführen.

bye

Frank

Autor: David Mika (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Frank,

danke für die super schnelle Antwort.

Du meinst also z.B. einem Register einen Wert zuweisen und dann darauf
prüfen?!

 Viele Grüße

  David

Autor: Michael Wittmann (miwitt001)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Du nimmst einfach eine Variable und weißt der einen bestimmten Wert zu,
an Hand dessen deine Software erkennt was sie im Interrupt machen soll.
Im Interrupt machst du dann eine Abfrage rein, die den Wert in besagter
Variable nimmt und dann die entsprechende Funktion ausführt.


mfg

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Register ist vielleicht nicht so sinnvoll, es sei denn du suchst dir
eins aus welches beim Interrupt nicht geändert wird. Eine Variable oder
gezielt ein Speicherbyte wären da sinnvoller. Musst nur aufpassen dass
deine ISR nicht zu lang wird sonst überholen sich ggf die Interupte.

bye

Frank

Autor: Stefan Seegel (phunky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die aufgerufenen Funktionen immer gleich aufgebaut sind (Parameter
und Ergebnis) würde ich einfach einen Funktionspointer nehmen. Dadurch
spart man sich ewig lange switch/case Orgien und der Code ist kleiner
und schneller.

Stefan

Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Musst nur aufpassen dass
> deine ISR nicht zu lang wird sonst überholen sich ggf die Interupte.

Du kannst ein paar Flags machen, die jeweils anzeigen, wenn ein
bestimmter Interrupt ausgelöst wurde. Nun kannst du das Program den
Rest der Zeit in einer Endlosschleife laufen lassen, wo jeweils geprüft
wird, ob eines der Flags gesetzt ist - wenn ja, wird die jeweilige
Aktion ausgeführt.

Autor: Ronny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Vorschlag mit dem Funktionspointer ist sicherlich am saubersten.Du
definierst dir einen Pointer auf eine Funktion vom Typ:

void MeineIntFunc(void)

Dann kannst du MeinIntFunc() ganz normal aus deinem Interrupt
aufrufen.Soll ein andere Funktion aufgerufen werden,kannst du dem
Pointer einfach die neue Addresse zuweisen.

Nur nicht vergessen den Pointer VOR sei() auf eine Funktion zu setzen
und drauf achten das die Funktionen nicht zuuuu lang werden ;)

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.