PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ISR Compiler Fehler ATmega162? [gelöst]



andio
25.09.2006, 15:13
Hi!
Ich hab ein Problem mit einer UART0 ISR, meiner Meinung nach wird diese vom Compiler, ich verwende das AVR Studio 4.12 SP3 mit WINAVR, falsch übersetzt.....
Die Interrupt Routine soll beim ersten Aufruf, wenn das Startzeichen '~' empfangen wird das startbit auf 1 setzen und dann die folgenden 5 Byte, in das Array data_in schreiben also von d=0 bis d=4
Und wenn d=5 ist(nach dem inkrementieren von d), also 5 Byte empfangen das startbit wieder löschen und das auswertebit setzen.

Das Problem ist aber, dass in data_in[0] das Startzeichen '~' drinnen steht und die folgenden Byte erst ab data_in[1] stehen, also um eins verschoben sind.

Hat jemand von euch ne Erklärung dafür?
Meiner Meinung nach, wäre die ISR richtig.....

Hier der Code:



ISR (USART0_RXC_vect)
{
static unsigned char d=0,startbit=0;

if (UDR0 == '~')
{
startbit = 1;
d=0;
}
else
{
if(startbit == 1)
{
data_in[d]=UDR0;
d++;
if(d==5)
{
auswerten=1;
startbit=0;
}
}
}

}



Danke für eure Hilfe!

-andio-

SprinterSB
25.09.2006, 15:31
Versuch mal pro IRQ das UDR nur einmal auszulesen, nicht mehrfach.

andio
25.09.2006, 15:39
Danke SprinterSB, werd ich morgen versuchen.

Aber bei der ISR les ich das UDR auch zweimal und dieses funktioniert richtig, d.h. die Byte stehen in der richtigen Reihenfolge im Array.

Irgendwie scheints so, als ob wenn er das if das erste Mal wahr ist (~ empfangen) auch das else abarbeitet.....


Bei dieser ISR stehen die Bytes in der richtigen Reihenfolge, ich benötige aber die Funktion der vorhin geposteten.


ISR (USART0_RXC_vect)
{
if(startbit == 1)
{
data_in[d]=UDR0;
d++;

}


if (UDR0 == '~')
{
startbit=1;
}


if(d == 5)
{
auswerten=1;
startbit=0;
d=0;
}
}

SprinterSB
25.09.2006, 16:04
Ob ein Compilerfehler vorliegt kann ich nicht sagen, ich verwende keinen GCC 4.0.

Stell hier mal den Code rein, den gcc generiert (mit -save-temps -fverbose-asm -dp übersetzt, die Datei heisst *.s) und verwende *bitte* [code]-Tags.

andio
26.09.2006, 09:17
Danke Sprinter SB, ich lese jetzt das UDR0 am Anfang einmal aus und schreibe es in eine Variable.
Jetzt funktioniert es so, wie es soll!

Danke!