PS. nur der vollständigkeit halber, hier noch das Datenblatt:
www.atmel.com/Images/doc2503.pdf
Die benötigten Informationen findest du ab Seite 159
PS. nur der vollständigkeit halber, hier noch das Datenblatt:
www.atmel.com/Images/doc2503.pdf
Die benötigten Informationen findest du ab Seite 159
Hallo shedepe,
das Datenblatt habe ich mir bereits sehr geduldig zu Gemüte geführt und bin der Meinung, mir scheint was du da geschrieben hast unterscheidet sich auch nicht wesentlich von meiner Version. Ich sehe hier einen Unterschied bei der definition der register UBRRL und UBRRH (hier habe ich die header Datei verwendet um mir Arbeit zu ersparen, aber ich werde es morgen mal auf "manuellem" Wege probieren. Der zweite unterschied ist das du beim schreiben in das Register UCSRC nich das Bit URSEL gesetzt hast, im Datenblatt jedoch steht, dass dies notwendig ist?
LG
Yunus
Soweit ich mich entsinne ist es nicht nötig URSEL explizit zu setzen, da es bereits 0 ist. Probier es einfach noch mal so.
Hi,
also ich habe jetzt auch zwei Stunden rumprobiert und mich gewundert warum bei mir nur Zeichenmüll rauskam. Ich hatte erst
UCSRB = (1<<RXEN) | (1<<TXEN);
UCSRC = (1<<UCSZ1) | (1<<UCSZ0);
UCSRC = (1<<URSEL)
da stehen und damit funktioniert es NICHT.
Ändere ich es auf
UCSRB = (1<<RXEN) | (1<<TXEN);
UCSRC = (1<<URSEL)| (1<<UCSZ1) | (1<<UCSZ0);
um funktioniert es (nur so am Rande).
Hier hast du ein funktionierendes Programm was du verwenden kannst:
Ich hab halt alles vom UART händlich gemacht (finde ich zum ersten lernen bischen besser als die "fertigen" Libs zu verwenden. Da versteht man den Ablauf bischen besser.Code:/* * Hallo Welt.c * * Created: 03.05.2012 20:46:19 * Author: Daniel */ #define F_CPU 16000000UL // CPU Takt für das delay #include <avr/io.h> #include <avr/interrupt.h> #include <string.h> #include <util/delay.h> #include <stdlib.h> char data[50] = "Hallo"; // Text der ausgegeben werden soll int lenght = 0x00; int main(void) { UART_Init(); while(1) { Send_UART_Char(data); _delay_ms(500); } } void UART_Init() { UCSRB = (1<<RXEN) | (1<<TXEN); // Rx und Tx aktivieren UCSRC = (1<<URSEL)| (1<<UCSZ1) | (1<<UCSZ0); // 8 Bit Nachrichtenlänge einstellen UBRRH = 0x00; UBRRL = 0x33; // Baudrate auf 19200 festlegen } void Send_UART_Char(char data[]) { char Counter; lenght = strlen(data); while(Counter < lenght) { while (!(UCSRA & (1<<UDRE))); UDR = data[Counter]; Counter++; } Counter = 0x00; while (!(UCSRA & (1<<UDRE))); UDR = 0x0A; while (!(UCSRA & (1<<UDRE))); UDR = 0x0D; }
Vergleich das mal mit deinem Programm. Von der void Send_UART_Char brauchst du dann nur die Zeilen nehmen die nur 1 Zeichen senden (der Rest ist eine Schleife womit ein ganzer String gesendet wird). Ein einzelnes Zeichen sendest du so:
while (!(UCSRA & (1<<UDRE)));
UDR = 0x0D;
Ich denke du hast sicher nur eine Kleinigkeit verkehrt gemacht![]()
Geändert von Kampi (03.05.2012 um 22:27 Uhr)
Schaut ruhig mal auf meiner Homepage vorbei:
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Ich meinte natürlich, das der Haken bei Flow Control NICHT gesetzt ist."Flow Control"? Du hast doch gar kein "Flow Control".
Kampi ich habe deinen Code mittlerweile auch probiert der will auch nicht. Ich werde nachher mal testen ob der AVR überhaupt noch lebt... ich weiss echt nicht woran es noch liegen könnte :/
LG
Yunus
Prüf mal ob die Verbindung in Ordnung ist. Verbinde direkt vor dem AVR Rx und Tx und check dann mal ob der Loopback funktioniert. Wenn er funktioniert ist die Leitung in Ordnung und das Problem ist der AVR.
Schaut ruhig mal auf meiner Homepage vorbei:
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Auch auf die Gefahr hin dass es anscheinend nur eine Lapalie ist aber hast du bei Hterm den richtigen Com-Port eingestellt?
Lesezeichen