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


von David Mika (Gast)


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

von Frank (Gast)


Lesenswert?

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

bye

Frank

von David Mika (Gast)


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

von Michael W. (miwitt001)


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

von Frank (Gast)


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

von Stefan S. (phunky)


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

von mr.chip (Gast)


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.

von Ronny (Gast)


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 ;)

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.