Forum: Mikrocontroller und Digitale Elektronik serielle Schnittstelle ATMega8 | TeraTerm | falsche Zeichenübertragung


von Markus E. (opc)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche mich derzeit am Aufbau einer seriellen Verbindung von einem 
ATMega8 zum PC auf das Terminalprogramm TeraTerm über COM5 bei einer 
Baudrate von 9600, 2 Stop-Bits und 8 Datenbits (eingestellt im µC und 
Terminalprg.).

Anbei das C-Programm zum Senden eines Zeichens (als Test).
Der verwendete USB TTL Konverter: PL-2303HX

Worin könnte mein Fehler liegen, da falsche Zeichen übermittelt werden? 
(Anbei ein Screenshot von TeraTerm) da ich vom µC ein "a" sende, jedoch 
ein seltsames Zeichen in TT ausgegeben wird.

Danke für Lösungsvorschläge

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

Nimm lieber hterm, da könnte man versuchen die hex Codes zu 
interpretieren. Nein, ich schaue nicht nach was das für ein Zeichen ist.

Hast Du mal 1200, 4800 und 19200 Baud probiert?


Aber: Ohne Quarz kann die Taktfrequenz des µC stark genug daneben 
liegen, dass UART Kommunikation nicht mehr tut.

von Sascha W. (sascha-w)


Lesenswert?

Läuft dein Controller auch wirklich mit 1MHz? Hast du einen Quarz dran?

Sascha

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Markus E. schrieb:
> Worin könnte mein Fehler liegen, da falsche Zeichen übermittelt werden?
> (Anbei ein Screenshot von TeraTerm) da ich vom µC ein "a" sende, jedoch
> ein seltsames Zeichen in TT ausgegeben wird.

 Höchstwahrscheinlich sendet dein uC mit 19200B.

von Kostenminimierer (Gast)


Lesenswert?

Markus E. schrieb:
> Worin könnte mein Fehler liegen, da falsche Zeichen übermittelt werden?

Rx und Tx verwechselt?
Das kann bei USB/TTL Konvertern schon mal schiefgehen ....

von holger (Gast)


Lesenswert?

>Höchstwahrscheinlich sendet dein uC mit 19200B.

Nö, aber mit 7% Fehler. Fehler vom RC-Osc kommt noch dazu.

von Thomas E. (thomase)


Lesenswert?

Markus E. schrieb:
> Baudrate von 9600, 2 Stop-Bits und 8 Datenbits (eingestellt im µC und
> Terminalprg.).

Selbst mit einem Quarz wirst du mit deiner Einstellung keinen Erfolg 
haben. Die Baudrate liegt bei 1Mhz um 7% daneben. Stelle die 9K6 mit 
gesetztem U2X-Bit ein. Damit kommst du auf 0,2%. Damit sollte es gehen, 
solange der RC-Oszillator mitspielt.

Siehe Kapitel "Examples of Baud Rate Setting" im Datenblatt.

von Markus E. (opc)


Lesenswert?

Jim M. schrieb:
> Aber: Ohne Quarz kann die Taktfrequenz des µC stark genug daneben
> liegen, dass UART Kommunikation nicht mehr tut.

Habe nun ein 8Mhz Quarz drangehängt, nun funktioniert die Zeichenausgabe 
-selbst mit TeraTerm- einwandfrei.

Kostenminimierer schrieb:
> Rx und Tx verwechselt?
> Das kann bei USB/TTL Konvertern schon mal schiefgehen ....

Auch dem Tipp bin ich nachgegangen, habe testweise Rx und Tx vertauscht 
und bei Falschanschluss wird gar nichts übermittelt, also selbst das 
falsche Zeichen nicht.

Sascha W. schrieb:
> Läuft dein Controller auch wirklich mit 1MHz? Hast du einen Quarz
> dran?
>
> Sascha

Er lief mit den internen 1Mhz, hier lag wohl auch der Fehler... nun mit 
8Mhz externem Quarz funktioniert die Kommunikation.

holger schrieb:
>>Höchstwahrscheinlich sendet dein uC mit 19200B.
>
> Nö, aber mit 7% Fehler. Fehler vom RC-Osc kommt noch dazu.

Richtig, dies hatte ich nicht bedacht.

: Bearbeitet durch User
von Kostenminimierer (Gast)


Lesenswert?

Markus E. schrieb:
> Er lief mit den internen 1Mhz, hier lag wohl auch der Fehler... nun mit
> 8Mhz externem Quarz funktioniert die Kommunikation.

Schön dass du ein Feedback auf unsere Lösungsvorschläge bringst.
Muss mal gesagt werden da viele das nicht machen.

von Markus E. (opc)


Lesenswert?

Thomas E. schrieb:
> Markus E. schrieb:
>> Baudrate von 9600, 2 Stop-Bits und 8 Datenbits (eingestellt im µC und
>> Terminalprg.).
>
> Selbst mit einem Quarz wirst du mit deiner Einstellung keinen Erfolg
> haben. Die Baudrate liegt bei 1Mhz um 7% daneben. Stelle die 9K6 mit
> gesetztem U2X-Bit ein. Damit kommst du auf 0,2%. Damit sollte es gehen,
> solange der RC-Oszillator mitspielt.
>
> Siehe Kapitel "Examples of Baud Rate Setting" im Datenblatt.

Ich habe testweise den externen Quarz wieder abgezogen und auf internen 
1MHz Takt umgestellt und das U2X-Bit in UCSRA gesetzt um den Fehler auf 
0,2% zu minimieren, jedoch wird auch in dieser Einstellung ein falsches 
Zeichen ausgegeben (wenn auch ein anderes als mit nicht-gesetztem 
U2X-Bit)

Kostenminimierer schrieb:
> Schön dass du ein Feedback auf unsere Lösungsvorschläge bringst.
> Muss mal gesagt werden da viele das nicht machen.

Da es sich hier um ausschließlich konstruktive Lösungsvorschläge von 
euch handelte -was man auch sagen muss, hier nicht immer der Fall ist-, 
ist das für mich selbstverständlich. Danke für die Rückmeldung :)

: Bearbeitet durch User
von Kostenminimierer (Gast)


Lesenswert?

Markus E. schrieb:
> Da es sich hier um ausschließlich konstruktive Lösungsvorschläge von
> euch handelte

Irgendwie merken die Leute hier eben dass sich jemand nicht
ganz dumm anstellt .... das macht das Leben leichter.

von schlaubischlumpf (Gast)


Lesenswert?

> Irgendwie merken die Leute hier eben dass sich jemand nicht
> ganz dumm anstellt .... das macht das Leben leichter.

Noch schlauer wäre es natürlich gewesen, die Frequenz des
internen Oszillators zu messen, vor dem nächsten Schritt
damit Kommunikation zu betreiben.

von Sascha W. (sascha-w)


Lesenswert?

Markus E. schrieb:
> Ich habe testweise den externen Quarz wieder abgezogen und auf internen
> 1MHz Takt umgestellt und das U2X-Bit in UCSRA gesetzt um den Fehler auf
> 0,2% zu minimieren, jedoch wird auch in dieser Einstellung ein falsches
> Zeichen ausgegeben (wenn auch ein anderes als mit nicht-gesetztem
> U2X-Bit)
Auch wenn das mit int. Osz. keinen richtigen Sinn macht - mit gesetztem 
U2X stimmt natürlich die Formel zur Berechnung des Baudratenteilers 
nicht mehr, bzw. mit der verwendeten Formel ist die Baudrate 2x so groß 
->19200.

Sascha

von Markus E. (opc)


Lesenswert?

Sascha W. schrieb:
> Auch wenn das mit int. Osz. keinen richtigen Sinn macht - mit gesetztem
> U2X stimmt natürlich die Formel zur Berechnung des Baudratenteilers
> nicht mehr, bzw. mit der verwendeten Formel ist die Baudrate 2x so groß
> ->19200.
>
> Sascha


Habe das Setup auf Baudrate 19200 und int. Osz. testweise geändert und 
in TeraTerm und HTerm angepasst. Auch hier: falsche Zeichenübertragung.
Fazit: UART += Quarz


schlaubischlumpf schrieb:
>> Irgendwie merken die Leute hier eben dass sich jemand nicht
>> ganz dumm anstellt .... das macht das Leben leichter.
>
> Noch schlauer wäre es natürlich gewesen, die Frequenz des
> internen Oszillators zu messen, vor dem nächsten Schritt
> damit Kommunikation zu betreiben.


Ich könnte ein Oszi auftreiben, wenn du mir sagst wie ich die int. Osz. 
Frequenz messen kann? Gab es nicht eine Fuse die man setzen konnte damit 
die Osz.Frequenz an einem Port-Pin messbar ist?... hm...



Gruß
Markus

: Bearbeitet durch User
von Sascha W. (sascha-w)


Lesenswert?

Markus E. schrieb:
> Ich könnte ein Oszi auftreiben, wenn du mir sagst wie ich die int. Osz.
> Frequenz messen kann? Gab es nicht eine Fuse die man setzen konnte damit
> die Osz.Frequenz an einem Port-Pin messbar ist?... hm...
ja die FUSE gibts, aber nicht beim M8. Du kannst mit einem Timer aber 
einen OC-Pin toggeln lassen - so bekommst du auch die Frequenz raus.

Sascha

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Markus E. schrieb:
> Habe das Setup auf Baudrate 19200 und int. Osz. testweise geändert und
> in TeraTerm und HTerm angepasst. Auch hier: falsche Zeichenübertragung.
> Fazit: UART += Quarz

 Fazit: möglich, aber unwahrscheinlich.

 Damit der PC überhaupt so etwas empfängt, bzw. anzeigt, muss der
 uC schneller senden als beim PC eingestellt.
 a ist 0x61, LSB zuerst, damit der Stoppbit richtig erkannt wird,
 muss dieser spätestens bei 50% kommen (erste 1 nach 4 x Log.0).

 Und das ist bei doppelter Geschwindigkeit (19200B anstatt 9600B) auch
 der Fall, nicht aber bei achtfacher Geschwindigkeit (1MHz - 8MHz),
 weil dann schon der bit 7 mit Log.0 kommt und das wird mit Sicherheit
 nicht als Stoppbit erkannt.

 Fazit: Nur bei 1Mhz + U2X = möglich, sonst nicht.

 Ich bleibe aber bei:
Marc V. schrieb:
> Höchstwahrscheinlich sendet dein uC mit 19200B.

 P.S.
 Weil so etwas normalerweise auch mit internem Quarz ohne Probleme
 funktioniert (natürlich nicht bei -5 oder +50 Grad).

von Markus E. (opc)


Lesenswert?

Sascha W. schrieb:
> ja die FUSE gibts, aber nicht beim M8. Du kannst mit einem Timer aber
> einen OC-Pin toggeln lassen - so bekommst du auch die Frequenz raus.
>
> Sascha

Werde ich die Tage mal messen sobald ich das Oszi da habe.

Marc V. schrieb:

>
>  Damit der PC überhaupt so etwas empfängt, bzw. anzeigt, muss der
>  uC schneller senden als beim PC eingestellt.
>  a ist 0x61, LSB zuerst, damit der Stoppbit richtig erkannt wird,
>  muss dieser spätestens bei 50% kommen (erste 1 nach 4 x Log.0).
>
>  Und das ist bei doppelter Geschwindigkeit (19200B anstatt 9600B) auch
>  der Fall, nicht aber bei achtfacher Geschwindigkeit (1MHz - 8MHz),
>  weil dann schon der bit 7 mit Log.0 kommt und das wird mit Sicherheit
>  nicht als Stoppbit erkannt.
>
>  Fazit: Nur bei 1Mhz + U2X = möglich, sonst nicht.

Danke Marc V. für die Infos. In der Kombination int. Osz + U2X + 9200Bd 
bei einem Fehler von 0,2% funktioniert die Übertragung.

: Bearbeitet durch User
von Markus E. (opc)


Lesenswert?

Sascha W. schrieb:
> ja die FUSE gibts, aber nicht beim M8. Du kannst mit einem Timer aber
> einen OC-Pin toggeln lassen - so bekommst du auch die Frequenz raus.
>
> Sascha

Auch wenn das Thema eigentlich erledigt ist, da ich das Oszi gerade vor 
mir habe hier noch das Ergebnis der Frequenzmessung mit der Timerlösung 
an stabilisierten 5V und 22°C: F_CPU: 1,00285933MHz
also ca. 0,29% drüber.

Gruß
Markus

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Markus E. schrieb:
> an stabilisierten 5V und 22°C: F_CPU: 1,00285933MHz
> also ca. 0,29% drüber.

 Was ja auch in etwa dem Durchschnitt entspricht und normalerweise
 ein problemloses Funktionieren ermöglicht.
 Allerdings ist der Temperaturdrift wesentlich ausgeprägter als
 mit externem Quarz.

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.