Forum: Mikrocontroller und Digitale Elektronik ATmega8 - Usb Kommunikation Falsche zeichen?


von Stefan. L. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo.

Ich sitzte zurzeit an einem projekt bei welchem ich mit Hilfe eines 
ATmega8, einen Lichtsensor auslesen, einige Berechnungen durchführen und 
die Ergebnisse schließlich per USB an einen PC übertragen will.

Also einfach mal schlau gemacht sich einen UART zu USB Konverter gekauft 
und das Beispielprogramm aus dem AVRGCC Tutorial, bei welchem ein 
einzelnes Zeichen gesendet werden soll ausprobiert.


Nun zum Problem:
Ich habe das Program "hterm" installiert um mir die Zeichen welche ich 
über die USB-Schnittstelle empfange ansehen zu können.

gesendet wird ein "x" in einer Endlosschleife.
empfangen wird jedoch "[" (01011011) und in unregelmäsigen Abständen 
auch immer wieder ein "K" (01001011).

Ich bin mir nun einfach nicht sicher ob der µC selbst bereits einen 
Fehler macht, der Konverter möglicherweise beschädigt ist (ist nämlich 
sehr anfällig gegenüber elektrostatischer Aufladung) oder ich einfach zu 
dumm bin und irgendeinen idiotischen Fehler gemacht habe^^.

Mein Programmcode (welcher wie gesagt aus dem Tutorial entnommen ist) 
befindet sich genauso wie meine beschaltung im Anhang.

Verwendet wurde dieser Konverter: 
http://www.conrad.at/ce/de/product/197326/Conrad-Mini-USB-zu-UART-Konverter?queryFromSuggest=true

Hoffe ihr könnt mir etwas weiterhelfen
mfg Stefan

von Peter II (Gast)


Lesenswert?

wo setzt du denn die Baudrate?

von Stefan. L. (Gast)


Lesenswert?

in der 2ten Zeile mit dem .. #define BAUD 9600

von Peter II (Gast)


Lesenswert?

Stefan. L. schrieb:
> in der 2ten Zeile mit dem .. #define BAUD 9600

nein, diese anweisung macht überhaupt nichts. Das ist nur eine Define.

von Stefan. L. (Gast)


Lesenswert?

Hmm ich habe jedoch nichts anderes als diesen Code zum "einstellen" 
einer Baudrate beim UART- AVRGCC Tutorial gefunden. Wärst du wohl so 
nett und würdest mir die richtige Definition erläutern?

von Peter II (Gast)


Lesenswert?

https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART

es fehlt soetwas wie:

UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;

von Daniel C. (cecky)


Lesenswert?

Da du ja die setbaud.h benutzt, schau sie dir doch einfach mal genauer 
an. Da ist am Anfang ein Beispiel wie man die setbaud.h verwenden 
soll/kann

von Cyblord -. (cyblord)


Lesenswert?

Hauptsache erstmal per Copy&Paste den Code reinklatschen, nix denken und 
dann wenns nicht geht umgehend einen Thread eröffnen. Sauber.

Wie soll ein #define alleine die Baudrate setzen?

In jedem Beispiel zu UART sieht man wie der UBRR Register gesetzt wird. 
Im Datenblatt hats Beispielcode dazu. Einfach mal das scheiß DB lesen. 
Das wär mal was oder?

von Stefan. L. (Gast)


Lesenswert?

Peter II schrieb:
> https://www.mikrocontroller.net/articles/AVR-GCC-T...
>
> es fehlt soetwas wie:
>
> UBRRH = UBRR_VAL >> 8;
> UBRRL = UBRR_VAL & 0xFF;

ok danke schonmal für den Hinweis :)

wenn ich das richtig verstehe sind das also 2 8bit Register in welchen 
die Baudrate gesetzt wird? Oder passiert in den beiden Registern etwas 
anderes?

Im Endeffekt wäre in diesem Beispiel laut meiner Überlegung die 
Baudrate: (00001000 11111111) sprich 2303 ??

Sollte ich mich wiedermal irren, würde ich mich um eine Erklärung was in 
dem Beispiel mit den Registern eigentlich passiert freuen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Stefan. L. schrieb:
> atmel.png
Meine C-Dateien heißen mit Nachnamen nicht *.png sondern *.c

Stefan. L. schrieb:
> Hmm ich habe jedoch nichts anderes als diesen Code zum "einstellen"
> einer Baudrate beim UART- AVRGCC Tutorial gefunden.
Du musst besser suchen...
Das erste Codebeispiel lautet "UART initialisieren". Dort wird 
allerdings keine Baudrate eingestellt. Aber gleich danach kommt das 
hier:
1
Nun ist noch das Baudratenregister UBRR der verwendeten UARTs einzustellen, 
2
bzw. bei neueren AVRs die beiden Register UBRRL und UBRRH.

> Im Endeffekt wäre in diesem Beispiel laut meiner Überlegung die
> Baudrate: (00001000 11111111) sprich 2303 ??
Warum musst du überlegen? Das Ausrechnen macht doch der Compiler für 
dich:
1
// Berechnungen
2
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
3
4
void uart_init(void)
5
{
6
  UBRRH = UBRR_VAL >> 8;
7
  UBRRL = UBRR_VAL & 0xFF;

von Cyblord -. (cyblord)


Lesenswert?

Stefan. L. schrieb:

> Sollte ich mich wiedermal irren, würde ich mich um eine Erklärung was in
> dem Beispiel mit den Registern eigentlich passiert freuen.

Soll ich dir den Text im Datenblatt dazu vorlesen?

UBRR ist ein 16 Bit Register, aufgeteilt in 2x8 Bit Register in dem die 
Baudrate eingestellt wird. Den Wert kann man berechnen oder in einer 
Tabelle im DB nachschlagen. Den schreibt man rein und fertig.

So stehts im DB, so stehts im Tutorial, aber natürlich wiederholen wir 
alles einfach nochmal.
Und jetzt Tanzen wirs vor?

gruß cyblord

von Toff (Gast)


Lesenswert?

Kann es sein, dass du den Konverter falsch angeschlossen hast? Auf dem 
Foto sieht es so aus, als wenn er eine Lochreihe zu weit rechts 
eingesteckt wurde.

von Stefan. L. (Gast)


Lesenswert?

Daniel C. schrieb:
> Da du ja die setbaud.h benutzt, schau sie dir doch einfach mal
> genauer
> an. Da ist am Anfang ein Beispiel wie man die setbaud.h verwenden
> soll/kann

werd ich mir bei Gelegenheit gleichmal ansehen, danke^^.



cyblord ---- schrieb:
> Hauptsache erstmal per Copy&Paste den Code reinklatschen, nix
> denken und
> dann wenns nicht geht umgehend einen Thread eröffnen. Sauber.
>
> Wie soll ein #define alleine die Baudrate setzen?
>
> In jedem Beispiel zu UART sieht man wie der UBRR Register gesetzt wird.
> Im Datenblatt hats Beispielcode dazu. Einfach mal das scheiß DB lesen.
> Das wär mal was oder?

Sorry aber ich bin eben noch ein Anfänger was Microcontroller angeht. 
Somit wusste ich nich das dieses define nicht ausreicht^^..

Und wenn dich so ein Thread nervt bzw. anscheinend etwas agressiv macht, 
dann ignorier ihn doch einfach oder Box in nen Sandsack oder was auch 
immer. Aber eine solche Formulierung ist einfach unhöflich und unnötig.
Hätte ich die genaue Funktion der beiden Register verstanden hätte ich 
wohl kaum diesen Thread eröffnet ;)

von Stefan. L. (Gast)


Lesenswert?

Toff schrieb:
> Kann es sein, dass du den Konverter falsch angeschlossen hast? Auf
> dem
> Foto sieht es so aus, als wenn er eine Lochreihe zu weit rechts
> eingesteckt wurde.

Jup scheint am photo passiert zu sein .. hatte ihn davor jedoch richtig 
drinnen.. Hab das ganze nur an einen andren Platz umgesteckt damit die 
andren aufbauten nicht für Verwirrung auf dem Foto sorgen..

von Stefan. L. (Gast)


Lesenswert?

> Warum musst du überlegen? Das Ausrechnen macht doch der Compiler für
> dich:// Berechnungen
> #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
>
> void uart_init(void)
> {
>   UBRRH = UBRR_VAL >> 8;
>   UBRRL = UBRR_VAL & 0xFF;

ohjaa... Sorry hatte da gerade nen dummen Denkfehler :s .... Danke auf 
jeden Fall für die Hilfe


So ein Danke an alle welche produktive Hilfe geleistet haben, Sobald ich 
wieder die möglichkeit dazu habe werde ich es gleichmal testen :)

von Cyblord -. (cyblord)


Lesenswert?

Stefan. L. schrieb:
> Und wenn dich so ein Thread nervt bzw. anscheinend etwas agressiv macht,
> dann ignorier ihn doch einfach oder Box in nen Sandsack oder was auch
> immer. Aber eine solche Formulierung ist einfach unhöflich und unnötig.

Unnötig auf jeden Fall. Du scheinst massiv resistent gegen Beratung zu 
sein. Unhöflich ist im übrigen auch das hochladen von Code als Bild.

> Hätte ich die genaue Funktion der beiden Register verstanden hätte ich
> wohl kaum diesen Thread eröffnet ;)
Hättest du ins DB geguckt, hättest du Funktion der Register dort 
nachlesen können und vielleicht hättest du sie dann verstanden. Wer 
weiß. Aber Copy&Paste und im Forum fragen ist viel einfacher gell? Wozu 
soll man sich auch selber die Mühe machen. Versteh ich.

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.