Hallo,
1.)kann mir bitte jemand erklären was Parity, 9Bit, und die stop bits
bedeuten, und wann sie eingesetzt werden?
2.)In meinen Terminalprogrammen kann ich nirgends 9bit einstellen. Ich
würde gerne 16Byts hintereinander vom Atmega8 empfangen, wobei der erste
Byte aus synchronisationsgründen den 9.bit als 1 liefern sollte.
Oder macht man das irgendwie anders?
Danke
Zoltan
Da muss man irgendwie den Parity bit, als 9.bit nutzen. Wie ich das im
mikrocontroller machen könnte kann ich mir vorstellen, aber wie
konfiguriere ich den PC?
Hallo,
>1.)kann mir bitte jemand erklären was Parity, 9Bit, und >die stop bits bedeuten,
und wann sie eingesetzt werden?
Das Parity-Bit ist eine "Quersumme" über die 8 Datenbits.
Also, ungerade Anzahl von "1" = Parity gesetzt, gerade Anzahl von "1",
Parity nicht gesetzt.
Da man sich damals wohl nicht so ganz sicher war flexibel genug zu sein
gibt es eben die beiden Parity "even/odd".
Bei "odd" wie oben beschrieben, Einstellung "even" dreht alles um (Es
kann auch sein das es genau anders herum ist, merken konnte ich es mir
nie).
Das 9.Bit kann bei einigen Mikrocontroller oder UART Bausteinen seperat
programmiert werden. Beim 8515 ist zum Beispiel kein Parity-Bit
vorhanden, wohl aber ein programmierbares 9.Bit. Das kann dann als
Parity-Bit benutzt werden. Es gab auch mal ein Protokoll mit 9 Bit
Daten, das 9.Bit hat ein Steuertelegramm gekennzeichnet.
Die Stopp-Bits kennzeichnen das Ende vom Sendebyte.
Der logische Pegel liegt fest. Es gibt Einstellungen mit 1, 1.5 oder 2
Stoppbits.
Zum Syncronisieren würde ich ein zeichen nehmen das im sonstigen
Telegramm nicht vorkommt.
Bei reiner ASCII Übertragung bietet sich <STX> zum Telegrammanfang und
<ETX> als Ende an. Diese Steuerzeichen liegen ausserhalb der
ASCII-Zeichen und lassen sich sicher erkennen.
Bei Binärdaten wirds schwieriger.
Dabei sind ja alle Bitkombinationen möglich und es muss das ganze
Telegramm mit Header-Informationen übertragen werden so daß sicher
Syncronisiert werden kann.
Bernd
Eine Prozessoren wie z.B. die neueren Mega's bieten in der UART-Sektion
die Möglichkeit neben Parity und 1 oder 2 Stop-Bits bis zu 9 Datenbits
zu übertragen. Der UART in einem handelsüblichen PC (16C550 bzw.
Kompatible hat diese Option nicht). Als Lösung des Problems bietet sich
entweder die Synchronisation über einen bewussten Fehler (z.B. Parity
oder Framing Error an) an. Hier ist allerdings die Programmierung eines
eigenen Device-Treibers auf PC-Seite erforderlich. Eine andere
Möglichkeit besteht darin, wenn man schon alle 8 Bit benötigt diese auf
7 Bit Blöcke zu verteilen und das 8. Bit zur Synchronisation zu
verwenden.
Danke für die Antworten!
@Berndt
warum gibt es 1, 1,5 oder 2 Stoppbits?
Ich werde am besten z.B. drei Bytes als Synkronisations-Bytes senden,
und die Sache mit dem 9. Bit vergessen. Den AVR zu programmieren ist ja
"kein Problem" aber was ich mit dem PC machen muss, das geht etwas zu
weit. Und nur 7 Bit sind leider nicht zu gebrauchen.
Kennt ihr vieleicht proffesionellere Terminalprogramme, in dennen mann
auch 2Byte als dezimalzahl ausgeben kann(0..65535). Mit den Werten bis
255 kann ich nichts anfangen, da ich 16 Bit grosse Zahlen übertragen und
darstellen möchte.
@Zoltan
Warum wandelst du die 16 Bit Zahlen nicht gleich auf ATMEL Seite in
entsprechende ASCII Darstellung um. Ist doch wesentlich einfacher und
erspart dir die Erstellung eines entsprechden Programms für deinen PC.
Ich würde die zu übermittelnden Zahlenwerte in Hexstrings umwandeln und
so (als String) übertragen. Dann kannst du jedes Telegramm mit einem
Startzeichen (STX = 0x02) versehen.
Also um Beispielsweise die Zahl 1000(Dezimal) zu übertragen müsstest du
die 1000 als Hex 03e8 übertragen, mit führenden Startzeichen ergibt sich
dann
<STX>03e8
Nach Wunsch kannst du am Schluss auch noch ein ETX (0x03) anhängen.
Gruss
Christian
@bernd
die Sache mit den Stopbíts (>1) hat eher historische Gründe, sollte der
empfangenden Station mehr Zeit geben, entsprechende Aktionen
auszuführen. Die Netto-Datenrate wird dabei niedriger. Ich kenne keine
Anwendung, bei der heute noch mehr als 1 Stopbit verwendet wird.
Erstmal danke für die Tipps!
@mikki
Ich teile den 16Bit(z.B. 1000) Wert im AVR und sende sie dann als zwei
8Bit Werte an den PC. Da muss ich sie aber auch wieder als 1000
angezeigt bekommen un nicht als 0x03 und 0xE8 oder 3 und 232.
L=mein_wert; // 16bit into 2x 8bit
mein_wert>>=8;
H=mein_wert;
uart_send(L); //Wert1 ->PC_1
uart_send(H); //Wert1 ->PC_2
Ich habe meinen Bruder überreden können einen, noch nicht ferigen,
Programm zu schreiben, um diese Werte von oben wieder im PC zusammen
fügen zu können. So kann ich jetzt 8, 16, 24, 32Bit Werte als dez
Darstellen. Siehe Anhang. Dann hat der AVR weniger zu tun und muss keine
Startzeichen übertragen. Wäre auch unfair gegenüber den kleinen MC, wenn
hier ein 1000 Euro PC nur so rumsteht, und die ganze Arbeit der AVR
machen muss..
>@Bernd>warum gibt es 1, 1,5 oder 2 Stoppbits?
die 1.5 Stppbits kommen aus der Fernschreibtechnik.
Damals wurde mechnisch das Ende erkannt und 1.5 Stoppbits
waren wohl einfacher festzustellen.
Bernd