EV3-Basic - erste Schritte: Fragen und Antworten

NXC, C/C++, Lejos, pbLua, RobotC...

Moderator: Moderatoren

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon c0pperdragon » 30. Sep 2015 11:11

Zahlenformatierung habe ich keine drin. Wenn du Zahlen in Tabellenform anzeigen willst, musst du für jede Spalte einen entsprechenden X-Wert wählen.

Mehrere Text/Zahlen in einem Schwung ausgeben, geht aber schon: Du kann einfach den "+" - Operator verwenden um Texte zusammenzusetzen. Damit klar ist, dass das auch wirklich eine Textoperation und keine numerische Operation sein soll (Blöd, dass das "+" so überladen ist), solltest du die Liste mit einem Text anfangen.

zum Beispiel

Code: Alles auswählen

LCD.Write (0, 0, "VALUE: "+val)
LCD.Write (0, 16, "TIME : "+tim)

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5288
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon HaWe » 30. Sep 2015 11:18

aaah - danke, das ist schon mal sehr gut!
werde ich auf jeden Fall so machen!
dann kann man z.B. auch hinter jeder Zahl noch ein

Code: Alles auswählen

+"   "

schreiben, um Platz zu machen falls da vorher noch was stand!
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon c0pperdragon » 30. Sep 2015 11:59

Ja, aber eigentlich ist es nicht so schön, immer in den vollen Bildschirm reinzumalen. Bildschirmlöschen geht mit LCD.Clear () .

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5288
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon HaWe » 30. Sep 2015 13:09

ja, aber dauert auch recht lang im Vergleich zum Leerzeichen schreiben ;)
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5288
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon HaWe » 2. Okt 2015 10:14

was an dieser Syntax falsch?
hier kommen jetzt Fehlermeldungen wegen der If-Zeile, diese kann aber leider nicht kopiert werden


Code: Alles auswählen

   datapacket = sendarray
   calculatechecksum()
   sendarray[1] = checksum
   errflag = 127
   
   While(errflag=127)
     recvarray = Sensor.CommunicateI2C( I2CPORT, I2CSLVADDR, MSGSIZE, MSGSIZE, sendarray )
     errflag   = recvarray[2]
     If (recvarray[MSGSIZE-1]<>I2CSLVADDR) Then errflag = 127   '//  <<<<<<<<<<<<<<<<<  ???
   EndWhile
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon c0pperdragon » 2. Okt 2015 10:24

In Small Basic muss man immer die Befehle innerhalb eines if-blocks (oder while, etc.) in eigene Zeilen schreiben, und das immer mit endif (endwhile, etc.) abschließen.

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon c0pperdragon » 2. Okt 2015 10:26

außerdem bräuchtest du die runden Klammern um die Schleifen oder if- Bedingungen nicht machen (schaden aber auch nicht)

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5288
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon HaWe » 2. Okt 2015 11:15

(!)
+1
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5288
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon HaWe » 3. Okt 2015 08:44

ich habe noch eine Frage zum Umwandeln von 16- und 32-bit Signed Integer und auch von Floats in Bytearrays - und wieder zurück.
Ich bin nicht sicher, ob das alles überhaupt möglich ist -
also erstmal Schritt für Schritt...

das erste, einfachste Problem ist: Signed Short Int in Bytes verwandeln, Beispiel: -128 und dann wieder zurück

In C ganz einfach:
Byte1 = LowByte(intval) = (intval & 0x00ff)
Byte2 = HighByte(Intval) = ( (intval>>8) & 0x00ff)

genau so werden die 2 Bytes jetzt in einem Array an den EV3 geschickt.
Wie kann der EV3 jetzt daraus die int16_t Zahl -128 zusammensetzen bzw. rekonstruieren (und nicht die identisch kodierte positive uint16_t Zahl?)


das wechselseitige Umwandeln von signed in unsigned ist ja in C einfach durch Type-casting möglich
uintval= (unsigned int) intval
intval = (int) uintval
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5288
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon HaWe » 3. Okt 2015 18:30

geht ja gar nicht mit typecast - vergaß, dass EV3Basic ja gar nicht als Ints kodieren kann, sondern alles als Floats speichert.
Daran habe ich mich jetzt noch nicht gewöhnt...

aber einmal ist der übertragene Wert als signed short = -128,
das andere Mal miss-interpretiert als unsigned short = 65408...


-----------------------------------

ps,
ja ich habe glaube ich einen workaround, wenn man einen falschen unsigned short Wert in signed short umwandeln will:

Code: Alles auswählen

if(k>32767) k=k-65536;
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon c0pperdragon » 3. Okt 2015 18:34

Ja, das ist schon etwas knifflig. Basic ist ja überhaupt nicht für diese Art der Konvertierungen ausgelegt und solange man innerhalb von Basic bleibt, ist das ja auch nicht nötig. Alles wird sowieso mit floats berechnet und alle Kommandos benutzen das auch. Die Schwierigkeiten beginnen natürlich, wenn man mit der umliegenden Welt kommunizieren will und deren Sprache sprechen muss.

Um das Problemstellung zu präzisieren: Wie kann man die Zahlen von Basic in einzelne Bytes aufbrechen, bzw. einzelne Bytes zu Basic-Zahlen zusammenzusetzen? Wahlweise mit oder ohne Vorzeichen.

Um die Sache langsam anzugehen, nehmen wir mal den (auch schon nicht trivialen) Fall, eines einzelnen Bytes mit Vorzeichen. Ich habe etwas mit den vorhandenen Möglichkeiten von Basic herumgespielt, und auf folgende Umrechnungen gekommen:

Code: Alles auswählen

a = b - Math.Floor(b/128)*256              '  interpret the byte b as a signed byte and compute the value
b = a - Math.Floor(a/Math.Abs(2*a))*256    ' create a byte b that is the 2s-complement representation of a

Die erste Formel funktioniert im wesentlichen so, dass zuerst das Vorzeichenbit extrahiert wird und bei der zweiten habe ich mir eine Art sign() - Funktion gebastelt, die für negative Zahlen -1 und für andere Zahlen 0 wird.

Für Fälle mit mehreren Bytes pro Zahl, ist es am einfachsten, die Arbeit in zwei Schritte aufzuteilen. Einmal Konvertierung von / zu einer vorzeichenlosen Zahl und andererseits wie oben das Vorzeichen behandeln.
Also Kombination von b0 und b1 (b0 ist niederwertigstes Byte):

Code: Alles auswählen

b = b0+b1*256                       ' combine two bytes to an unsigned value
a = b - Math.Floor(b/32768)*65536   ' add sign information 


Und umgekehrt die Aufteilung von a auf b0 und b1

Code: Alles auswählen

b = a - Math.Floor(a/Math.Abs(2*a))*65536    ' encode signed value into unsigned 16 bit value
b0 = Math.Remainder(b,256)                   ' split into two bytes
b1 = (b-b0)/256


Verwendung von 3 bytes für den Transport geht wahrscheinlich noch ähnlich, aber darüberhinaus ist es eher sinnlos, weil die Zahlen in Basic nicht die nötige Genauigkeit haben um 32 bit integers abzubilden (bis 24 bit geht fehlerfrei - das habe ich mal durchgerechnet).

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5288
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon HaWe » 3. Okt 2015 18:35

Wenn Floats als 4er Byte-Array ankommen, wird's aber jetzt schwieriger...
(oder double als 8er Byte-Array)
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon c0pperdragon » 3. Okt 2015 18:48

Eine in 4 Bytes ankommende float-Zahl wieder so zusammenzusetzen, dass da eine Basic-Zahl draus wird, ist sicher schwierig. Ich würde wahrscheinlich so vorgehen: Zuerst die Bytes b0 -b3 durch ähnliche Operationen wie oben in die entsprechenden nichtnegative ganzzahligen Werte S, E und M zu verwandeln und dann entsprechend der Definitionen der IEEE (https://de.wikipedia.org/wiki/IEEE_754) in eine Zahl umzurechnen.
Aber das würde ich echt nur im Notfall versuchen.

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5288
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon HaWe » 3. Okt 2015 18:58

ich dachte schon an sowas:
bei float erst den Vorkommateil extrahieren und dann den Nachkomma-Anteil

Code: Alles auswählen

float param, fracpart, intpart;
fractpart = modf (param , &intpart);


dann den intpart in short umwandeln:
signed short iint=(signed short)fracpart;

dann den fracpart*1000 in Short umwandeln (max. 4 Nachkommastellen, -0.9999 bis +0,9999)
signed short ifrac=(signed short)(1000*fracpart);

dann iint und ifrac getrennt als zwei 16-bit short zu je 2 Bytes verschicken
Je nach Wertebereich muss man für den Vorkomma-Teil evtl aber sogar ein long (4Bytes) spendieren... :-/
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3-Basic - erste Schritte: Fragen und Antworten

Beitragvon c0pperdragon » 3. Okt 2015 19:09

Achso ja, du kannst dir natürlich jede beliebige Übertragungsdarstellung für deine Zahlen ausdenken. Je nachdem was dann für dich einfacher wieder zusammenzusetzen ist.
Wenn aber von außen (und so, dass du das nicht beeinflussen kannst) tatsächlich eine 32bit IEEE-Zahl daherkommst, dann wird es wie gesagt, echt schwer. Hoffen wir mal, dass wir das nicht brauchen...


Zurück zu „textbasierte Programmiersoftware“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 16 Gäste

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss