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) ?:
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
}
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;
counter++;
P0_DATA = counter;
IRCON0 &= 0xfb;
}
d.h mit switch und break hat das Problem, wenn noch vorhanden, nix zu tun.
Jetzt kontrollieren wir, ob der Interrupt wirklich nur einmal gerufen wird
Code:
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;
}
dadurch ist das p0-data setzen und counter++ abgesichert
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 ?
Lesezeichen