ATmega8 - Usb Kommunikation Falsche zeichen?

Gast #3246880
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
Angehängte Dateien:
Gast #3246902
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?
#3246929
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?
Gast #3246935
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.
Moderator (Firma: Titel) Persönliche Seite #3246936
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;
#3246937
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
Gast #3246947
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 ;)
Gast #3246952
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..
Gast #3246959
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 :)
#3246960
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.

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