Protokoll für serielle Übertragung, Bit 9?

Hallo,

nachdem ich weiß wie ich drei Geräte an einen RS485-Bus angeschlossen bekomme hänge ich am Protokoll fest. Drei Geräte mit einer RS485-Schnittstelle sollen jeweils adressiert werden. Der Vorschlag in

formatting link
für den Aufbau des Protokolls macht einen völlig ausreichenden Eindruck.

In Wiki und im Usenet finde ich dazu Hinweise auf ein 9tes Bit, das nur im Adressfeld des Datagramms gesetzt wird.

"Für die Übertragung der Daten werden nicht wie üblich 8 sondern 9 Datenbits übertragen. Das neunte Datenbit signalisiert ob es sich bei den übrigen 8 Bit um eine Adresse oder um Daten handelt."

und

"9-Bit-Zeichen, wobei das höchstwertige Bit als Adreßkennung am Telegrammanfang verwendet wird. "

Das begreife ich nicht. Soweit ich das kenne wird maximal Start-, 8 Daten-, Stopp-, StoppBit gesendet. Wo soll denn da das 9te Bit sein? Das erste StoppBit?

Sven

Reply to
Sven Schulz
Loading thread data ...

StoppBit?

Man kann auch 9 Bits verwenden. Der übliche 8250 oder kompatible Baustein in PCs kann das allerdings nicht. Wenn dein System aber nicht zeitkritisch ist und du das in den angeschlossenen Geräten hinreichend genau messen kannst, dann definiere doch einfach, daß das erste 8-Bit Byte nach einer gewissen Pause die Adresse ist. Kannst du noch mit Checksumme garnieren, um Fehldetektionen und auch Übertragungsfehler zu vermeiden und bist dann relativ sicher.

--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Reply to
Frank Buss

Plan B: Parity einschalten, und vor der Übertragung des 9-Bit Wortes selbige passend auf Even/Odd konfigurieren. Mit FIFO ist es dann natürlich nix mehr, aber wir waren ja eben schon mal bei "nicht zeitkritisch".

Marcel

Reply to
Marcel Müller

StoppBit?

Oder dynamisch die Parität umdefinieren, mit Parity senden und am Empfänger ist die Anzahl der Stoppbits eh egal. Die stammen noch aus der Zeit des mechanischen Wagenrücklaufs bei Fernschreibern.

- Henry

Reply to
Henry

[...]

Kuck Dir mal 8051 uC an, die können das.

Wird dort auch einigermassen gut beschrieben. Nannte sich mal bytebus(?) bitbus(?) (oder so ähnlich). Mit 'nem 16550 UART im PC kriegt man das auch hin.

Die 8051 kann man sogar auf einen IR-Modus stellen, das sie nur auf die Addrframes anspringen aber die Datenframes ingorieren. Sehr elegant gelöst. Passt das Addrbyte, wird der Datebyte IR scharf gemacht und es geht nix verloren...

Saludos Wolfgang

--
Meine 7 Sinne:
Unsinn, Schwachsinn, Blödsinn, Wahnsinn, Stumpfsinn, Irrsinn, Lötzinn.
Wolfgang Allinger   Paraguay             reply Adresse gesetzt !
VoIP  02173 / 99 39 209   ca. 15h00..21h00 MEZ  SKYPE:wolfgang.allinger
Reply to
Wolfgang Allinger

Hallo Sven!

Genauso mache ich das auch in einem Projekt wo ich 4 Module die =FCber einen RS485 Bus mit einem PC verbunden habe. Als controller habe ich einen AVR eingesetzt der diese Adresserkennung =FCber das

9 bit bereits hardwarem=E4=DFig implementiert hat!

Bei bedarf kann ich den Code mal =FCbermitteln....

Viele Gr=FC=DFe

Artur

Reply to
Artur

Wie bereits in einer anderen Antwort beschrieben, wird diese Möglichkeit insbesondere bei 8031 Prozessoren vorgeschlagen. Dort gibt es auch die Möglichkeit, über das 9. Bit einen INT auszulösen um dann die Adresse zu kontrollieren und das folgende Telegramm bei Übereinstimmung zu lesen.

Der Vorteil ist, dass man nicht jedes Telegramm mitlesen muss.

Alternativ kann man (ich würde das auch so machen!!), die Telegramme an jedem Busteilnehmer komplett mitlesen.

Beispiel für den Telegrammaufbau:

1 Byte 02: Startzeichen 1 Byte n: Blocklänge 1 Byte ad1: ID des Senders 1 Byte ad2: ID des Empfängers n-3 Datenbytes 1 Byte: Checksumme

Summe aller Bytes eines Telegramms = 0 (8-Bit Addition)

alternativ kann man auch sicherere Checksum Algorithmen verwenden, z.B. CRC16.

Die Busteilnehmer empfangen die Daten dann in einer INT-Routine. Wichtig ist, dass auch die Telegramme vollständig mitgelesen werden, die für andere Busteilnehmer gedacht sind, damit eine saubere Synchronisation auf das Startzeichen erfolgen kann.

Wenn es ein Master Slave Netz mit nur einem Master ist, kann die Sender-ID entfallen.

Gruß

Stefan DF9BI

Reply to
Stefan Brörring

Ich nochmal...

Wie schon beschrieben, verwende ich als Controller den AVR ATMega8 Dieser bietet die M=F6glichkeit das 1 Stopbit als Adresserkennungs- bit Hardwareseitig zu konfigurieren. Wenn nun das "Adressbit" erkannt wird, wird der Empfangsinterrupt angesprungen. Nun pr=FCft man ob das mitgesendete byte die Adresse des Moduls ist und wenn ja, wird die Adresserkennung ausgeschaltet und das Modul empf=E4ngt die restlichen Bytes des Datenpakets. Die anderen Module am Bus sehen diese Bytes nun nicht weil sie immer noch auf eine richtige Adresse warten.... Der Vorteil ist das bei viel Verkehr auf dem RS485 Bus die nicht adressierten Module nicht st=E4ndig die Daten auf dem Bus analysieren m=FCssen und ihre "Arbeit" normal durchf=FChren k=F6nnen. Die Pakete die ich =FCber den BUS schicke sehen so aus:

Bytes Beschreibung 1 Adressbyte (Die meissten RS485 Treiber lassen maximal 32 BUS Teilenhmer zu (also 5 Bit Adresse) die oberen 3 Bit verwende ich als zus=E4tzliche Steuerbits) 1 Pakettyp

1=2E.n Je nach Pakettyp 1..24 Byte 2 CRC16 Pr=FCfsumme =FCber die gesamten, vorherigen Bytes

Wenn man nun im C-Code geschickt die empfangenen Bytes in Strukturen und Unions ablegt, kann man die Auswertung der empfangenen Bytes auf ein paar Codezeilen beschr=E4nken.

Auf der PS-Seite habe ich ein kleines .net Programm in VB2003 geschrieben das =FCber einen USB-RS485 Modul (mit FT232) mit den Modulen kommuniziert. =FCber die Treiber von der FT- Webseite kann man dann gezielt das erste Stopbit bei der =DCbertragung setzen oder l=F6schen....

Artur

Reply to
Artur

Das ist natürlich ein Argument. Kommt einfach drauf an, wie stark der Prozessor belastet ist. Ich hab mit 8031 sowas auch schon mal gemacht. Inzwischen mache ich das aber so, dass alle Slaves jedes Paket auswählen.

Statt Paket-Typ würde ich die Länge des Datenpaketes senden

Gruß

Stefan DF9BI

Reply to
Stefan Brörring

"Artur" schrieb im Newsbeitrag news: snipped-for-privacy@k79g2000hse.googlegroups.com...

Wie schon beschrieben, verwende ich als Controller den AVR ATMega8 Dieser bietet die Möglichkeit das 1 Stopbit als Adresserkennungs- bit Hardwareseitig zu konfigurieren. Wenn nun das "Adressbit" erkannt wird, wird der Empfangsinterrupt angesprungen. Nun prüft man ob das mitgesendete byte die Adresse des Moduls ist und wenn ja, wird die Adresserkennung ausgeschaltet und das Modul empfängt die restlichen Bytes des Datenpakets. Die anderen Module am Bus sehen diese Bytes nun nicht weil sie immer noch auf eine richtige Adresse warten....

Hallo Artur,

was passiert wenn ich alle Pakete so aufgebaut habe:

Starbit, 8mal Datenbit, Stopbit

Würden dann alle Pakete als Adressbyte erkannt werden, weil das erste Stopbit immer gesetzt ist? Oder habe ich einen Denkfehler.

Sven

Reply to
Sven Schulz

Die Bus-Terminatoren sind immer noch eine Begrenzung, auch bei neumodischen Treibern mit höherer Eingangsimpedanz.

Man kann aber auch die IMHO geniale Idee des p-net machen. Dort werden mit Standard! Treibern 256 Teilnehmer getrieben (das ADDR Byte ist da dann voll).

Beim p-net gibt es keine physikalischen Bussabschlusswiderstände! Der geniale Trick: RX und TX Bus werden als Ringleitung betrieben. Also gibbet kein Anfang und kein Ende, was abgeschlossen werden muss. Völlig egal wie lang die hinlaufende Welle links- und rechtsrum braucht, sie trifft sich bei 180°elektrisch, das 'Ende' ist schon geladen, kein Impedanzsprung, keine Reflektion, keine Verluste im Abschluss... Alle sind zufrieden. Der Bus muss nur noch die Eingangswiderstände der Teilnehmer

Das p-net wird heftigst in der dänischen Fischereiflotte benutzt.

Saludos Wolfgang

--
Meine 7 Sinne:
Unsinn, Schwachsinn, Blödsinn, Wahnsinn, Stumpfsinn, Irrsinn, Lötzinn.
Wolfgang Allinger   Paraguay             reply Adresse gesetzt !
VoIP  02173 / 99 39 209   ca. 15h00..21h00 MEZ  SKYPE:wolfgang.allinger
Reply to
Wolfgang Allinger

Ich antworte mal...

Ich denke, du hast da wirklich einen Denkfehler.

Du sendest zuerst das Adressbyte mit gesetztem 9. Bit. Das löst bei deinem ATmega einen INT aus alle ATMegas am Bus vergleichen dann das gelesenen Byte mit der eigenen ID wenn diese übereinstimmt, schaltest du die Betriebsart des UART um, so dass alle folgenden Bytes gelesen werden.

Dann wertest du das Telegramm aus, sendest deine Antwort und schaltest in den Modus um, in dem der ATmega auf ein gesetztes Bit 9 wartet

Wenn es nicht übereinstimmt, dann nicht. Dadurch werden die folgenden Bytes verworfen

Gruß

Stefan DF9BI

Reply to
Stefan Brröring

in

Sicher kann der.

Parity einschahlten und auf fixed stellen, dann wird das Odd/Even-Bit zum Mark/Space-Bit. Wichtig ist nur: a) Parit=E4t erst =E4ndern wenn das Shift-Reg leer ist, nicht schon bei Hold-empty. b) Windoof ist zu bl=F6d dazu. Bei Detailfragen: Einfach mal den Blum lesen .

Gru=DF, Ingo

Reply to
Ingo Braune

"Stefan Brröring" schrieb im Newsbeitrag news:fg4a2u$p3k$ snipped-for-privacy@news1.ewetel.de...

Leider ist meine Frage noch nicht beantwortet. Ein Byte das seriell auf die Reise geht sieht so aus:

  1. Bit Startbit, (2.,3.,4.,5.,6.,7.,8.,9.) Datenbits, 10. Bit Stopbit, 11. Bit Stopbit

Wie bekomme ich aus einem solchen Standartformat denn das "gesetzte 9.Bit" heraus? Der Logik folgend, müßte das letzte Datenbit dafür hergenommen werden. Eventuell hilft mir eine kurze Beschreibung als Bitfolge(eins,null,null,eins . . .) weiter.

Sven

Reply to
Sven Schulz

Startbit Bit 0 Bit 1 Bit 2 Bit 3 Bit 4 Bit 5 Bit 6 Bit 7 Stopbit 1 / Parity-Bit / Bit 8 Stopbit 2

Das ist aber nur eine Möglichkeit. Du kannst dein Uart in verschiedenen Betriebsarten konfigurieren. Manche machen auch 5 Bit. Üblich sind auch

7 Bit + 2 Stopbit usw.

Du bekommst aus deinem Receive-Buffer UDR nur die Bits 0-7. Das Bit Nr.

8 steht dann irgendwo anders. Da musst du mal die Definition der SFRs durchsehen.

Aber du benötigst das aber Bit gar nicht:

Du konfigurierst deinen UART so, dass er bei gesetztem Bit 8 einen INT auslöst. Dann reagiert der Prozessor nur auf Adressbytes. Das liest du in der INT-Routine aus und entscheidest, ob du gemeint bist. Wenn ja, aktivierst du den normalen UART-INT und liest dort alle Zeichen unabhängig von Bit 8 bis zum Telegrammende aus.

Dabei musst du eventuell noch aufpassen, dass keine im UART gepufferten Zeichen verloren gehen. Oben schrieb ein anderer Poster, man müsste den Puffer komplett auslesen, bevor man die Betriebsart umschaltet.

Reply to
Stefan Brröring

Hier noch mal mit 0 und 1:

Startbit + Bit0 + Bit1 + ... Bit7 + Adressflag + Stopbit

11000000010 -> Startbit + 01H + Bit8=1 + StopBit -> Adresse 01H 10100000000 -> Startbit + 02H + Stopbit + Stopbit -> Datenbyte 02H ...

Gruß

Stefan DF9BI

Reply to
Stefan Brröring

Hallo Svewn,

ich versuche das mal zu erkl=E4ren: (Hier hilft =FCbrigens auch das Datenblatt des ATmega 8 im Kapitel UART sehr gut weiter)

. Bit Stopbit

Das ist soweit richtig!

men werden.

ins . . .)

Wie du schon richtig vermutet hast wird f=FCr das 9. Bit das erste Stopbit genutzt. Das ganze sieht dann so aus

Bitpos. Beschreibung 1 Startbit 2 1. Datenbit 3 2. Datenbit 4 ... 5 6 7 8 9 8. Datenbit

10 9. Datenbit 11 Stopbit

Wie Stefan schon geschrieben wird zun=E4chst das Adressbyte mit gesetztem 9. Datenbit (also gesetztem 1. Stopbit) =FCbertragen. Der Controller l=F6st nun einen Interrupt aus und das empfangene Byte (also die ersten 8 Datenbits) werden auf g=FCltigkeit =FCberpr=FCft. Wenn diese =DCberpr=FCfung nun korrekt war wird die Adresserkennung ausgeschaltet und alle nun ankommenden Bytes (egal ob das erste Stopbit gesetzt ist oder nicht) l=F6sen einen Receive Interrupt aus. Idealer weise sollten diese (ich nenne sie mal Datenbytes) aber das 1. Stopbit gel=F6scht haben um bei den nicht adressierten Modulen nicht st=E4ndig einen Interrupt auszul=F6sen. Nach erfolgreichem empfang des Datenpakets und erfolgreicher CRC Pr=FCfung wird die Adresserkennun dann wieder eingeschaltet und auf das n=E4chste Adressbyte gewartet. Das Erste Stopbit (oder neunte Datenbit) kann in den Controllern einfach per Befehl auf '1' oder '0' gesetzt werden. Bei dem Standardtreiber f=FCr die Serielle Schnittstelle unter Windows hatt ich da allerdings so einige Probleme und bin dan auf die Treiber von dem Chiphersteller gewechselt.

Wie schon geschrieben, sieh dir mal das Datenblatt des ATmega 8 an. dort ist das auch gut im Kapitel UART beschrieben....

Viele Gr=FC=DFe,

Artur

Reply to
Artur

snipped-for-privacy@brain.net (Wolfgang Allinger):

Ringnetz, so: RX(Baugruppe)TX---Kabel---RX(Baugruppe)TX---- usw. ?

Ist imho nicht so doll (bei Einzelausfall sind alle Teilnehmer tot.)

M.

--
Bitte auf mwnews2@pentax.boerde.de antworten.
Reply to
Matthias Weingart

Bei drei Teilnehmern aber überhaupt kein Problem. Ich betreibe sowas, aber mit TTY-Stromschleife, mit ca. 10 Teilnehmern und mehreren hunder Metern Leitung. Ist meiner Meinung nach auch softwaremäßig so ziemlich das einfachste was geht.

Gruß

Stefan DF9BI

Reply to
Stefan Brröring

Artur wrote: ...

die Antwort gesendet und dann die

Gruß

Stefan DF9BI

Reply to
Stefan Brröring

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.