Atmega 88 Uart Init

Gast #2120306
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.
Gast #2120328
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)?
Gast #2120344
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;
}
#2120348
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()?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren