Hi zusammen,
Vielleicht sollte ich hier erwähnen, das ich das mit CodeWarrior im
Simulator programmiere. Auf einem Simulierten Motorola 68HC08
Microcontroller.
Vielleicht liegt es also am COmpiler das er das nicht mitmacht, aber ich
hab auch nicht so viel C-Erfahrung...
Und zwar Versuche ein Lauflicht zu bauen das Interrupt getriggert
startet und anhält. Läuft ganz okay, allerdings... ich poste mal ein
bisscen code ;)
die ISR toggelt ledon.
1 | #pragma TRAP_PROC
|
2 | void ISR_LED (void) {
|
3 |
|
4 | ledon = !ledon; // Toggle LED
|
5 |
|
6 | KBSCR_ACKK = 1; // Keyboard Acknowledge Bit löschen
|
7 |
|
8 | }
|
Aus dem infinite Loop in main() rufe ich immer folgende Funktion auf
1 | static void LightShow (void){
|
2 |
|
3 | for (i = 1; i > 0; i <<=1){
|
4 |
|
5 | // Bevor Lauflicht aktualisiert wird, prüfen ob es überhaupt angeschaltet ist
|
6 |
|
7 | if (ledon > 0) {
|
8 |
|
9 | PTB = i;
|
10 |
|
11 | }
|
12 |
|
13 | Delay();
|
14 |
|
15 | }
|
16 |
|
17 | }
|
So wie klappt das mit dem stoppen und starten, aber das Lauflicht läuft
ja eigentlich weiter, es wird nur nicht aktualisiert.. (weil PTB nicht
neu gesetzt wird).
wenn ich das so schreibe
1 | static void LightShow (void){
|
2 |
|
3 | // Bevor Lauflicht aktualisiert wird, prüfen ob es überhaupt angeschaltet ist
|
4 | if (ledon > 0) {
|
5 |
|
6 | for (i = 1; i > 0; i <<=1){
|
7 |
|
8 | PTB = i;
|
9 |
|
10 | }
|
11 |
|
12 | Delay();
|
13 |
|
14 | }
|
15 |
|
16 | }
|
Dann läuft das Licht natürlich erst einmal Eine Runde zu Ende und
reagiert nicht so fort (je nach Delay() kann das lange sein...).
Was ich jetzt eigentlich vorhatte, aber irgendwie nicht auf die Kette
bekomme ist, folgendes
1 | static void LightShow (void){
|
2 |
|
3 | static unsigned int i;
|
4 |
|
5 | for (i = i; i > 0; i <<=1){
|
6 |
|
7 |
|
8 | // Bevor Lauflicht aktualisiert wird, prüfen ob es überhaupt angeschaltet ist
|
9 |
|
10 | if (ledon > 0) {
|
11 |
|
12 | PTB = i;
|
13 |
|
14 | }
|
15 | else
|
16 | { break; }
|
17 |
|
18 | Delay();
|
19 |
|
20 | }
|
21 |
|
22 | }
|
Ich erhoffte mir damit, das das i den Funktionsaufruf überlebt und die
for-Schleife mit i=i wieder da weitermacht wo sie aufgehört hat.
Aber das scheint nicht zu gehen.
Auch wenn ich
das erste Feld einfach leer lasse, machts die Kiste nicht...
Bin ich der Lösung irgendwie schon nahe, oder muss ich auf die
For-Schleife verzichten und ein anderes Konstrukt wählen um den
Schleifeneinstieg beim wieder starten der des Lauflichts frei definieren
zu können?
Danke für eure Hilfe :-)
vgs