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
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
Hi, und wenn ich eine bestimmte zeit den pegel auf low halten moechte? kann ich es dann direkt machen? gruss, thomas
@ 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?
hi setb C....oder clrC mov TB8,C MOV SBUF,A .....fuer 9bit uart mode 3 ed
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
@ 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
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
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
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.
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
etwas Gedankenmassage damit mehr Flexibilitaet an's Licht kommt!
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
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
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
@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
bist du auf genau diesen µC angewiesen doer darf es ein etwas anderer sein? schau mal ind datenblatt vom mega128
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.