Hallo zusammen, ich versuche mich seit Tagen über UART ein Hallo zu senden an den PC und bekomm nur ein \0\0\0\0 als Antwort. Ich verwende einen ATmega8 mit externen 16,0000 MHZ quarz, von Pollin der RS232/TTL Wandler (Bausatz) und einen USB seriell Converter. Programmiere in C. Am RS232/TTL Wandler hab ich Spannung anliegen 4,98Volt. Richtung PC am Pin 14 (T1out) messe ich ca. -8,89Volt. DIe beiden Screenshots zeigen zum einen die Hterm ANzeigefehler und zum anderen Logic Analyzer die Sende signale. Ich habe bereits am RS232/TTL Wandler RX und TX überbrückt und über Hterm Hallo gesendet und auch empfangen. Allerdings von Hterm zum Atmel hab ich noch nix gesendet, bzw versucht zu empfangen. Vieleicht hat ja einer von euch einen guten Rat was ich noch machen könnte. LG Hendrik
In der Datei... uart.h:
1 | #define UART_SETTING ((16000000/16L/UART_BAUDRATE)-1)
|
Du rechnest da: (16 000 000 16 9600) - 1... mach das mal anders:
1 | #define UART_SETTING 16000000 / (16*UART_BAUDRATE) -1
|
Und das zweite, und das viel größere Problem:
1 | char UBRR; |
2 | UBRR = UART_SETTING; |
du weist UBRR als Variable zu, schmeiß das "char UBRR;" mal raus!
Dein Logic Analyzer sagt Dir: 12ms/Zeichen. Das ergibt bei mir 1200 Baud.
Jim M. schrieb: > Dein Logic Analyzer sagt Dir: 12ms/Zeichen. Das ergibt bei mir 1200 Baud. Hab aber #define UART_BAUDRATE 9600 definiert am Anfang , wundert mich auch das die Zeichen so lange brauchen zum senden
Hendrik schrieb: > Vieleicht hat ja einer von euch einen guten Rat was ich noch machen > könnte. Erstmal könntest du bei HTerm die Hex-Ausgabe aktivieren und aus deiner Headerdatei uart.h den ganzen Code rausschmeißen. Der hat da nichts zu suchen, auch wenn C einem natürlich beliebig Freiheiten gibt... In die Headerdatei gehört von den Funktionen nur das Interface. Guck mal in ein C Buch.
Max D. schrieb: > 9600/1200 = 8 > riecht für mich nach ckdiv fuse Wo ändere ich das ckdiv fuse bei AtmelStudio 6 bzw was genau
Unter Device Programming/Fuses?! Einfach das Hakerl bei ckdiv (clock division) weg machen. http://www.atmel.com/webdoc/atmelstudio/atmelstudio.AVRStudio.ProgrammingDialog.Introduction.html
Gibt es anscheinend nur bei den Tinys: http://www.mikrocontroller.net/attachment/149848/Fuse-Einstellungen.png
GanzGast schrieb: > Gibt es anscheinend nur bei den Tinys: > http://www.mikrocontroller.net/attachment/149848/Fuse-Einstellungen.png Das ist quark, auch Atmegas haben den CKDIV8 - aber der Atmega8 nun gerade nicht :D
Draco schrieb: > Du rechnest da: (16 000 000 16 9600) - 1... > > mach das mal anders: > > #define UART_SETTING 16000000 / (16*UART_BAUDRATE) -1 hab ich geändert , hab jetzt eine Uart_Setting von 709 (vorher 103) Ich steck mal LA an und melde mich wieder
Wenn ich mir deine UBBRH/L von deinem Bild anschaue dann ist das ja 0b0000011000001111 hast du das angepasst ? Das ist ja ist 1551 , War das nur ein Test oder ist das aktuell so eingestellt ? Das währen ja ~644 Baud. Gruß JackFrost
:
Bearbeitet durch User
Bastian W. schrieb: > Wenn ich mir deine UBBRH/L von deinem Bild anschaue dann ist das ja > 0b0000011000001111 hast du das angepasst ? Das ist ja ist 1551 , War das > nur ein Test oder ist das aktuell so eingestellt ? Das währen ja ~644 > Baud. UBRRH = (char) (0b00000110); //(char) (UART_SETTING >> 8); UBRRL = (char) (0b00001111); //(char) (UART_SETTING); sollte ich so einstellen, vom Kollege aus zum Test. Ursprünglich stand (char) (UART_SETTING >> 8); (char) (UART_SETTING);
Was für eine Baudrate zeigt der Saleae bei Autobaud an ? Compiled der überhaupt du hast nen Fehler das die Variable UBBR undefiniert ist. Gruß JackFrost
Habe mir auf LCD UBRRH und UBRRL anzeigen lassen wenn: UBRRH = (char) (0b00000110); UBRRL = (char) (0b00001111); UBRRH = 6 UBRRL = 15 wenn: UBRRH = (char) (UART_SETTING >> 8); UBRRL = (char) (UART_SETTING); UBRRH = 2 UBRRL = 197 was ist nun Richtig, was ist Falsch?
Bastian W. schrieb: > du hast nen Fehler das die Variable UBBR > undefiniert ist. den Fehler hab ich weil ich char UBRR; ausgeklammert habe weil Draco schrieb: > Und das zweite, und das viel größere Problem: > > char UBRR; > UBRR = UART_SETTING; > > du weist UBRR als Variable zu, schmeiß das "char UBRR;" mal raus!
1 | UBRR = UART_SETTING; //(16000000Mhz / (9600Baud*16)) -1 = 103,166 = UBRRH = 0110 , UBRRL = 0111 gesammt 01100111 =103 |
UBBR ist 12 Bit lang und nicht nur 8 Bit. Die unteren 8 Bit kommen in UBBRL und die oberen 4 Bit sind die unteren von UBBRH. Bei 1003 hast du also
1 | UBBRH = 0; |
2 | UBBRL = 103; |
Hendrik schrieb: > UBRRH = (char) (UART_SETTING >> 8); > UBRRL = (char) (UART_SETTING); > UBRRH = 2 > UBRRL = 197 Das passt vom Syntax aber für 9600 Baud und 16 MHz ist es der falsche Wert wenn du die UART nicht im X2 Modus betreibst. Wenn es mit den Werten nicht geht schau dir die echte Baudrate mim Saleae an. Gruß JackFrost
:
Bearbeitet durch User
hab wieder meine ursprüngliche Formel für UART Setting genommen #define UART_SETTING ((16000000/16L/UART_BAUDRATE)-1) und UBRRH = (char) (UART_SETTING >> 8); UBRRL = (char) (UART_SETTING); UBRRH ist jetzt 0 UBRRL ist jetzt 103 Die Zeit pro Zeichen ist auch schon mal um einiges kürzer
Es funktioniert jetzt fein, freu mich riesig Vielen Dank euch allen und frohe Ostern
Hi >hab wieder meine ursprüngliche Formel für UART Setting genommen >#define UART_SETTING ((16000000/16L/UART_BAUDRATE)-1) >und >UBRRH = (char) (UART_SETTING >> 8); >UBRRL = (char) (UART_SETTING); Warum nicht UBRR = UART_SETTING; ? MfG Spess
spess53 schrieb: > Hi > >>hab wieder meine ursprüngliche Formel für UART Setting genommen >>#define UART_SETTING ((16000000/16L/UART_BAUDRATE)-1) >>und >>UBRRH = (char) (UART_SETTING >> 8); >>UBRRL = (char) (UART_SETTING); > > Warum nicht UBRR = UART_SETTING; ? > > MfG Spess Weil das wie gesagt, so nicht funktionieren wird. Da er bloß die lokal definierte Variable ändert, aber nicht UBRR:
1 | char UBRR; |
2 | UBRR = UART_SETTING; |
Nimmt er "char UBRR;" weg - dann würde das funktionieren ;-)
Draco schrieb im Beitrag
> Nimmt er "char UBRR;" weg - dann würde das funktionieren ;-)
Falsch. Wenn ich es stehen lasse funktioniert es . Wenn ich char UBRR;
entferne bekomm ich von atmelstudio dicke Fehlermeldung weil ja in der
nächsten Zeile ja dann UBRR undefiniert ist.
Die Frage ist, könnte man beides weglassen denn wenn
char UBRR;
UBRR = UART_SETTING; dasteht bekomm ich ne Warnung :
variable 'UBRR' set but not used
Hendrik schrieb: > Draco schrieb im Beitrag >> Nimmt er "char UBRR;" weg - dann würde das funktionieren ;-) > > Falsch. Wenn ich es stehen lasse funktioniert es . Wenn ich char UBRR; > entferne bekomm ich von atmelstudio dicke Fehlermeldung weil ja in der > nächsten Zeile ja dann UBRR undefiniert ist. Statt eine 8-Bit Variablen für Daten des 16-Bit Register UBRR zu deklarieren, solltest du besser UBRR für einen direkten Zugriff definieren, ähnlich wie in der iom8.h für UBRRL und UBRRH.
Frage ist, könnte man beides weglassen denn wenn char UBRR; UBRR = UART_SETTING; dasteht bekomm ich ne Warnung : Frage hat sich erledigt, Kumpel hat da was "versucht" und nicht gelöscht. Kopieren und einfügen klappt halt nicht immer.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.