Forum: Mikrocontroller und Digitale Elektronik UART Atmega8


von Jason L. (loopdude)


Angehängte Dateien:

Lesenswert?

Hi Forum,
ich versuche gerade über UART von Atmega8 zu Atmega8 zu kommunizieren. 
Dabei habe ich TX vom Sender mit RX vom Empfänger verbunden. Eingestellt 
sind beide Chips auf internen 1MHz (kein Quarz). Im Code habe ich eine 
Baudrate von 2400 angegeben.
An beiden soll per Taster eine LED getoggelt werden. Doch getoggelt wird 
nur die LED am Sender.

Ich denke Hardwareseitig passt alles. Ist ein recht simpler Aufbau. 
Unsicher bin ich mir bei der Software. Ich habe mal beide c-Dateien 
beigefügt. Evtl erkennt jemand sofort den Fehler.

Danke im Voraus
Loopdude

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Jason Lnkk schrieb:
> Eingestellt sind beide Chips auf internen 1MHz (kein Quarz).

Keine gute Wahl.

> Unsicher bin ich mir bei der Software. Ich habe mal beide c-Dateien
> beigefügt. Evtl erkennt jemand sofort den Fehler.

Muss man sich erst mal ansehen...

von g457 (Gast)


Lesenswert?

> Dabei habe ich TX vom Sender mit RX vom Empfänger verbunden.

Gnd auch verbunden?

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

UCSRC = (1 << USBS) | (3 << UCSZ0);

Könnte eine Fehlerquelle sein.

Zitat aus dem Datenblatt:

"• Bit 7 – URSEL: Register Select
This bit selects between accessing the UCSRC or the UBRRH Register. It 
is read as one when reading UCSRC. The URSEL must be one when writing 
the UCSRC."

Hast du die FuseBits bei beiden Controllern gleich gesetzt?

von Walter S. (avatar)


Lesenswert?

Jason Lnkk schrieb:
> Eingestellt
> sind beide Chips auf internen 1MHz (kein Quarz).

die 1 MHz machen sowieso schon einen Fehler, zudem sind es dann keine 
1MHz und dass dann noch auf zwei verschiedenen Chips, gibt im Extremfall 
eine doppelt so große Abweichung:
wundert mich nicht dass es nicht geht

von Stefan E. (sternst)


Lesenswert?

Eine LED an einem Eingang lässt sich nur schwer toggeln.

von icke (Gast)


Lesenswert?

int release_conf1 = 0;

Das sind nur 8bit und auch noch signed. Also geht der Wertebereich von 
-128 bis +127
Und Du versucht 500 reinzuschreiben und gegen 2000 zu vergleichen.
Das kann nicht funktionieren!

von Karl H. (kbuchegg)


Lesenswert?

icke schrieb:
> int release_conf1 = 0;
>
> Das sind nur 8bit und auch noch signed.

Ho, ho, ho. Immer langsam mit den jungen Pferden.
Ein int hat 16 Bit.

von Jason L. (loopdude)


Lesenswert?

Danke schonmal für die Antworten.
Ich habe mir jetzt mal Quarze bestellt. Hoffe sie sind spätestens morgen 
da.

Was ist gemeint mit der Frage ob ich GND auch verbunden habe? Muss beim 
UART zusätzlich zum RX und TX etwas verkabelt werden? Ich dachte es 
langt wenn TX an RX angeschlossen ist um eine einseitige Verbindung 
herzustellen. Könnte jemand das genauer erklären?

Die Fuses sind bei beiden gleich gesetzt. Ich dachte wenn eine kleine 
Fehlerquote vorhanden ist werden nur nicht immer die Daten korrekt 
übertragen. Dachte zumindest ein paar "Pakete" würden korrekt ankommen.

int release_conf1 habe ich begrenzt, da sonst irgendwann ein Überlauf 
passiert.

von Karl H. (kbuchegg)


Lesenswert?

Jason Lnkk schrieb:
> Danke schonmal für die Antworten.
> Ich habe mir jetzt mal Quarze bestellt. Hoffe sie sind spätestens morgen
> da.
>
> Was ist gemeint mit der Frage ob ich GND auch verbunden habe? Muss beim
> UART zusätzlich zum RX und TX etwas verkabelt werden? Ich dachte es
> langt wenn TX an RX angeschlossen ist um eine einseitige Verbindung
> herzustellen. Könnte jemand das genauer erklären?

Ähm.
Wann immer du 2 Schaltungen miteinander verbindest (ok, es gibt 2 
Ausnahmen: Übertrager und Optokoppler), musst du slebstverständlich eine 
GND Verbindung herstellen.

Spannungen sind nur Potentialdifferenzen. Der Begriff +5V sagt nichts 
ausm, wenn du nicht dazusagst "5V in Bezug auf welches Potential!"

Und damit 2 Schaltungen eine gemeinsame Vorstellung davon haben, was 
denn jetzt eigentlich 0 sein soll, muss man klarerweise beiden einen 
gemeinsamen Bezugspunkt geben, sonst kommt da Blödsinn raus. Eine simple 
Verbindung der GND Leitungen leistet das zb. bereits.

von Jason L. (loopdude)


Lesenswert?

So ganz versteh ich das leider (evtl) nicht. Beide uC sind auf der 
selben Platine und am gleichen GND angeschlossen. Ist das damit gemeint, 
oder überseh ich einfach etwas? Muss ich bei der TX -> RX Verbindung in 
Bezug auf GND etwas beachten?

von Jason L. (loopdude)


Lesenswert?

Mal ein Update:
UART funktioniert jetzt. Auch ohne die Quarze. Es lag also am Code. Ich 
habe mir den Code aus dem Datenblatt rauskopiert und 1-2 kleine 
Veränderungen vorgenommen. Jetzt toggelt Chip1 eine LED an Chip2.
Den Code kann ich jetzt in meinen bestehenden Code integrieren um über 
UART per Taster verschiedene Sachen auszulösen.

Vielen Dank an alle die geholfen haben.

von Eumel (Gast)


Lesenswert?

Jason Lnkk schrieb:
> Auch ohne die Quarze

Na, dann hast du Glück gehabt.

von Jason L. (loopdude)


Lesenswert?

Die Quarze werde ich auf jeden Fall nutzen wenn ich sie habe. Ich bin 
nur froh, dass es funktioniert und ich mir über die Programmierung keine 
Gedanken mehr machen brauch.
Da das Ganze im Sommer im freien laufen soll, kann ich das Risiko bei 
Temperaturschwankungen nicht eingehen.

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.