Ich glaub' dir ja gerne, aber genau bei dem Fehler würde er so wie beschrieben reagieren. (break ist kein Formalismus, sondern das Kommando: "jump loop-exit", kann also auch bedingt aufgerufen werden)
Also, der Code ist (wirklich) so (abgespeckt) ?:
Gut. Da aber für das Lämpchenleuchten der ganze Switch irrelevant ist, läuft ja eigentlich nur das:Code:void TriggerISR() interrupt 8 { P0_DATA &= 0xf8; switch (counter) { case 0: time1 = P3_DATA; break; case 1: time2 = P3_DATA; break; case 2: time3 = P3_DATA; break; case 3: phase = P3_DATA; break; case 4: switch (P3_DATA) { case 0: usePhase = 0; mainc = 0; break; case 1: usePhase = 1; mainc = 0; break; case 2: usePhase = 0; mainc = 1; break; case 3: usePhase = 1; mainc = 1; break; default: break; } break; default: break; } counter++; P0_DATA = counter; IRCON0 &= 0xfb; //reset IR-Bit of trigger }
d.h mit switch und break hat das Problem, wenn noch vorhanden, nix zu tun.Code:void TriggerISR() interrupt 8 { P0_DATA &= 0xf8; counter++; P0_DATA = counter; IRCON0 &= 0xfb; }
Jetzt kontrollieren wir, ob der Interrupt wirklich nur einmal gerufen wird
dadurch ist das p0-data setzen und counter++ abgesichertCode:static (volatile?) char bB = 0; void TriggerISR() interrupt 8 { if (bB & 1) P0_DATA = 0x07; // alle leuchten--> doppel interrupt else { bB |= 1; P0_DATA &= 0xf8; counter++; P0_DATA = counter; } IRCON0 &= 0xfb; bB &= ~1; }
FÜr weiteren Support wäre eine disassembler-liste hilfreich.
Wie gesagt, das einzige, was ich ausschließe, ist, daß sich der Controller verzählt. Der Fehler liegt im Interrupt oder doch im Code, auch wenn wir's nicht sehen.
wie sind die Daten definiert ?







Zitieren

Lesezeichen