Hterm empfängt lauter \0\0\0 vom UART ATmega8

Gast #4520875
Lesenswert?

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
Angehängte Dateien:
Gast #4520885
Lesenswert?

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!
Gast #4521272
Lesenswert?

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.
Gast #4521557
Lesenswert?

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);
Gast #4521571
Lesenswert?

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?
#4521584
Lesenswert?

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
Gast #4521620
Lesenswert?

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
Angehängte Dateien:
Gast #4521660
Lesenswert?

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
Gast #4521835
Lesenswert?

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 ;-)
Gast #4521954
Lesenswert?

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
Gast #4521973
Lesenswert?

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.
Gast #4522064
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren