Protokoll für serielle Übertragung, Bit 9?

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From German to

Threaded View
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
http://www.wiki.elektronik-projekt.de/w/index.php/RS485_Bus 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


Re: Protokoll für serielle Übertragung, Bit 9?

Quoted text here. Click to load it
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

Re: Protokoll für serielle Übertragung, Bit 9?
Quoted text here. Click to load it

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

Re: Protokoll für serielle Übertragung, Bit 9?
Frank Buss schrieb:
Quoted text here. Click to load it
StoppBit?
Quoted text here. Click to load it

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

Re: Protokoll für serielle Übertragung, Bit 9?
Moni,

Quoted text here. Click to load it

Sicher kann der.

Parity einschahlten und auf fixed stellen, dann wird das Odd/Even-Bit
zum Mark/Space-Bit.
Wichtig ist nur:
a) ParitE4%t erst E4%ndern wenn das Shift-Reg leer ist, nicht schon bei
Hold-empty.
b) Windoof ist zu blF6%d dazu.
Bei Detailfragen: Einfach mal den Blum lesen <http://www.google.de /
search?hl3D%de&q3D%%22Serial+Port%22+%22christian+blum
%22&btnG3D%Suche&meta3D%>.

        GruDF%, Ingo


Re: Protokoll für serielle Übertragung, Bit 9?

 On 27 Oct 07 at group /de/sci/electronics in article

Quoted text here. Click to load it

[...]
Quoted text here. Click to load it

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.
We've slightly trimmed the long signature. Click to see the full one.
Re: Protokoll für serielle Übertragung, Bit 9?
Hallo Sven!

Genauso mache ich das auch in einem Projekt wo ich 4 Module die
FC%ber einen RS485 Bus mit einem PC verbunden habe. Als controller
habe ich einen AVR eingesetzt der diese Adresserkennung FC%ber das
9 bit bereits hardwaremE4%DFig implementiert hat!

Bei bedarf kann ich den Code mal FC%bermitteln....

Viele GrFC%DFe

Artur


Re: Protokoll für serielle Übertragung, Bit 9?
Ich nochmal...

Wie schon beschrieben, verwende ich als Controller den AVR ATMega8
Dieser bietet die MF6%glichkeit das 1 Stopbit als Adresserkennungs-
bit Hardwareseitig zu konfigurieren. Wenn nun das "Adressbit"
erkannt wird, wird der Empfangsinterrupt angesprungen. Nun prFC%ft man
ob das mitgesendete byte die Adresse des Moduls ist und wenn ja, wird
die Adresserkennung ausgeschaltet und das Modul empfE4%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.... Der Vorteil ist das bei viel Verkehr auf dem RS485 Bus
die nicht adressierten Module nicht stE4%ndig die Daten auf dem Bus
analysieren mFC%ssen und ihre "Arbeit" normal durchfFC%hren kF6%nnen.
Die Pakete die ich FC%ber 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 zusE4%tzliche Steuerbits)
  1    Pakettyp
12E%.n   Je nach Pakettyp 1..24 Byte
  2    CRC16 PrFC%fsumme FC%ber 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 beschrE4%nken.

Auf der PS-Seite habe ich ein kleines .net Programm in VB2003
geschrieben das FC%ber einen USB-RS485 Modul (mit FT232) mit den
Modulen kommuniziert. FC%ber die Treiber von der FT- Webseite
kann man dann gezielt das erste Stopbit bei der DC%bertragung
setzen oder lF6%schen....

Artur






Re: Protokoll für serielle Übertragung, Bit 9?
Quoted text here. Click to load it

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.

Quoted text here. Click to load it

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

Gruß

Stefan DF9BI


Re: Protokoll für serielle Übertragung, Bit 9?

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



Re: Protokoll für serielle Übertragung, Bit 9?
Quoted text here. Click to load it

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

Re: Protokoll für serielle Übertragung, Bit 9?
Quoted text here. Click to load it

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


Re: Protokoll für serielle Übertragung, Bit 9?
Quoted text here. Click to load it

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.







Quoted text here. Click to load it

Re: Protokoll für serielle Übertragung, Bit 9?
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

Re: Protokoll für serielle Übertragung, Bit 9?
Quoted text here. Click to load it
Bit Stopbit
Quoted text here. Click to load it

Ja, jetzt habe ich es endlich begriffen.

Danke.

Sven


Re: Protokoll für serielle Übertragung, Bit 9?
Hallo Stefan,

anbei nochmal einen Schnipsel aus meinem Empfangs Code
Hier werden immer Frames mit einer festen LE4%nge (8 Byte)
empfangen:



typedef union
{  uint8_t Byte[8];

   struct
   {  uint8_t Adresse;
      uint8_t Befehl;
      uint32_t Daten;
      uint16_t CRC16;
   };
} RecFrameT;

typedef struct
{  uint8_t Befehl;
   Long Daten;
} RecDataT;

typedef union
{  uint8_t Byte[29]; // 21
   uint8_t Info;
   uint16_t Analog[2];
   uint16_t Word;
   CounterDataT Counter;
} SndDataCollectionT;

typedef struct
{  uint8_t Typ;
   SndDataCollectionT Daten;
} SndDataT;

volatile RecDataT RecDaten;    // Speicher fFC%r den vom Master
                           // empfangenen Befehl
volatile SndDataT SndDaten; // Speciher fFC%r die zu sendenen
                            // Daten

// RS485 Interrupt
SIGNAL(SIG_UART_RECV)
{ uint8_t b;
  static uint16_t crc, RecCRC;
  static uint8_t FrmByteCnt3D%0;
  static RecFrameT Frame;

  b 3D% UDR;    // Empfangenes Byte speichern

  // PrFC%fen ob das Adressflag gesetzt wurde
  if(RS485Timeout3D%3D0)
  {  if(b 3D%3D ModulID)
     {  UCSRA 3D% UCSRA & !(1<<MPCM); // ... Adresse ist richtig
        crc 3D% 0xFFFF;     // CRC16 startet mit 0xFFFF
        FrmByteCnt3D%0;
        RS485Timeout 3D% RS485TIMEOUT; // Timeout Timer starten
        sLED0; // Zeigen das eine gFC%ltige Adresse erkannt wurde
     } else
     {  UCSRA 3D% (1<<MPCM); // Adressenerkennung wieder einschalten
        goto RECVEND;    // ..., wenn nicht dann Empfangen beenden.
     }
  }

  // Ab jetzt die empfangenen Bytes im Framebuffer speichern...
  Frame.Byte[FrmByteCnt++] 3D% b;  // Byte im Array speichern...
  crc 3D% _crc16_update(crc, b);   // und CRC16-Summe berechnen
  if(FrmByteCnt<7) RecCRC3D%crc;

  // ...bis das letzte Byte empfangen wurde
  if(FrmByteCnt3D%3D8)
  {  // War die PrFC%fsumme korrekt?
     // (CRC16 mit sich selbst ergibt 0 :-)
     if(!crc)
     {  // An diesem Punkt wurde ein gFC%ltiger Frame empfangen
        // Den Befehl und die Daten nun speichern und das
        // Hauptprogramm informieren...
        if(Status!3D%BEREIT)
        {  LED0reset3D%200;
           // Antworten das spE4%ter nochmal angefragt werden
           // soll da das Modul beschE4%ftigt ist....
           SndDaten.Typ 3D% ERROR;
           SndDaten.Daten.Info 3D% BUSY;
           Status 3D% DATEN_SENDEN;
        } else
        {  // OK! Die Daten kF6%nnen verarbeitet werden...
           RecDaten.Befehl 3D% Frame.Befehl;
           RecDaten.Daten.Long 3D% Frame.Daten;
           Status 3D% DATEN;
        }
    } else
    {  cLED0; // LED0 ausschalten
       // Die PrFC%fsumme war falsch also "ERROR LED" fFC%r
       // 200ms einschalten
       sLED1;
       LED1reset3D%200; // 200ms on!
       SndDaten.Typ 3D% ERROR;
       SndDaten.Daten.Info 3D% ERROR_CRC16FAILURE;
       Status 3D% DATEN_SENDEN;
    }
    // Empfang von neuem Frame vorbereiten:
    RS485Timeout 3D% 0;
    UCSRA 3D% (1<<MPCM); // Adressenerkennung wieder einschalten
  }

  RECVEND:
  b3D%0; // Keep Compiler Happy :-)
}



Re: Protokoll für serielle Übertragung, Bit 9?
Hallo Svewn,

ich versuche das mal zu erklE4%ren: (Hier hilft FC%brigens auch das
Datenblatt
des ATmega 8 im Kapitel UART sehr gut weiter)

Quoted text here. Click to load it

Das ist soweit richtig!

Quoted text here. Click to load it

Wie du schon richtig vermutet hast wird fFC%r 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 zunE4%chst das Adressbyte mit
gesetztem 9. Datenbit
(also gesetztem 1. Stopbit) FC%bertragen. Der Controller lF6%st nun einen
Interrupt
aus und das empfangene Byte (also die ersten 8 Datenbits) werden auf
gFC%ltigkeit
FC%berprFC%ft. Wenn diese DC%berprFC%fung nun korrekt war wird die
Adresserkennung  ausgeschaltet
und alle nun ankommenden Bytes (egal ob das erste Stopbit gesetzt ist
oder nicht)
lF6%sen einen Receive Interrupt aus. Idealer weise sollten diese (ich
nenne sie mal
Datenbytes) aber das 1. Stopbit gelF6%scht haben um bei den nicht
adressierten Modulen
nicht stE4%ndig einen Interrupt auszulF6%sen.
Nach erfolgreichem empfang des Datenpakets und erfolgreicher CRC
PrFC%fung wird die
Adresserkennun dann wieder eingeschaltet und auf das nE4%chste
Adressbyte gewartet.
Das Erste Stopbit (oder neunte Datenbit) kann in den Controllern
einfach per Befehl
auf '1' oder '0' gesetzt werden.
Bei dem Standardtreiber fFC%r 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 GrFC%DFe,

Artur


Re: Protokoll für serielle Übertragung, Bit 9?
...
Quoted text here. Click to load it

die Antwort gesendet und dann die

Quoted text here. Click to load it


Gruß

Stefan DF9BI

Re: Protokoll für serielle Übertragung, Bit 9?

 On 28 Oct 07 at group /de/sci/electronics in article

Quoted text here. Click to load it

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.
We've slightly trimmed the long signature. Click to see the full one.
Re: Protokoll für serielle Übertragung, Bit 9?
snipped-for-privacy@brain.net (Wolfgang Allinger):

Quoted text here. Click to load it

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

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

M.
--
Bitte auf snipped-for-privacy@pentax.boerde.de antworten.

Site Timeline