Guten Morgen,
danke für die schnelle Antwort! Bin gestern nur nicht mehr dazu gekommen noch weiter zu basteln.
Hier also meine Erkenntnisse von heute:
Ich habe die ganzen if-else-Abfragen auskommentiert, das IR-Bit erst am Ende der ISR rückgesetzt und den Counter an P0 ausgegeben. Und jetzt wirds richtig mysteriös:
Wenn ich eine Kombination übergebe, die VORHER im if-else des 1. Bytes abgefangen wurde geht alles gut, er zählt ganz normal bis 5 hoch und ich bin glücklich.
Wenn ich eine Kombination übergebe, die nicht im if-else des 1. Bytes enthalten war (s. Anfangsthread), dann zählt er 1 - 2 und sofort 3 - 4 - 5 - 6!
Ich habe also ein Oszilloskop drangehängt und mir mal angeschaut, was auf der Interruptleitung passiert. Fazit: Egal, was ich für Werte übergebe, es schaut immer gleich aus (okay, mit gewissen Toleranzen, die von der 'Echtzeitfähigkeit' von Windows kommen)! Sprich, es wird definitiv nur ein Interrupt ausgelöst!!!
Hab auch bei beiden switches einen default: break eingefügt, hat auch nix gebracht.
Hast du vielleicht noch Ideen??? Hast ja geschrieben fürs erste
Im folgenden nochmal mein Code (in der neuen Fassung):
Code:void TriggerISR() interrupt 8 { P0_DATA &= 0xf8; switch (counter) { case 0: time1 = P3_DATA; //get LSB of time break; case 1: time2 = P3_DATA; //get 2nd byte of time break; case 2: time3 = P3_DATA; //get MSB of time if (time3 == 0) break; case 3: phase = P3_DATA; //get phase information break; case 4: switch (P3_DATA) { case 0: usePhase = 0; //-> phase ignored mainc = 0; //use serial contactors break; case 1: usePhase = 1; //-> phase important mainc = 0; //use serial contactors break; case 2: usePhase = 0; //-> phase ignored mainc = 1; //use main contactor break; case 3: usePhase = 1; //-> phase important mainc = 1; //use main contactor break; default: break; } break; default: break; } counter++; P0_DATA = counter; IRCON0 &= 0xfb; //reset IR-Bit of trigger }







Zitieren

Lesezeichen