-
wenn du StartWitch aufrufst, wird die interruptroutine automatisch ausgeführt, wenn ein taster gedrückt ist. da musst du keine if abfrage mehr schreiben.
nach der abarbeitung der interruptroutine wird mit der main funktion weitergemacht, als ob nichts gewesen wäre. deshalb solltest du ihn vielicht in der interruptroutine mit while(1) gefangen halten.
-
also du hast 2 möglichkeiten.
entweder: du benutzt am beginn des programms StartSwitch(). dann brauchst du nur abzufragen ob die variable switched = 1 ist. diese wird dann 1, wenn ein taster gedrückt wurde (und muss von hand auf 0 zurückgesetzt werden).
oder
du änderst in der asuro.c SIGNAL (SIG_INTERRUPT1) um. dann wird das, was hier drin steht, sofort ausgeführt, wenn ein taster gedrückt wurde. (um den originalzustand widerherstellen zu können, empfehle ich den originalen code nur auszukommentieren und nicht zu entfernen). dann brauchst du KEIN switched als variable, und auch KEIN StartSwitch. es wird einfach, sowie ein aster gedrückt wurde, das ausgeführt was in der schleife steht.
wichtig hierbei: mit sei(); werden alle interrupts aktiviert; und mit cli(); werden alle interrupts deaktiviert (für gewisse phasen des programmes in denen eine unterbrechung ungünstig wäre).
Hier ein beispielprogramm:
Code:
#include "asuro.h"
int main(void)
{
Init();
sei();
while(1){
StatusLED(GREEN);
};
return 0;
}
ANPASSUNG DER ASURO.C:
SIGNAL (SIG_INTERRUPT1){
StatusLED(RED);
}
im programm wird die led nur immer wieder auf grün gesetzt. wird eine taste gedrückt, wird durch die interruptroutine die led rot gemacht.
-
Super! Vielen Dank für die Hilfe!
-
OK, habe das gestern mal ausprobiert, dein code damaltor funktioniert nur wenn man vor der while-schleife StartSwitch() aufruft, dann aber einwandfrei:
Code:
#include "asuro.h"
int main(void)
{
Init();
sei();
StartSwitch();
while(1){
StatusLED(GREEN);
};
return 0;
}
ANPASSUNG DER ASURO.C:
SIGNAL (SIG_INTERRUPT1){
StatusLED(RED);
}
vielen dank nochmal!
-
hmm... ich dachte eigentlich das hätte sich hiermit erledigt mit dem startswitch... egal. auf jeden fall ist das evtl ne anregung wie du das problem umgehen kannst welches du am anfang hattest. lass ihn geradeausfahren in der mainfunktion, und interruptgesteuert zurückweichen, wenn er irgendwo anditscht.
-
-
na herzlichen glückwunsch! dann weiter so... pass auf dass deine interruptroutine nicht zu lange dauert (gerade mit sleep ist sehr vorsichtig umzugehen). in dieser zeit kann der asuro nämlich NICHTS anderes machen, als das was in der routine steht. viel spaß =)