Forum: Mikrocontroller und Digitale Elektronik 8051 UART 8bit und 9bit gleichzeitig


von Thomas (Gast)


Lesenswert?

Hi,

habe ein etwas schwieriges problem: ich moechte mit einem at89S53 am
uart gleichzeitig seriell mit 8 datenbits empfangen (1 stopbit) und mit
8+1=9 senden (1+1=2 stopbits).

ich komme daher nicht darum herum den uart auf 8 bits zu setzen und das
letzte stopbit beim senden irgendwie zu emulieren. daher folgende
frage:

kann ich, wenn ich den seriellen interrupt aktiviert habe, nach dem
senden eines bytes den txd manuell auf 'high' setzen. dann koennte
ich im sende interrupt den pin auf high setzen und mit einer nop
schleife mind. fuer die laenge eines bits warten. somit haette ich dann
also ein neuntes bit = stopbit.
moeglicherweise bleibt der pin nach dem senden eines bytes aber sowiso
schon auf high (muesste eigentlich). im atmel datenblatt
(http://www.atmel.com/dyn/resources/prod_documents/doc4316.pdf) ist das
im timingdiagramm auch so abgebildet. allerdings traue ich dem nicht so
ganz, weil ich dort u.a. das startbit vermisse. ich weiss daher nicht,
wie genau dieses diagramm ist. kennt sich da jemand genauer aus?
ausserdem benoetige ich ebenfalls manchmal eine laengere pause zur
synchronisierung (break), bei der der die serielle leitung auf 'low'
liegt. daher ist das direkt pin setzen in jedem fall erforderlich.

freue mich schon auf eure antworten.

Gruss,
         Thomas

von Peter D. (peda)


Lesenswert?

Du brauchst nichts auf High setzen, das ist doch der Ruhezustand.

Du must nur eine Bitzeit warten, bevor Du das nächste Byte sendest,
z.B. mit einer Warteschleife.


Peter

von Thomas (Gast)


Lesenswert?

Hi,

und wenn ich eine bestimmte zeit den pegel auf low halten moechte? kann
ich es dann direkt machen?

gruss,
        thomas

von Markus (Gast)


Lesenswert?

@ Thomas
Zur Erzeugung des Breaks kannst du einfach vor dem Senden die Bitrate
reduzieren und ein 0x00 ausgeben. Dann hast du auch eine längere
Low-Phase.
Wenn dann wieder Daten übertragen werden sollen einfach wieder die
Bitrate erhöhen.

Gruß
Markus

P.S.: Das hört sich irgendwie nach LIN an, kann das sein?

von edi.edi (Gast)


Lesenswert?

hi

setb C....oder clrC
mov TB8,C
MOV SBUF,A

.....fuer 9bit uart  mode 3

ed

von Thomas (Gast)


Lesenswert?

Hi,

@Markus
Bitrate reduzieren halte ich für gar nicht gut, weil dann ja start und
stopbit automatisch generiert werden -> der pegel ist nicht dauerhaft
auf low gehalten. Ausserdem erscheint mir das ziemlich umständlich.

@edi
hi, wie du wohl übersehen hast, bin ich auf einen 8bit modus
angewiesen.

Gruß,
       Thomas

von Markus (Gast)


Lesenswert?

@ Thomas
was macht es denn, daß ein Start- und ein Stopbit generiert wird? Ist
doch nicht so schlimm.
Das Startbit zieht den Pegel auf low. Da soll er ja sowieso hin.
Und das Stopbit zieht ihn wieder auf High. Auch da muß er irgendwann
wieder mal hin. Die Zeit, die dazwischen vergeht, also deine low-Phase,
kannst du einfach mit der Bitrate bestimmen.
So umständlich find ich das jetzt ehrlich gesagt nicht.
War halt so ne Idee.

Gruß
Markus

von Thomas (Gast)


Lesenswert?

Hi,

also wenns nicht anders geht, so ist das sicherlich ne Lösung. Ich
würde aber noch immer gern wissen, ob ich nicht einfach in den Pin
schreiben kann. Das wäre wirklich das Einfachste. Habe leider kein
Oszi, ums zu kontrollieren.

Gruß,
      Thomas

von Ralf (Gast)


Lesenswert?

Verzeihung, aber... Mal ganz abgesehen davon, dass ich nicht weiss, wo
so etwas nötig ist, warum setzt du den UART nicht einfach beim Senden
in den 9-Bit Modus, und dann wieder zurück? Oder habe ich etwas
wichtiges übersehen?

Das einzige, was daran kritisch werden könnte, ist wenn während des
Sendens ein Byte empfangen wird.

Falls ich jetzt was übersehen habe, bitte sagen bzw. Beitrag ignorieren
;-)

Gruß Ralf

von edi.edi (Gast)


Lesenswert?

rtfm
speziell     :  TB8

von Benedikt (Gast)


Lesenswert?

Was spricht dagegen den UART permanent im 9bit Modus zu lassen ?
Die Daten werden trotzdem empfangen und beim Senden passt es ja.

Oder so wie ich es mache:
Einen externen UART wie den 16C450 zum empfangen mit 8bit und der 8051
arbeitet immer mit 9bit.

von Thomas (Gast)


Lesenswert?

Hi,

@Ralf
also die Hardware existiert bereits und eine Änderung ist leider nicht
möglich. Es handelt sich dabei um das Senden von DMX und gleichzeitige
empfangen von Midi Daten.
Wenn ich den Uart jetzt in den 9bit Modus setze und dann was nach Sbuf
schicke, so sendet der korrekt. Allerdings könnte ich ihn erst am Ende
der Übertragung des Bytes wieder in 8bit zurück setzen, dort wird dann
aber schon das nächste Byte übertragen (bei DMX mit insgesamt
250kBaud). Sprich: Während der Übertragung von DMX wäre ein Empfang
eines Midi Bytes nicht möglich, sonder nur zwischen 2 gesendeten Bytes.
Dies führt somit leider auch nicht zum Ziel, da ein dauerhaft korrekter
Midi Empfang nicht sichergestellt ist.

@bene
Leider klappt das mit dem in 9bit Modus setzen und trotzdem Midi Daten
empfangen nicht. Das war bereits meine ursprungskonfiguration. Dabei
empfängt der Uart am dem zweiten Midi Byte nur noch Müll (so bin ich
überhaupt erst auf das Problem aufmerksam geworden).

@edi
Was hilft es mir in TB8 das neunte Bit zu schreiben, wenn der UART es
aufgrund des 8bit Modusses beim Senden ignoriert?

Gruß,
         Thomas

von edi.edi (Gast)


Lesenswert?

etwas Gedankenmassage damit mehr Flexibilitaet an's Licht kommt!

von Peter D. (peda)


Lesenswert?

Du liest Dir wohl nicht gerne Antworten durch ???

Also nochmal:

8-Bit Modus und beim Senden einfach eine Wartezeit von einer Bitlänge
einlegen und fertig ist das 2. Stopbit.


Peter

von Thomas (Gast)


Lesenswert?

Hi

@Peter
Sorry, da habe ich mich wohl etwas umstänlich ausgedrückt. Das mit dem
9. Stopbit werde ich so machen - ist wohl eine sehr sinnvolle Lösung.

Weshalb ich nochmal nachfrage ist, dass ich mir noch nicht im klaren
darüber war, wie ich das mit dem Break machen könnte.
Ich grüble gerade über die Lösung, die Markus vorgeschlagen hatte.
Diese ist vielleicht doch viel praktischer, als ich zuerst annahm. Ich
rechne gerade herum, wie ich die Timer setzen muss und wann ich den
Reload Wert des Timer2 ändern muss, damit er entsprechend passend
nachgeladen wird. Diese Lösung hat den Vorteil, dass ich mich nicht um
ein erneutest Starten der DMX Übertragung kümmern muss. Ich denke, dass
ich es so hinkriegen werde.
Falls das doch nicht klappt, so müsste ich nochmal das mit dem direkten
"in den port schreiben" probieren.

Danke an Euch alle für Eure Ideen.

Gruß,
      Thomas

von Jens123 (Gast)


Lesenswert?

hi
wieso gleichst du nicht die bytelaennge dem anderem an???

sprich jeweils 8 oder 9 bit daten??

ein bit laesst du dann eben auf 0, was du nicht brauchst

oder hab ich nu was falsch verstanden

von Thomas (Gast)


Lesenswert?

@Jens

DMX und Midi sind bereits fest definierte Protokolle, die man besser
nicht einfach selbst aendert. Dann hat man naemlich keine
kompatibilitaet mehr.

Gruss,
        Thomas

von Jens123 (Gast)


Lesenswert?

bist du auf genau diesen µC angewiesen doer darf es ein etwas anderer
sein?

schau mal ind datenblatt vom mega128

von Thomas (Gast)


Lesenswert?

Wie schon gesagt, die Hardware ist fest vorgegeben.
Habe allerdings heute mal daran herumprogrammiert und mit nem Oszi von
der Uni nachgemessen und muss sagen, dass das mit dem langsameren timer
prima klappt :)

Danke nochmal fuer Eure Hilfestellung.

Gruss,
      Thomas

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.