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?????
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.