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