PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : UART ermöglicht Senden, aber kann nicht Empfangen



batti112
22.06.2004, 19:51
Hi!
Habe an meinem Atmega8 ein "UART-Modul" angebaut.
Senden kann der µC ohne Probleme und ohne Störungen.
Allerdings reagiert er auf ein Senden vom PC aus überhaupt nicht.

Das Proggy soll nur die empfangenen Daten wieder zum PC zurücksenden.

Nutze folgenden Code:

void init_uart()
{
outp( (CPU_Frequency / (UART_Baud_Rate*16L))-1 , UBRRL );
outp( 0, UBRRH );
outp( (1 << URSEL) | (3 << UCSZ0), UCSRC);
outp( (1 << RXCIE) | (1 << TXEN) | (1 << RXEN), UCSRB);
sei();
}

SIGNAL(SIG_UART_RECV)
{
uart_send( inp(UDR) );
}

void uart_send(char character)
{
loop_until_bit_is_set(UCSRA, UDRE);
outp(character, UDR);
}

int main()
{
outp( 15 , DDRD ); /* PIN 5-8 as Input*/

init_uart();
delay(3);
uart_send('H');
uart_send('a');
uart_send('l');
uart_send('l');
uart_send('o');
uart_send(10);
uart_send(13);
while(1);

return 0;
}

************************************************** **********************************

Müsste die Interrupt-Routine nicht auch bei Datenschrott reagieren?
Kann es an einer Fehlkofiguration der Schnittstelle liegen? (Obwohl die vom µC gesendeten Daten korrekt vom PC empfangen werden?)
Oder das wahrscheinlichste, hab ich einen hab ich einen Fehler gemacht? Zwinkern

Würde mich auch über programmiertechnische Tipps sehr freuen.

MfG

Batti

Gottfreak
22.06.2004, 22:22
Im Code kann ich keine Fehler erkennen. Hast du schon nach Fehlern in der Schaltung gesucht?
Was die Befehle outp und inp angeht: In der Dokumentation steht, dass die nicht mehr aktuell sind und in neueren Versionen 'rausfliegen könnten.
Du kannst in der aktuellen jedenfalls I/O-Registern wie ganz normalen Variablen Werte zuweisen.
statt
outp( 0, UBRRH );
also einfach
UBRRH=0;

tire0011
17.09.2004, 23:36
eigentlich müsste zumindest datenschrott ankommen.

Aber schau dir nicht nur die ankommenden Ascii zeichen an. vielleicht empfängst du ja wenigstens Hex zeichen die nicht als ascii interpretiert werden.
wenn das der fall ist schreibe dir ein kleines Programm womit du UBRRL hochzählst bis die richtigen daten ankommen.
oftmals ist eine verschiebung drinnen und UBRRL zum senden != empfangen.

batti112
18.09.2004, 16:05
Habe das Problem jetzt gelöst, lag daran das der interne Taktgeber wieder (er war definitiv deaktiviert) aktiviert war, aus welchen mir unerklärlichen Gründen auch immer...

Trotzdem herzlichen Dank Gottfreak & Tire0011 für die Hilfe...