Forum: Mikrocontroller und Digitale Elektronik Hterm empfängt lauter \0\0\0 vom UART ATmega8


von Hendrik (Gast)


Angehängte Dateien:

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

von Draco (Gast)


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!

von Jim M. (turboj)


Lesenswert?

Dein Logic Analyzer sagt Dir: 12ms/Zeichen. Das ergibt bei mir 1200 
Baud.

von Hendrik (Gast)


Lesenswert?

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

von Max D. (max_d)


Lesenswert?

9600/1200 = 8
riecht für mich nach ckdiv fuse

von Wolfgang (Gast)


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.

von Hendrik (Gast)


Lesenswert?

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

von GanzGast (Gast)


Lesenswert?

Unter Device Programming/Fuses?! Einfach das Hakerl bei ckdiv (clock 
division) weg machen.
http://www.atmel.com/webdoc/atmelstudio/atmelstudio.AVRStudio.ProgrammingDialog.Introduction.html

von Hendrik (Gast)


Angehängte Dateien:

Lesenswert?

finde CKDIV gerade nicht

von GanzGast (Gast)


Lesenswert?


von Draco (Gast)


Lesenswert?

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

von Hendrik (Gast)


Angehängte Dateien:

Lesenswert?

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

von Hendrik (Gast)


Angehängte Dateien:

Lesenswert?

hat sich nichts geändert

von Bastian W. (jackfrost)


Lesenswert?

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
von Hendrik (Gast)


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);

von Bastian W. (jackfrost)


Lesenswert?

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

von Hendrik (Gast)


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?

von Hendrik (Gast)


Lesenswert?

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!

von Bastian W. (jackfrost)


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

: Bearbeitet durch User
von Hendrik (Gast)


Angehängte Dateien:

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

von Hendrik (Gast)


Angehängte Dateien:

Lesenswert?

Es funktioniert jetzt fein, freu mich riesig

Vielen Dank euch allen und frohe Ostern

von spess53 (Gast)


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

von Draco (Gast)


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 ;-)

von Hendrik (Gast)


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

von Wolfgang (Gast)


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.

von Hendrik (Gast)


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.

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
Noch kein Account? Hier anmelden.