UART Problem:statt 'T' ein 'g'

Hallo zusammen,

ich versuche jetzt schon seit zwei Stunden die UART meines ATmega128 zum laufen zu bringen…sollte eigentlich nicht schwer sein - sollte man meinen.

Senden tut das Ding auch schon, nur leider das falsche :frowning:

Ich sende ein ‚T‘ und mein Terminal - Prog empfängt ein ‚g‘. Das Tool arbeitet aber richtig - habs mit dem Oszi kontrolliert.

An was könnte es liegen?

Bin für jeden Hinweis dankbar.

Gruss, Tobi

Hallo Tobi,

ich nehme an, da Du ein Oszi zur hilfe nimmst, dass

  1. der Ausgangs-Pegel korrekt invertiert ist und mindestens 0V/>3V beträgt.

  2. nur genau ein einzelnes Zeichen „T“ gesendet wird (und dann mindestens ein paar Bitzeiten nichts, also high aus dem Controller, low auf der PC-Leitung.

  3. Die Baudrate stimmt, also die Zeit zwischen Startbit (Wechsel von high nach low am Controller) und Stopp (letzter Wechsel von low nach high am Controller) korrekt ist.

Dann ist es leider für aussenstehende schwer, zu erkennen, was noch falsch sein könnte. Nur zum Verständnis: Am Controller-Ausgang misst Du

Ruhepegel 1
Startbit 0
bit 0 : 1
bit 1-6: 110011
bit 7: 0
Paritätsbit (welche?)
Stoppbit und danach Ruhepegel 1

Eventuell schaltest Du den Transmitter schon ab, wenn der Transmit-Register-Empty-Interrupt kommt. aber dass würde trotzdem nicht das muster erklären.

Gruß
achim

Hallo Tobi,

An was könnte es liegen?

Bin für jeden Hinweis dankbar.

Ich tippe auf halbe Baudrate des Senders:
Gesendet wird in der Reihenfolge:
StartBit, Bit0 … Bit7, (Parity), Stop

T = 01010101
g = 01100111

Gesendet wird also
1 (StartBit) 10101010 0 (Stop) = 1101010100

jetzte verdoppen wird jedes Bit:
11110011001100110000
und werten aus:
1 (StartBit) 11100110 0 (Stop) 1 (StartBit) 10011000 0 (Stop)
11100110 umdrehen 01100111 = 0x67 = g
10011000 umdrehen 00011001 = 0x19 = End od Medium wird nicht angezeigt

Versuche einmal den Wert 0xD5 zu senden, das müsste dann als „gy“ angezeigt werden.

MfG Peter(TOO)

Achim hat vollkomen recht!
Das ist schwierig zu beantworten. Ist leichter, wenn man kein UART hat sondern „zu Fuss“ die Ports bedient :wink:

Kenne das UART im ATmega126 nicht (immer nur low-Level-PIC programmiert, s.o.) aber ich vermute (hoffe) dass der UART die Verzögerung von der Startbitflanke bis zum Datenbit korrekt aus der Baudrate generiert.
Es sieht aber nach dem Bitmuster nicht unbedingt nach Pegelproblem aus… lässt sich aus dem UART sein aktueller Status (RX-Bit-Counter) auslesen? Damit man wenigstens weiss, wo der nach dem empfangenen Zeichen steht?
Gemein sind auch die Interrupte… versuch mal NUR die RX-Routine zu isolieren und keine Interrupts sonst zuzulassen!

Gruss

Michael

Hallo Peter,

Ich denke, wenn dann ist der Baudratenfaktor irgendwie nicht ganzzahlig. Bei Deiner Vermutung komme ich zu anderen ergebnissen

StartBit, Bit0 … Bit7, (Parity), Stop

korrekt

T = 01010101

?? m.E. T = 0x54, also 010101 00

g = 01100111

Gesendet wird also
1 (StartBit) 10101010 0 (Stop) = 1101010100

Das Startbit ist m.E. 0 wenn man den nicht invertierten Datenstrom am Controller betrachtet. Also auf jeden FAll anders als das erste (high) bit im Datenstrom.

Durch die beiden Unterschiede (Startbit-Pegel und Wert für T) passt Dein Ansatz m.E. nicht ganz.

Gruß
achim

P.S. an den Ausgangsposter: Daher auch am Besten immer erst nur ein Zeichen Senden (am Besten 0x32 oder sowas), damit die Baudrate, die Bitanzahl und die Anzahl der Bits als erstes und genau ausgemessen werden kann