Forum: Mikrocontroller und Digitale Elektronik UART Interrupt


von Konstanty K. (konstanty)


Lesenswert?

Hallo zusammen,

ich habe einige Problemme bei den Interrupts mit UART. Ich benötige ein 
Empfangsinterrupt. Mein Problem ist jedoch, dass das Interrupt die ganze 
Zeit ausgelöst wird, auch wenn nichts empfangen wird. Kann mir jemand 
weiterhelfen?

Hier ists mein Code:

int main(void)
{
    init();

    UART1Config = USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE 
&   USART_EIGHT_BIT & USART_BRGH_HIGH ;
    baud = 12;
    Open1USART(UART1Config,baud);

    RC1IF = 0; //reset RX pin flag
    RC1IP = 0; //Not high priority
    RC1IE = 1; //Enable RX interrupt
    PEIE = 1; //Enable pheripheral interrupt (serial port is a 
pheripheral)
    GIE=1;    //enable interrupts

    while(1)
    {

    }
}

void service (void)
{
    PORTE=255;

    if(PIR1bits.RCIF == 1)
    {
        rx = Read1USART();
        puts1USART(Msg);
        Write1USART(rx);
        RC1IF = 0; // clear rx flag
        PORTE=0;
        Delay100TCYx(150);
    }
}

von Stefan F. (Gast)


Lesenswert?

Ich kenne deinen µC nicht, allerdings bin ich es gewohnt, dass amn in 
der ISR das Interrupt-Flag bzw. Received-Flag nicht zurücksetzten soll. 
Das machen die Controller von selbst. Der Delay in der ISR wirkt 
deplatziert.

von Dietrich L. (dietrichl)


Lesenswert?

Fragen über Fragen:

- Welcher Prozessor ist das?
- Was passiert in den verschiedenen benutzten Funktionen?
  (z.B. Read1USART(); puts1USART(Msg); Write1USART(rx);)
- Wo sind die Variablen deklariert?
- ... und formatier den Code mal richtig:
1
[c]C-Code[/c]

Gruß Dietrich

von Joachim B. (jar)


Lesenswert?

Stefan U. schrieb:
> Ich kenne deinen µC nicht, allerdings bin ich es gewohnt, dass amn in
> der ISR das Interrupt-Flag bzw. Received-Flag nicht zurücksetzten soll.
> Das machen die Controller von selbst.

denke ich auch

in der ISR wird doch normalerweise der zugehörige IRQ automatisch 
gelöscht wenn sie behandelt wurde, ich tippe mal durch dein "löschen" 
setzt du einen neuen IRQ manuell.

Konstanty K. schrieb:
> Mein Problem ist jedoch, dass das Interrupt die ganze
> Zeit ausgelöst wird,

von Konstanty K. (konstanty)


Lesenswert?

Danke für die Tipps. Und verzeiht bitte diese ungenauen Angaben 
bezüglich meines Problems. Bin neu hier und werde mich bessern :)

Mein Problem war, dass ich den Timerinterrupt aktiviert hatte. :) Das 
Program funktioniert jetzt :)

von M. K. (sylaina)


Lesenswert?

Stefan U. schrieb:
> Der Delay in der ISR wirkt
> deplatziert.

Ein Delay wirkt in einer ISR nicht nur deplaziert, es ist deplaziert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.