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
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.
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
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
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.
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.
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
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.
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.
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.
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.
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.
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