PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : UART echo't nicht den gesendeten Test



Thor_
04.11.2013, 21:56
Hallo zusammen

Ich bin z.Zt. wieder daran, mich in das Thema Mikrocontroller einzuarbeiten und experimentiere z.Zt. mit dem UART.
Ich möchte gerne ein empfangenes Zeichen oder einen String auf dem angeschlossenen LCD anzuzeigen. Das LCD an und für sich funktioniert tiptop, das ist also nicht das Problem;)

Hier mal mein Code:
Ich habe den von hier: http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=48188

#include <avr/io.h>

#define USART_BAUDRATE 9600
#define F_CPU 1000000
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)

int main (void)
{
char ReceivedByte;

UCSRB = (1 << RXEN) | (1 << TXEN); // Turn on the transmission and reception circuitry
UCSRC = (1 << URSEL) | (1 << UCSZ0) | (0 << UCSZ1); // Use 8-bit character sizes

UBRRH = (BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register
UBRRL = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register

for (;;) // Loop forever
{
while ((UCSRA & (1 << RXC)) == 0) {}; // Do nothing until data have been received and is ready to be read from UDR
ReceivedByte = UDR; // Fetch the received byte value into the variable "ByteReceived"

while ((UCSRA & (1 << UDRE)) == 0) {}; // Do nothing until UDR is ready for more data to be written to it
UDR = ReceivedByte; // Echo back the received byte back to the computer
}
}

Ich hatte uerst eigentlich einen anderen Code der mehr tat. Da dieser aber nicht sauber funktionierte habe ich mich dann entschieden auf etwas zurück zu greifen was eigentlich funktionieren sollte;)

Als Mikrocontroller habe ich einen ATmega8. Auf dem Computer setze ich HTerm ein, Baud 9600, 1 Stop-bit.
Wenn ich vom Mikrocontroller aus direkt ein paar bits an den Mc sende kommen die richtig an. Wenn ich die sende-Leitung vom PC mit der Empfangs-leitung direkt verbinde kommt alles richtig wieder am PC an was von da gesendet wurde.
Als Pegelwandler setze ich den MAX233CPP ein, dieser kommt ohne externe Kondensatoren aus und scheint soweit korrekt zu funktionieren.

Wenn ich nun vom PC aus an den MC einen Text oder einzelne Bits sende, kommen die nicht so zurück wie sie gesendet werden. Hier ein paar Beispiele:

aus 10101010 wird 01101010
aus 00000000 wird 01101010
11001100 bleibt 11001100

Kann mir jemand sagen, wo der Hund vergraben liegt? Ich finde den Fehler leider schon seit ein paar Tagen nicht.
Den MC habe ich übrigens immer wieder mal "neu gestartet", genau so wie den PC.

Liebe Grüsse

Thor_

sternst
04.11.2013, 22:53
Kann mir jemand sagen, wo der Hund vergraben liegt?Ich sehe zwei Probleme:

1) Du hast den UART auf 6 Bit eingestellt.

2) Bei 9600 Baud und 1 Mhz liegt der Fehler nur dann im erlaubten Bereich, wenn man U2X benutzt, was du nicht tust.

Thor_
05.11.2013, 07:08
Hi Sterst!

Hätte ich doch früher geschrieben;)

Ich habe nun

UCSRC = (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1)
gesetzt, so dass im 8-bit Modus übertragen wird

Und die Taktfrequenz des Controllers auf 8Mhz eingestellt und siehe da:
Es tut alles so wie es soll=)

Vielen Dank und einen schönen Tag!