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
> 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.
> 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?
Nicht wirklich. Das funktioniert so, wie du dir das vorstellst. Ich fürchte das ist irgendwas anderes in deinem Pgm faul.
"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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.