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
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.
Läuft dein Controller auch wirklich mit 1MHz? Hast du einen Quarz dran? Sascha
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.
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 ....
>Höchstwahrscheinlich sendet dein uC mit 19200B.
Nö, aber mit 7% Fehler. Fehler vom RC-Osc kommt noch dazu.
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.
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
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.
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
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.
> 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.
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
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
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
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).
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.