PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Senden & Empfangen via VB Programm "Auswertung"



Thomas Glas
06.04.2011, 12:04
Hallo Community, ich habe so ziehmlich alles mögliche gelesen im Netz zu uart etc.
Ich muss leider gestehen das dass meine Kompentenz übersteigt!

Es geht darum eine Schnittstelle zwischen meinem Flugsimulator und dem Mega16 zu schaffen. Das Problem ist das ich viele Dinge abfrage und zum Mega16 senden möchte. Fahrwerk, Triebwerk, Controllampen etc. Ich bräuchte aber erstmal einen Ansatz wie ich eine Variable mit Inhalt an Bascom sende und diese auswerte.

VB Programm sendet:
Fahrwerk = "1" (Fahrwerk ist ausgefahren)
oder
Fahrwerk = "0" (Fahrwerk ist eingefahren)

Atmega16 empfängt:
"Fahrwerk=1"

Atmega16 schaltet
Led1 = "1"

Ich muss also eine Variable -> Name = "Fahrwerk" und dem Wert = "1" übertragen


Nun müsste ich das Auswerten aber hier die Frage wie?
Bascom muss ja erkennen das der Wert 1 nichtnur 1 ist sondern auch zum Fahrwerk gehört. Später möchte ich viele Daten (50Var's+Wert im 100ms Takt an den Mega 16 senden) damit übertragen. Da müssen die Flugsimulatorwerte ja zugeordnet werden können.


Aktuell habe ich ein kleines VB Programm mit einem Eingabefeld wo ich etwas reinschreiben kann. das Sende ich dann an meinem Atmega16 der darauf promt antwortet(aus der Hilfe v. Bascom). Ich bekomme dann z.B. die Ausgabe "ASCII code 49 from serial"

Das bedeutet das ich in das Eingabefeld eine "1" eingetippt habe,... mehr habe ich nicht hinbekommen ;/ Register, bites und bytes ich bin absolut überfordert. Auch die Hilfe @ input, Print und mehr überfordert mich gerade total. Ich benötige eine Art Beispiel da ich überhaupt keinen Bezugspunkt habe was ich wie machen soll. Die Tutorials die Empfohlen werden setzten C vorraus oder Grundkenntnisse. Bei Bascom komme ich klar Taster drücken und led einschalten,... aber einen Wert senden und auswerten ,... :(

Ich nutze aktuell
Atmega16 1Mhz "Standart takt Quarz mit 16Mhz noch nicht verbaut da ich ja noch teste."
Usb Konerter auf Serial
Max232

Erstmal um einen Einblick zu bekommen würde es mir helfen wie sende ich in VB Fahrwerk = 1 über Serial an Bascom und wie werte ich das in Basom aus um z.B.
eine Led einzuschalten?



EDIT:
Mir fällt gerade PHP ein dort wird ein Array z.B. erstellt ... vielleicht geht das hier auch so?!

$simulator = array(
"Fahwerk" => "1",
"Triebwerk" => "1",
"Power" => "1",
"Warning" => "0",
"Flaps" => "0",
"Fuel" => "123",
"Fire" => "0");



Ich wäre für Hilfe sehr sehr dankbar.
Gruß Tom

BastelWastel
06.04.2011, 12:48
Hi, an deiner stelle wuerde ich Fahrwerk, Triebwerk etc garnicht als Klartext mit senden..
Wenn du eh immer den selben Datensatz hast wuerde ich nur dessen Werte in einer fix definierten Form als ein Frame senden.
(fixe laenge oder ";, etc"separiert)
Im uC brauchst du einen Buffer in den du jedes ankommende Byte schreibst bis du z.b. ein von dir definiertes End-Byte enpfaengst..dann kannst du den buffer auslesen/werten.
Beispiele sollten sich dafuer genug finden lassen.

Gruss BastelWastel

Thomas Glas
06.04.2011, 13:22
Hmm irgendwie habe ich da nur halb verstanden.

Da heisst das es immer das selbe eigentlich ist könnte ich ne kombo senden.


1; 2222; 322; 3330; 44441; 20; 555553; 455555; 5; 639

In Bascom muss dann nurnoch das Feld erkannt und ausgeweretet werden ???

z.B.
Feld drei siehe oben weisst die Zahl/Wert 322 auf

IF FELD3 = 1 THEN
gelbe led an
if Feld 3 = 322 THEN
rote led an
ELSE
grüne led an
ENDIF

Habe ich das so richtig verstanden ?
Gruß Tom

DanielSan
06.04.2011, 15:39
Hi,

in welchem Bereich liegen denn deinen einzelnen Werte? Denn wenn sie über 256 groß sind, musst du ggf. 2 oder mehr Bytes zusammen setzen.

Deine Felder sind die einzelnen Bytes. Das hast du oben schon richtig gemacht. Die Zahl 322 kannst du allerdings nicht in einem Byte darstellen.

Gruß Daniel

BastelWastel
06.04.2011, 15:59
Hmm irgendwie habe ich da nur halb verstanden.

Da heisst das es immer das selbe eigentlich ist könnte ich ne kombo senden.


1; 2222; 322; 3330; 44441; 20; 555553; 455555; 5; 639

In Bascom muss dann nurnoch das Feld erkannt und ausgeweretet werden ???

z.B.
Feld drei siehe oben weisst die Zahl/Wert 322 auf

IF FELD3 = 1 THEN
gelbe led an
if Feld 3 = 322 THEN
rote led an
ELSE
grüne led an
ENDIF

Habe ich das so richtig verstanden ?
Gruß Tom

Jein..

1; 2222; 322; 3330; 44441; 20; 555553; 455555; 5; 639
waere z.B. wenn du als separierten ASCII string sendest..
Dann musst du erst mal diesen string mit deinem Separator splitten..dann haettest du einen String-array mit x(1)="1", x(2)="2222" etc..
Diese Strings kannst du dann je nach Bedarf wieder zu Byte, Integer oder nem floating point wandeln und damit rechnen..

Wenn du bei der If Verzweigung den Vergleich FELD3 = 1 machst ist 1 schon eine Nummer..
Du koenntest auch den String vergleichen z.B. FELD3 = "1"


Du koenntest natuerlich auch direkt numerische Werte senden, dann musst du nicht mehr rechnen...ausser du hast Werte groesser 0-255,
dann brauchst du wie Daniel schon geschrieben hat 2 oder mehr Bytes.


Meiner Meinung nach haben beide Wege gewisse Vor/nachteile
Gruss

Thomas Glas
06.04.2011, 17:07
Ok dann muss ich die Daten von VB als ASCII String(Kette) durch Seperatoren getrennt senden.

In Bascom angekommen die Daten aufsplitten und anschliessend in Intger wandeln ... nun kann ich diesen Wert auch in einer IF Anweisung nutzen oder damit rechnen.

Habe ich das so richtig Verstanden :confused:


Gruß Tom

DanielSan
06.04.2011, 17:10
Ja das ist die eine Möglichkeit.

So kannst du es machen.

Thomas Glas
06.04.2011, 17:15
Ja nur wo anfangen und wie ich bin total überfordert.

DanielSan
06.04.2011, 17:39
Erstmal musst du dir überlegen, wie deine Übertragung aussehen soll.
Also die Reihenfolge deiner 50 Variablen.

Dann würde ich deinen Atmega auf 16Mhz laufen lassen. Dann hast du einen geringeren Übertragungsfehler bei höherer Geschwindigkeit.

Kannst du mal den Teil deines VB Programms zeigen, in dem du die Serielle schnittstelle ansprichst?
Damit ich sehe was du schon hast. Welche VB Version nutzt du?

Deinen Bascom Code würde ich auch gerne dazu sehen.

Gruß Daniel

Thomas Glas
06.04.2011, 18:11
Per Vb habe ich nur ein kleines Programm mit Eingabefenster weches sich auf meinen Com4 verbindet und Daten senden und empfangen kann.
Mehr ist das nicht :/ Kann aber heute Abend den Code hier eintragen. Ist aber nichts anderes wie Hterm oder ein anderes Terminal.

Den Mega auf 16Mhz laufen lassen würde ich gern ,.. ich laß nur das man den mit falschen Settings kaputt machen kann und da ich mich da nicht ran traue als Anfänger,...

Bascom Code habe ich nur das aus der Hilfe Datei :/ ich habe schon das eine oder andere geschrieben oder besser gesagt abgekupfert.
Leds und Taster etc. das ist auch klar verständlich aber ein Umwandlung oder Berechnung ist schon ne nummer heisser.

Wir nutzen VB2008 dafür haben wir Code snippets mit dem wir Werte aus dem Speicher auslesen können vom Flugsimulator und in der Software wiedergeben können.
Aktuell scheitert es einfach daran die Daten in Bascom zu verarbeiten. Den String aus VB senden stellt eigentlich kein Problem dar.

Ich habe eben mal gegoogelt und die Befehle MID, Instr zum Thema gefunden aber damit kann ich noch nichts anfangen.

BastelWastel
06.04.2011, 21:00
Ich werf einfach mal 2-3 Zeilen aus nem altem Projekt in die Runde

Zuerst mußt du dir eine Buffer variable anlegen..

Dim Uart_buffer(100) As Byte
Dim Uart_buffer_str As String * 100 At Uart_buffer Overlay
In meinem Fall war dieser 100 Bytes groß und hatte ein String Overlay,
was nichts anderes bedeutet, als dass Uart_buffer_str nur eine Art Maske ist.
Damit habe ich den split Befehl direkt auf den Buffer angewendet.

Dim Uart_buffer_splitstr(20) As String * 10
Dim Uart_buffer_splitctr As Byte
Das war mein String-Array..20 Strings a 10 Zeichen..
Uart_buffer_splitctr bekommt später den Rückgabewert von split() ab.

Uart_buffer_splitctr = Split(uart_buffer_str , Uart_buffer_splitstr(1) , ",")
Wenn du deinen Buffer gefüllt hast und dein End-Byte kommt..(ich nehm dazu gerne CR&LF)..
kannst du den String splitten.. split(dein_buffer_string,dein_string_array(start_i ndex),"dein_separator")
Die Rückgabe von split ist die Anzahl der gefüllten Array Felder.
Mit Val() kannst du dann deine Strings in Zahlen konvertieren.

Ich hoffe das hilft bissl weiter.
Gruß,BastelWastel

DanielSan
06.04.2011, 22:28
Hi,

achso ich dachte, dass auch die VB kommunikation noch nicht 100% klappt.

Die Lösung von BastelWastel setzt, wie ich das sehe vorraus, das du aus VB heraus als bytes sendest. Was mir da nicht ganz klar ist, was passiert wenn ein Wert > 256 ist. Oder sehe ich das falsch?

Gruß Daniel

BastelWastel
06.04.2011, 22:41
Nein, das Beispiel wäre für einen String

Richard
07.04.2011, 08:10
Nein, das Beispiel wäre für einen String

Was auch immer gerne so gemacht wird, siehe z.B. GPS Empfang. Da kommt auch ein recht langer String der anschließend passend zerlegt wird so dass die benötigten Werte an festen Adressen zu finden sind.

Gruß Richard

Vitis
07.04.2011, 11:59
(50Var's+Wert im 100ms Takt an den Mega 16 senden) Das wird aber haarig vom Timing her mit den vielen Textkonversionen und der Übertragung als String.

Auch bitte beachten: Baudratenquarz. 16MHz sind zwar schön für die Ausführungsgeschwindigkeit, kann aber Übertragungsfehler geben.

Rechne mal die minimale Baudrate durch die Du brauchst um das alles schnell genug über die UART zu bringen ;)

DanielSan
07.04.2011, 15:57
Er kann die Geschwindigkeiten:

4800
9600
19200
38400

verwenden. Diese haben alle einen Fehler von 0,16% bei 16Mhz. Ich denke damit kann man Leben.

Jetzt müsste man nurnoch wissen, wie lang eine Übertragung ist.

Vitis
07.04.2011, 20:55
Ja, das dacht ich auch schon mal ... "Ach was mit dem kleinen Fehler kann man leben ..."
Hab da auch schon Lehrgeld bezahlt ;)

Bei der Länge, die er alle 100ms rüber schieben will plus der Umwandlung der Strings in Integer ... sportlich.
Das puffernd im Ringpuffer würd ich bleiben lassen und direkt "inline" umwandeln, sprich immer wenn ein Abschnitt komplett ist direkt.
Ginge recht einfach ... per uart-interrupt Zeichen einlesen.
Wenn ist Trennzeichen Pointer zurücksetzen, dann die nachfolgenden Zeichen in Puffer, beim nächsten
Trennzeichen den Puffer kopieren, Parametercounter erhöhen,
die Kopie umrechnen lassen und Ergebnis in Array mit Stelle des Parameterzählers speichern.
Am Ende der Zeichenfolge dann ein End-Zeichen um den Parameterzähler zurückzusetzen (CR-LF z.B.)

Der Haken dabei ist halt, für nen Integer kanns dann mal locker 5 Zeichen werden um 2 Bytes zu übertragen.

Bei sagen wir mal 20 Parametern die er übertragen möchte sind das dann 100 Zeichen plus 20 Trenner, also 120 Zeichen.
8 Bit, plus Start, plus Stopbit sind dann 1200 Baud mal 10, weil ja alle 100ms sind das dann Minimum 12000 Baud/s, die er erreichen muss.

oder andersrum 19200 Baud / 1200 = 16
1/16 = 0,0625 -> 62,5ms bräuchte in dem Falle bei 19200 die Übertragung mindestens. 4800 und 9600 kannst Du ergo schonmal abhaken.

DanielSan
07.04.2011, 21:10
Ja deswegen würde ich das Byteweise machen.

Also das erste Byte ist Wert1, usw.
Dadurch spart man sich alle Trennzeichen. Durch Start und Stop bits wird der Parameterzähler resetet und controlliert. Wenn er sich beim Stopbit verzählt hat, zählt der gesamte Durchgang nicht und es wird auf den nächsten gewartet.
Zudem brauchst du nichts mehr umrechnen und keine Strings zerlegen. Das einzige Problem, wäre wenn einer der Werte > 255 ist. Dann musst du 2 Bytes verwenden und die dann passend zusammenrechnen. Mit 2 Bytes kommst du erstmal bis 65535. Bei 3Bytes bis 16,7mio.

Wenn alle Werte in ein Byte passen, solltest du schon mit 4800Baud auskommen. Ich würde aber mindestens 9600 oder 19200 nehmen.

Achja zu deinem Problem mit dem Fusen, um den Controller auf 16Mhz laufen zu lassen, würde ich mal die Suche oder eine Suchmaschine befragen. Du bist nicht der erste der das Problem hat und es gibt viele gute Anleitungen dazu.

Gruß Daniel

Vitis
08.04.2011, 07:06
In dem Falle ginge ich gleich generell auf 2 Bytes, als Int ist das dann -32768 bis +32768 als Word eben 0 bis 65535, + nochmal nen CRC8 dahinter, macht pro Wert 3 Bytes.