www.mikrocontroller.net

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


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/...) 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

gruss,
        thomas

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: edi.edi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi

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

.....fuer 9bit uart  mode 3

ed

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: edi.edi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
rtfm
speziell     :  TB8

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: edi.edi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
etwas Gedankenmassage damit mehr Flexibilitaet an's Licht kommt!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens123 (Gast)
Datum:

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

schau mal ind datenblatt vom mega128

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.