Ha, ich glaub, ich bin dem Problem etwas näher gekommen.
Denn ich hab mittlerweile festgestellt, dass der Wert in dem Register MCUSR nicht zwingend etwas mit den Resetflags zu tun hat, sondern mit dem Momentanen Status meines Controllers. (Ich habe das Programm ähnlich einer Statemachine aufgebaut.)
So, jetzt hat er mir nach einem unbeabsichtigten Reset scheinbar den letzten Status als MCUSR ausgegeben, was immer der Status GET_EPOS_DATA (Also Daten von der Motorsteuerung holen) war. Dieser Status hat den Wert 0x04. Ich hab ihn mal testweise auf 0x09 geändert, und siehe da, nach einem Reset hat er mir den Wert als MCUSR angegeben.
Zur kurzen Info, da ich kein JTAG hab, lass ich mir den Wert von MCUSR an einem Port mit LEDs anzeigen.
Also könnte das Ganze evtl doch das Problem eines Stack Overflows sein, allerdings kann ich mir nicht erlären, woher der kommt:
Ich hab insgesamt 4 ISRs:
Code:
ISR (SIG_UART0_RECV) { // USART0 RX interrupt
UART0_rb_write(UDR0); //fill buffer
BytesRecieved++;
if(ctrState.CurrentState != GET_UART0_DATA && UART0DataAvailable != 1)
{
UART0DataAvailable = 1;
}
}
ISR (SIG_UART1_RECV){ //USART1 RX interrupt
UART1_rb_write(UDR1); //fill buffer
UART1BytesRecieved++;
if(SendDataComplete == 1)
{
UART1BytesRecieved = 0;
SendDataComplete = 0;
}
}
ISR (SIG_OUTPUT_COMPARE1A) {
timers.bTimer1Elapsed = 1;
}
ISR (SIG_OUTPUT_COMPARE3A) {
if(ctrState.CurrentState != FAULT && ctrState.CurrentState != GET_UART0_DATA && ctrState.CurrentState != GET_EPOS_DATA)
{
EPOS_DataCheck = 1;
ctrState.PreviousState = ctrState.CurrentState;
ctrState.CurrentState = GET_EPOS_DATA;
}
}
Wie ihr seht, wird in diesen ISR entweder nur ein ringpuffer beschrieben, oder der Status des Controllers geändert, also sind da keine hochkomplexen Algorithmen drin, oder gar noch schlimmer, irgendwas Speicheraufwändiges, das den Stackoverflow erzeugen könnte.
Das war jetzt nur mal zu eurer Info, ich weiss jetzt schonmal wo ich nachgucken muss.
Falls Ihr noch irgendwelche Anregungen habt, nur her damit 
Sascha
Lesezeichen