serielle Schnittstelle ATMega8 | TeraTerm | falsche Zeichenübertragung

#4782877
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
Angehängte Dateien:
#4782895
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.
#4782910
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.
#4782912
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.
#4782926
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 :)
Gast #4783063
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.
#4783286
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
#4783752
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
#4784288
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
(Firma: Vescomp) #4784348
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).
#4784427
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.
#4785134
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

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