- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 5 von 5

Thema: ISR Compiler Fehler ATmega162? [gelöst]

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    11.09.2006
    Ort
    Linz
    Beiträge
    7

    ISR Compiler Fehler ATmega162? [gelöst]

    Anzeige

    Powerstation Test
    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-

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Versuch mal pro IRQ das UDR nur einmal auszulesen, nicht mehrfach.
    Disclaimer: none. Sue me.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    11.09.2006
    Ort
    Linz
    Beiträge
    7
    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;
    }
    }

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    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.
    Disclaimer: none. Sue me.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    11.09.2006
    Ort
    Linz
    Beiträge
    7
    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!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress