Forum: Compiler & IDEs USART und INTERRUPT Atmega8


von Calik (Gast)


Lesenswert?

Hallo.

Ich arbeite gerade an einem Projekt:
Also 2 uC atmega8 und direkte Verbindung über USART. Senden und
empfangen ohne Interrupt funktioniert. Ich möchte aber nicht dauernd
abfragen, ob da was gekommen ist....., also Interrupt:

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
...
...

int main (void){
   Init_Usart();
   sei();
   for(;;){

   //  Set_LED();   /* function alt */

   }
}

Bei der Initialisierung habe ich alles so belassen, ausser die Freigabe
fürs Interrupt:

   UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);

Und dann natürlich statt Set_LED():

SIGNAL(SIG_USART0_RECV){      // aus avr-lib

  while(!(UCSRA & (1<<RXC))); // aus datasheet
    udr = UDR;
    PORTC = udr;

   // for (i = 0; i<0x7fff; i++){}   // alt
   // PORTC = 0x00;                  //alt
   // for (i=0; i<0x7ffe; i++){}     //alt

}

Was mache ich falsch??????
Wer kann helfen?????

von Joline (Gast)


Lesenswert?

Hallo,

in Deiner Funktion SIGNAL(SIG_USART0_RECV) mußt Du die Zeile mit der
while-Schleife weglassen. Diese Funktion wird aufgerufen, wenn an der
Schnittstelle 1 (!) Zeichen empfangen wird. Und das steht dann in UDR.

Es genügt also in Deinem Beispiel: PORTC = UDR;

Wenn Du den Empfang in einer Schleife organisierst (nicht sehr
elegant), also ohne Interrupt, dann brauchst Du diese Konstruktion
"while(!(UCSRA & (1<<RXC)));", um mitzubekommen, wenn ein neues
Zeichen angekommen ist.

Joline

von Calik (Gast)


Angehängte Dateien:

Lesenswert?

Erst mal Dane an Joline.

Ich füg mal den C-Code mit bei.

von Calik (Gast)


Lesenswert?

Alles ok, ich habe es gefunden, es funzt.

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.