Sollte es nicht eher #define F_CPU 3686400UL lauten?
Ein 3,6864MHz-Quarz hat bei nahezu allen Baudraten keinen Abweichungsfehler.
Wie kommst du denn darauf?
UBRRL=0x05; // Baudrate festlegen
UBRRH=0X0b; // Baudrate festlegen
Hallo,
ich hab ein Problem mit der UART-Schnittstelle.
Wenn ich mit HTERM auf die Schnittstelle schau kommen nur "0x00" an das dafür in rauhen mengen.
Die Baudrate ist auf 38400 eingestellt.
Ich selbst seh leider keinen fehler in diesen Quellcode.
Ich möchte die Schnittstelle für Debugzwecke verwenden. Aber dazu muss ich erst einmal etwas ausgeben könnenCode:#include <avr/io.h> #include <stdio.h> #define F_CPU 36864 #define Baud 38400 void uart_init(void) { UCSRB = (1 << TXEN); UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0); UBRRL=0x05; // Baudrate festlegen UBRRH=0X0b; // Baudrate festlegen } int uart_send(unsigned char c) { while (!(UCSRA & (1<<UDRE))) { // mach nichts } //senden UDR=c; return 0; } void uart_write(char *s) { while(*s) { uart_send(*s); s++; } } int main(void) { uart_init(); while(1==1) { uart_write("test\0"); } }
Besten Dank schon einmal für euere Zeit
Sollte es nicht eher #define F_CPU 3686400UL lauten?
Ein 3,6864MHz-Quarz hat bei nahezu allen Baudraten keinen Abweichungsfehler.
Wie kommst du denn darauf?
UBRRL=0x05; // Baudrate festlegen
UBRRH=0X0b; // Baudrate festlegen
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Diese Werte hab ich von hier: http://www.gjlay.de/helferlein/avr-uart-rechner.html
Die Sache mit der Frequenz hab ich angepasst:
#include <avr/io.h>
#include <stdio.h>
#define F_CPU 3686400UL
#define Baud 38400
void uart_init(void)
{
UCSRB = (1 << TXEN);
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
UBRRL=0x05; // Baudrate festlegen
UBRRH=0xb; // Baudrate festlegen
}
Was ich vielleich vergessen habe zu sagen, ist dass es sich durch die veränderung nichts an dem Ergebniss geändert hat.
Welche Taktquelle ist denn bei den Fuses festgelegt ? Läuft das Ding eventuell mit dem internen RC-Oszillator?
Probier mal :
Die zweite Spalte ist nur für U2X also double Speed.Code:void uart_init(void) { UCSRB = (1 << TXEN); UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0); UBRRL=0x05; // Baudrate festlegen UBRRH=0x00; // Baudrate festlegen }
Ich habe mir gerade mal das Datenblatt angeschaut:
http://pdf1.alldatasheet.com/datashe...L/ATMEGA8.html
Wenn du auf Seite 157 schaust hast du ja eine Tabelle wie du das UBRR Register beschreiben musst, wenn du eine bestimmte Baudrate haben willst.
Bei deinem Quarztakt und deiner Baudrate musst du das Register mit 5 beschreiben (wenn du das U2X Bit auf 0 lässt).
Das heißt du musst nur schreiben:
UBRRL=0x05;
UBRRH=0x00;
und nicht:
UBRRL=0x05; // Baudrate festlegen
UBRRH=0xb; // Baudrate festlegen
Edit: Da war jemand ein paar Sekunden schneller
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
Jap, wie ich eben schon schrieb.
Besten Dank jetzt funktioniert es aber dafür hab ich jetzt die nächste Frage:
Wieso empfang in nach dem Strings immer 4 mal 0xff, bevor das Linefeed kommt?
Hört sich nach konstantem String ( also char buffer[20] ) an, wo der nicht voll ist bzw.
Endet bei \0 und wenn er den nicht findet geht er bis zum Schluss durch.Code:void uart_write(char *s){ while(*s) { uart_send(*s); s++; } }
Besten Dank nun funktioniert auch das richtig.
Jetzt hätte ich aber noch 2 Fragen komm mir schon langsam unverschämt vor euch so zu löchern.
1: Was bedeutet genau [20] und muss ich das auch ändern?
2: Wenn ich ein LF stetzen will kann ich doch mit HTerm auf die \0 triggern, so dass hterm einen neuen Zeile beginnt. Doch leider funktioniert das bei mir nicht mein Favorit war ja bei HTerm auf "New line at Null " stelle doch irgendwie geht das bei keiner opiton richtig.
Lesezeichen