Forum: Mikrocontroller und Digitale Elektronik Atmega 88 Uart Init


von Simon (Gast)


Lesenswert?

Hallo,

es kann doch ansich nicht so schwer sein
Atmega 88PA


Init:

  UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);
  // Mega88 8N1
    UCSR0C =
    (1<<USBS0)|
    (1<<UCSZ00)|
    (1<<UCSZ01);


ISR(USART_RX_vect) {
  unsigned char c;
  c = UDR0;
  myuart_putc(c);
}


Aber irgend warum bekomme ich kein Zeichen zurück.
Die Funktion putc Funktioniert jedoch.

von Helfer (Gast)


Lesenswert?

Wie ist myuart_putc() implementiert?

Wenn diese Funktion so ähnlich wartet bis sie senden darf:
1
  // warten bis Senden moeglich
2
  while( !(UCSR0A & (1<<UDRE0)) ) {}
3
  UDR0 = c;

Dann musst du im Datenblatt mal nachlesen, wann das UDRE0 Bit gesetzt 
wird. Wird das bereits durch das Auslesen des UDR0 ausgelöst oder erst 
nach dem Verlassen der ISR(USART_RX_vect)?

von Simon (Gast)


Lesenswert?

Also die Funktion zum senden habe ich, die Funktioniert auch.

Aber aus irgend einem Grund ruft er beim eintreffen eines Zeichens den 
Interrupt nicht auf.

void myuart_putc(unsigned char data) {
while (!(UCSR0A & (1<<UDRE0)))
    {
    }
    UDR0 = data;
}

von Stefan E. (sternst)


Lesenswert?

Helfer schrieb:
> Dann musst du im Datenblatt mal nachlesen, wann das UDRE0 Bit gesetzt
> wird. Wird das bereits durch das Auslesen des UDR0 ausgelöst oder erst
> nach dem Verlassen der ISR(USART_RX_vect)?

Weder noch. UDRE0 hat mit dem Empfang von Daten nicht das geringste zu 
tun. UDR0 ist ein "ich bin zwei Register" (Senden und Empfangen 
getrennt).

@ Simon:
Wo ist das sei()?

von Simon (Gast)


Lesenswert?

ooooooh man!!!!
sei wars... OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH man..


Danke!

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.