Forum: Mikrocontroller und Digitale Elektronik Tücken mit RS232 Signalen


von dani (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

folgendes Problem: Wir haben zurzeit ein Programm das mit C# ein 
externes Gerät steuert, dies soll nun aber auch mit Bascom realisiert 
werden und es klappt einfach nicht so wie es sollte.

Ich arbeite übrigens mit dem d072 von Display3000 (hat nen atmega2561 
drauf).

Als meine Befehle das Gerät scheinbar nicht erreichten, habe ich mir die 
rauskommenden Signale mal unter die Lupe genommen und siehe da. Die 
Ausgangssignale vom C#-Programm und dem von Bascom sind zwar ähnlich 
aber nicht dieselbe. Wieso? Das frage ich nun euch, weil selbst komme 
ich einfach ned weiter, seit einem ganzen Tag sitze ich nun da drann.... 
ohne Ergebniss

Ich verwende bei beiden Programmen eine Baud-rate von 38400, 8 
Datenbits, ein stopBit und das parityBit odd.

Der einzige Unterschied von C# zu Bascom ist die art des verschickens. 
in C# habe ich ein byte-array verschickt und in bascom mit 3 serrout 
befehlen 3bytes nacheinnander.

Hier noch ein bisschen Coder der beiden Programme und das Ergebnis des 
LogicAnalizer Tests im Anhang.

C#
1
       
2
            byte[] send = new byte[4];
3
            send[0] = (byte)32;
4
            send[1] = (byte)01;
5
            send[2] = (byte)33;
6
            xdcam.Write(send, 0, 3);

Bascom
1
           Var1 = 32                                   'Play
2
           Var2 = 01
3
           Var3 = 33
4
           Serout Var1 , 1 , D , 3 , 38400 , 2 , 8 , 1
5
           Serout Var2 , 1 , D , 3 , 38400 , 2 , 8 , 1
6
           Serout Var3 , 1 , D , 3 , 38400 , 2 , 8 , 1

Ich danke euch schon einmal für eure Antworten die da hoffentlich kommen 
werden :)

Daniel

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Was bedeutet das:

, 1 , D , 3 , 38400 , 2 , 8 , 1

in Bascom?

Ich vermute, dass es teilweise Schnittstellenparameter sind (38400 
könnte Baudrate sein, 2 Stopbits? 8 Datenbits?).

Und wie ist Entsprechendes in dem C# Code realisiert? In deinem 
Codefetzen fehlt dieser wesentliche Teil.

ADD:

Mit deinem Trigger im LA komme ich ohne tiefes Eindenken nicht zurecht.

Aber kontrolliere mal, ob du in der C# Initialisierung das Paritätsbit 
abgeschaltet hast und im Bascom Code Parität angeschaltet hast.

Und ob du in C# auch zwei Stopbits hast oder nur eins.

von dani (Gast)


Lesenswert?

Hallo Stefan,

ja das sind SchnitstellenParameter:

1 = die erhaltene Byteanzahl
D = AusgangsPort
3 = Ausgangspin
38400 = Baudrate
2 = Parity Odd
8 = 8 Datenbits
1 = 1 StopBit

in C# ist das folgendermassen realisiert
1
            xdcam.BaudRate = 38400;
2
            xdcam.Parity = Parity.Odd;
3
            xdcam.ReadBufferSize = 12;
4
            xdcam.Open();
das wären alle Einstellung zum seriellen Port.

Gruss Dani

von dani (Gast)


Angehängte Dateien:

Lesenswert?

edit:
1
                Serout Var1 , 3 , D , 3 , 38400 , 2 , 8 , 1
2
                Serout Var2 , 0 , D , 3 , 38400 , 2 , 8 , 1
3
                Serout Var3 , 0 , D , 3 , 38400 , 2 , 8 , 1

Wenn ich die Befehle so verschicke werden sie im LA genau so angezeigt 
wie beim Versenden der Befehle über C# (jedenfalls die ersten 3 Bytes), 
nur kommmt danach ewigs Datenmüll.

Aber der Befehl funktioniert, anbei noch ein Bild des LogicAnalizers mit 
diesen 3 Serout Befehlen.

Wieso packt der noch so viel Datenmüll hinten an? (ist nur ein kleiner 
Ausschnitt, aber wielange das so weiter geht, könnt ihr ja am 
scrollbalken entnehmen

grüsse daniel

von Stefan B. (stefan) Benutzerseite


Lesenswert?

In dem C# Mitschnitt sind keine zwei Stopbits drin
1
LA-Signal
2
0011111101110101111111101011110110000
3
4
Invertiert (RS232)
5
1100000010001010000000010100001001111
6
7
Bitmuster 32 01 33
8
00100000 00000001 00100001
9
10
Bitmuster gedreht LSB first
11
00000100 10000000 10000100
12
13
Bitmuster gedreht und invertiert
14
11111011 01111111 01111111
15
16
Versuch Mustererkennung mit Invertiert (RS232)
17
1100000010001010000000010100001001111
18
   00000100 
19
              10000000        
20
                         10000100
21
  S          S          S                 Startbits
22
           P          P          P        Paritätbits
23
            s          s          s       Stopbits

PS2: Deine Sendebytes in DEZIMAL statt HEXADEZIMAL haben mich mindestens 
10 Min. gekostet ;-)

PS2: Der Mitschnitt von Bascom in Bild 1 ist länger, weil (laut 
Codefetzen, nicht auseinanderklamüsert) 2 Stopbits drin sind und 
zwischen den Frames eine kleine Pause ist. Die Pause ist nicht schlimm, 
weil sich die Gegenseite ja auf ein Startbit synchronisiert.

Die Pause kommt wahrscheinlich rein, weil die Sende-UART 
(Software-UART?) jedesmal neu initialisiert wird. In jedem Serout Befehl 
könnte Anwender ja die Schnittstellenparameter ändern.

Das zweite LA Bild ist mir zu konfus.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Sorry war immer noch auf dem 2 Stopbit Trip. 2 heisst ja welche Parität 
und nicht Zahl der Stopbits.

Aber schau mal in der Bascom-Doku nach, was serout macht, wenn im 
Befehl angegeben wird, dass 0 Bytes zu übertragen sind. Ist das 
überhaupt erlaubt bzw. sinnvoll? Eventuell werden da 256 Bytes oder 
65536 Bytes von irgendwo (ab adresse var2 bzw. var3) übertragen, wenn 
die Bascom interne Ausgabeschleife do ... while mässig läuft statt 
while... mässig.

von dani (Gast)


Lesenswert?

Du sagst es, das zweite Bild kapier ich auch nicht, aber das schlimme 
daran ist, das die Befehle, die das Bild produzuierten, funktionieren.

Deine Theorie mit den Pausen (ja es ist ein Software-UART) kann ich aber 
nicht ganz nachvollziehen, weil bei den Codezeilen bei meinem 2ten Post, 
da wo auch das konfuse Bild drinsteckt, keine Pausen entstehen, obwohl 
es immer noch 3 Seroutbefehle hintereinander sind.

Und aus meinem schlauen Büchlein (Bascom AVR Sprachbefehle) werde ich 
auch nicht schlauf über die Möglichkeiten des Serout Dinges, z. B.: was 
die einzelnen Parameter genau bewirken.

Ich bitte irgendeinen AVR-Bascom Experte dies kurz zu erläutern.
Speziell die Länge der Variable(2.Parameter und das mit den 
stopbits(immer stopbit oder nur zuletzt stopbit, wann 2, wieso 2 
usw.)(letzter parameter)

und @stefan: danke für die Zeit die du dir zum aufschlüsseln genommen 
hast, mich würde aber noch ein paar sachen zum sinn und zweck dieser 
übung interessieren.

- für was invertierst und drehst du die bitmuster?
- wie erkennst du die stopbits? ( deiner aufschlüsselung nach sind da
  immer 2 stopbits, ich habe aber nur eins angegeben, jedenfalls in 
Bascom.
  In C# musst ich das ned angeben)

Gruss
Daniel

von Peter D. (peda)


Lesenswert?

Die SW-UART ist ne absolute Krücke, die man nur anwenden sollte, wenn 
keine HW-UART im Chip ist.

Sie wird höchstwarscheinlich für das gesamte Senden alle Interrups 
sperren, damit sie per Delayloop das genaue Timing machen kann.
Man wird also wohl auf die Nase fallen, sobald man Interrupts benutzt.
Die Bascom-Hilfe sollte eigentlich genauer dazu Auskunft geben.


Ich verwende auch oft ne SW-UART auf den ATtiny, allerdings selbst 
programmiert (in C) mit Interrupts und daher Voll-Duplex.
Dazu muß man nen OC1x-Pin (TXD) bzw. den IPC-Pin (RXD) benutzen und der 
T1 wird benötigt.


Peter


P.S.:
Der Sinn, mit der SW-UART 0 Bytes zu senden, erschließt sich mir nicht.
Ich würde dann als Bascom auch verrückt spielen.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Effektiv sendest du mit

                Serout Var1 , 3 , D , 3 , 38400 , 2 , 8 , 1
                              ^
drei Bytes. Wahrscheinlich hast du in Bascom Var1, Var2 und Var3 
hintereinander angelegt und durch einen Bug bekommst du einen 
Bufferoverflow beim Zugriff auf Var1, der die folgenden beiden Bytes 
auch noch sendet. Zufällig die richtigen.

                Serout Var2 , 0 , D , 3 , 38400 , 2 , 8 , 1
                Serout Var3 , 0 , D , 3 , 38400 , 2 , 8 , 1
                              ^
Sollten nichts senden, da Anzahl 0. Wie geschrieben kann 0 ein 
dokumentiert oder undokumentiert illegaler Wert bei diesem Bascom Befehl 
sein. Ich kann mir von der Programmlogik ausmalen, wenn trotzdem Zeichen 
gesendet werden, was Bascom-intern da passiert

Das Handwerk dazu (invertieren, LSB first) lernt man bei RS232

Start und Stopbits müssen bei RS232 verwendet werden. Wieviele stopbits 
kannst du dir aussuchen.

In meiner Aufschlüsselung sind Startbits S, Stopbits s markiert. Nicht 
verwechseln.

Du sendest 3 Bytes also sind im gesamten LA Mitschrieb 3 Startbits drin.

Und drei Stopbits insgesamt, also 1 Stopbit pro Byte.

Ich hatte irrtümlich gemeint, im Bascom Code und Mitschrieb wären pro 
Byte 2 Stopbits. Ich hatte den C# LA-Mitschieb kontrolliert, ob ich die 
Datenbytes finde und die Stopbits.

Da war ich verwirrt von den mir unbekannten Bascom Codezeilen. Dein 
Auszug aus der Bascom-Doku macht klar, dass die Zeile auf 1 Stopbit 
einstellt und der LA-Mitschrieb passt wohl dazu.

In C# benutzt du die Defaultwerte, es ist besser, wenn man die setzt 
bzw. kennt.

von dani (Gast)


Lesenswert?

Ich danke dir für diese Ausführungen stefan. Ich werde wohl weiter 
bücher wälzen müssen...., imerhin habe ich das Gerät schonmal zum laufen 
gebracht.

@peter: wenn du der diskusion von anfang an gefolgt wärst hättest du 
wohl bemerkt, dass es mit der 0 ging, ohne nicht, wieso auch immer.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Schau dir mal die Zeiten an z.B. bei 200 us:
Die Bit-Timings sind deutlich unterschiedlich.
Der Versatz ist dort schon fast 1/2 Bit :-o

Wenns im oberen Bild klappt, wundert es mich nicht, dass es im unteren 
nicht klappt. Im unteren Bild (Bascom) kommt dazu, dass jedes Bit 
irgendwie ungleich lang ist.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

dani wrote:

> @peter: wenn du der diskusion von anfang an gefolgt wärst hättest du
> wohl bemerkt, dass es mit der 0 ging, ohne nicht, wieso auch immer.

Gemeint ist, dass mit dieser Art der Übertragung (per Software-UART) - 
je nach Implementierung - nicht mehr viel anderes geht.

Um das Timing der SW-UART einzuhalten, gibt es - bei ungeschickter 
Implementierung - den Weg die anderen Interrupts des µC zu beschränken.

Du würdest dann Probleme bekommen, wenn du neben dieser SW-UART 
gleichzeitig etwas anderes per Interrupt betreiben musst (Timer, 
Counter...).

Ob Bascom den ungeschickten Weg oder den geschickten Weg (wie bei Peters 
selbstgeschriebenen Routinen) genommen hat, sollten Versuche oder die 
Doku hergeben.

von dani (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe das gefühl, das mich heute jeder missversteht.

@lothar: im ersten funktionierts nicht, kann auch nicht, wieos hast du 
bereits mitgeteilt

im 2ten funktionierts, obwohl auch da das ganze um etwa 1bit verschoben 
ist.

Und im anhang nochmals ein bild, das erste von c#, das zweite nicht 
funktionierende von bascom und das letzte funktionierende von bascom.

über den software uart habe ich es deshalb gelöst, weil ich es über den 
hw-uart nicht geschafft habe und nein ich habe nicht nach 5min 
aufgegebn.

schöner abend zusammen

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
Noch kein Account? Hier anmelden.