Forum: Mikrocontroller und Digitale Elektronik bei Interrupt, eine Zählvariable aus hauptprogramm behalten


von Christian Ries (Gast)


Lesenswert?

Guten Abend,


ich sitze schon länger an einem Problem was eigentlich gar nicht schwer
ist, dachte ich zumindest.

mC: atmega8

Im Hauptprogramm habe ich eine Schleife in der ich den Status des D
Ports ändere. Ich schalte in jedem Schritt einen Pin aus und den Rest
an.
Nun ist es wirklich wichtig, für das Programm und mich, das ich die
LaufID (0-7) behalte wenn ein Interrupt eintritt.
Zur Zeit liefert er mir immer eine 7.

Wird der Programmablauf nicht sofort beendet wenn ein Interrupt
eintrifft?

Ich habe als Idee, einfach in der INT-Routine eine globale Variable mit
der ID beschrieben um diese dann später, bei Bedarf zu verwenden. Aber
wie es scheint wird vor der INT-Routine immer die For-Schleife bis zum
Ende durchlaufen.

Ich hoffe meine Ausführungen waren verständlich.

Ich hoffe auf Hilfe, denn ich weiß nicht weiter.


Mit freundlichen Grüßen
Christian

von Karl H. (kbuchegg)


Lesenswert?

> Ich hoffe meine Ausführungen waren verständlich

Zumindest für mich: Nein

Poste doch mal ein möglichst komplettes, kleines
Program. Dann kennen wir uns mglw. besser aus.

von Christian Ries (Gast)


Lesenswert?

> Zumindest für mich: Nein

Hab ich mir gedacht.

Was kleines, nicht zwingend lauffähig.

1
volatile  int _lauf;
2
3
SIGNAL (SIG_OVERFLOW0)
4
{
5
  pin = _lauf;
6
}
7
// pin ist immer 7!
8
9
main(...) {
10
11
while(1) {
12
13
   // diesen Wert brauch ich!!!
14
   // _lauf
15
   for( _lauf=0; _lauf<7; _lauf++ ) {
16
  PORTD = port_addr[_lauf];
17
  _delay_ms(2);
18
   }
19
20
}
21
22
}


Hilft das?

von Karl H. (kbuchegg)


Lesenswert?

Nicht wirklich.

Das funktioniert so, wie du dir das vorstellst.
Ich fürchte das ist irgendwas anderes in deinem Pgm faul.

von Peter D. (peda)


Lesenswert?

"Was kleines, nicht zwingend lauffähig."

Stimmt, ist ja noch nicht mal compilierbar.


Naja, ist ja Deine Entscheidung, ob Dir jemand helfen können soll.


Peter

von Ronny F. (ronny)


Lesenswert?

Ok,ich bemüh mal meine Kristallkugel....

Wie/wo ist den pin definiert?Meinst du vielleicht PIND?Und hast du den
Timer+Überlauf-Interrupt+globale Interrupts überhaupt aktiviert?

Und,NEIN,das Programm wird beim auftreten eines Interrupts nich sofort
beendet.Es wird für die Dauer des Interrupts unterbrochen,dann gehts
normal weiter.Und wenn alles sauber programmiert ist,bemerkt das
Hauptprogramm davon überhaupt nix,ausser das vielleicht neue Werte in
einigen globalen (volatile!) Variablen stehen.

Nebenbei:

Es sollte auch ohne volatile funktionieren,da du im Interrupt _lauf
nicht veränderst.Ist aber gute Praxis globale Variablen die in
Interrupts genutzt werden so zu deklarieren.

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.