PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : UART -> Empfangen funktioniert nicht



Rodney
28.09.2004, 18:47
Hallo Leute,

bei meinem UART klappt das Senden zum PC ohne Probleme, alles wird richtig übertagen.

Wenn ich allerdings irgendetwas vom PC sende hängt sich der Controller (AtMega16) auf und führt keine Befehle mehr aus...

Mein kompletter UART-Code:


void uart_init()
{
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();
}


void uart_nachricht(char* senden) {

for (; *senden != '\0'; senden++) {
loop_until_bit_is_set(UCSRA, UDRE);
UDR=*senden;
}
loop_until_bit_is_set(UCSRA, UDRE);
UDR = 13;
}

Signal (USART_Receive_Complete) {
uart_nachricht("Hab was emfangen!");
}

28.09.2004, 20:32
Womit programmierst du?

Bei avrgcc:

#include <avr/signal.h>
#include <avr/interrupt.h>

SIGNAL (SIG_UART_RECV) {
//do something
}

Kjion
28.09.2004, 21:33
Hi,

du muss in der Interruptroutine UDR auch auslesen. Ansonsten wird das Flag nicht gelöscht und die Routine ständig wieder ausgeführt. Und das zurücksenden solltest du nicht in der Interruptoutine machen, setz da lieber eine Variable und frag die im Hauptprogramm ab.

Ansonsten gilt das was der Gast schon geschrieben hat. Deine Syntax ist da einfach falsch...

MfG Kjion

Rodney
28.09.2004, 21:40
danke für den Code jetzt gehts...

Meinen Code hatte ich aus einem alten AVR-GCC Tutorial, welches aber das einzigste ist was ich in der Richtung kenne.

Gibt es halbwegs neue, die auch AD-Wandler etc behandeln?

28.09.2004, 22:05
www.mc-project.de

Da werden sie geholfen :-)

Rodney
29.09.2004, 12:32
die Site gefällt mir ganz gut, danke

Ich hoffe die Beispiele dort lassen sich problemlos auf einen 16er übertragen

muraad
30.09.2004, 17:16
Wenn du mit 16er den ATmega16 meinst dann gehts ganz sicher. Musst nur schauen ob es irgendwo Mhz abhängige Funktionsbeispiele gibt, die du dann halt auf dein Quarz umschreiben musst.
Gruß Muraad