PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ASURO programmieren mit AB++



robo.fr
21.10.2007, 20:17
Hallo Allerseits,

durch einen Artikel in der letzten CT über esoterische Programmiersprachen ist mir die Idee gekommen, daß der ASURO eine eigene Programmiersprache braucht.

Deshalb habe ich versuchsweise mal einen Befehlsinterpreter geschrieben, den ich AB++ nenne ( AsuroBefehlsinterpreter, ++ nicht weil er objektorientiert ist, sondern weils besser klingt =P~ )

Zur Ein-Ausgabe muß man ein Terminal-Programm nehmen und mit dem ASURO über IR-Adapter kommunizieren.

Die Befehlsliste erhält man mit "help"

Das Programm kann man mit "list" auflisten.

Ein neuer Programmschritt wird mit '.' eingefügt, oder , mit '-' gelöscht.

Ein Beispielprogramm kann folgendermaßen aussehen:

.turn
.wait
.go
.wait
.run

run ( startet das Programm )

liggi
21.10.2007, 20:37
Klasse Idee!!!!!
Hast du auch mal den Quelltext oder ist dein Programm kein Openscoure? Und was ist mit Übertragungsfehlern?

mfg liggi

Sternthaler
21.10.2007, 20:39
Hallo robo.fr,
da bin ich ja mal gespannt, was mit AB++ und den Kommandos:
list
help
odo
line
encoder
run
stop
turn
go
wait

so alles Möglich ist.
Gibt es noch Parameter dazu?

Schon wieder was Gutes von dir.
Gruß Sternthaler

[EDIT] Hallo liggi. Mal wieder schneller als ich. Ich habe aber schon die Kommand's ;-)
[EDIT 2] Ja, der Asuro kann im Viereck springen. äh fahren.

robo.fr
21.10.2007, 21:09
Es freut mich, daß Ihr euch für sowas interessiert =P~

Hast du auch mal den Quelltext oder ist dein Programm kein Openscoure?
Klar doch, hier im Anhang


Und was ist mit Übertragungsfehlern?
Tja, gute Frage, das dürfte mit dem Übersprechen von Senden und Empfangen zu tun haben. Muß mal schauen, ob ich das irgendwie hinkriegen kann.

Gibt es noch Parameter dazu?
Noch nicht, daß ist der einfachste Anlauf im Moment. Ich hoffe, daß ich das ganze noch ein wenig erweitern kann ...

Schon wieder was Gutes von dir.
Danke, danke, danke O:) O:) O:)

robo.fr
21.10.2007, 21:11
[EDIT 2] Ja, der Asuro kann im Viereck springen. äh fahren.

Hast schon so ein Programm mit AB++ hingekriegt? Super =P~

damaltor
21.10.2007, 23:25
evtl sollte der asuro bei korrekt empfangenen befehlen antworten. so kann man übertragungsfehler eindämmen.

robo.fr
22.10.2007, 06:23
Eigenltich antwortet der ASURO ja auch erst, wenn man am Ende einer Zeile "return" gedrückt hat. Die Echozeichen, die man beim Tippen sieht, werden durch das Übersprechen der IR-LED/IR-Empfänger am IR-Adapter erzeugt. Bei meinem Adapter wird interessanterweise ein Kleinbuchstabe öfters durch einen Großbuchstaben ersetzt. Die Übertragungsqualität wird besser, wenn man sehr langsam tippt.
Im Moment habe ich keine rechte Idee, wie man die Übertragungsqualität erhöhen kann.

damaltor
22.10.2007, 09:34
klein-und großbuchstaben unterscheiden sich auch nur durch ein einziges bit. dieses ist dann eigentlich ein übertragungsfehler.

M1.R
22.10.2007, 17:35
Hallo robo,

gute Idee!
Praktisch sind die Befehle odo, line, encoder bei denen man eh die IR-Verbindung braucht.
Am besten gefällt mir aber, wenn er "hae?" sagt. O:)

Anscheinend habe ich nun aber meinen ASURO IR-überfordert!
Leider sendet er jetzt gar nicht mehr. :(

Gruss
M.

robo.fr
22.10.2007, 20:16
ja, man kann sogar ein kleines AB++ Programm schreiben, bei dem er automatisch z.B. die Encoderwerte sendet:


.encoder
.run
run

Mit diesem kleinen, praktischen Programm kann man also zyklisch die Encoderwerte übertragen lassen.


Am besten gefällt mir aber, wenn er "hae?" sagt.

nett, gell? O:) Schade nur, daß das Terminalprogramm kein "ä" anzeigen konnte, ein richtiges hä? hätte mir noch besser gefallen.

Tja, das mit der IR-Schnittstelle ist so eine Sache, die ist leider ziemlich fehleranfällig.

Gruß,
robo

damaltor
22.10.2007, 20:41
hmm es sollte aber ien ä anzigen können. sonst musst du einen anderen zeichensatz wählen, oder das programm wechseln =)

Sternthaler
22.10.2007, 21:00
[EDIT 2] Ja, der Asuro kann im Viereck springen. äh fahren.

Hast schon so ein Programm mit AB++ hingekriegt? Super =P~

Ähm (mit Ä), ich habe natürlich als erstes nur dein Beispiel ausprobiert. :oops:

Ich vermute, das turn einen 90-Grad-turn machen soll.
Super wäre noch eine Möglichkeit zum 'justieren' der Odo-Schwellwerte über Kommandos. (Später, später, später, reicht natürlich.)

Danke für den Code. (Da kann man ja nun auch turn zu 90 Grad machen)
Gruß Sternthaler

damaltor
23.10.2007, 02:58
muss mal grad ne anmerkung machen... das ist keine esotherische programmiersprache! es ist einfach nur eine interpretierte, ungefähr so wie die alten basic-computer (c64, KC85 usw).

eine esotherische sprache wäre zB ein brainfuck-interpreter... der sollte sich eigentlich recht leicht implementieren lassen denk ich. oder?

robo.fr
23.10.2007, 07:08
Zugegebnermaßen ist AB++ im Vergleich zu Brainfuck (http://en.wikipedia.org/wiki/Brainfuck) wenig esoterisch. Bei der Beschäftigung damit geht es mir darum, etwas über Compiler- und Interpreterbau zu lernen. Esoterisch ist AB++ in dem Sinne, daß es wohl keinen Interpreter mit eigenem Syntax und mit quasi "eigenem" Betriebssystem auf einem Roboter mit so kleiner CPU gitbt.

Vielleicht hat auch jemand eine lustige Idee und baut eigene Komandos ein. Ich habe schon einiges gelernt, nämich daß die Informatik auf dem Gebiet schon viel weiter ist. Heutzutage verwendet man dazu wohl Compiler Compiler (http://en.wikipedia.org/wiki/Parser_generator). Gut geeignet scheint Yacc (http://epaperpress.com/lexandyacc/)


ein brainfuck-interpreter... der sollte sich eigentlich recht leicht implementieren lassen denk ich. oder?

Es gibt nichts Gutes: außer man tut es! ( Erich Kästner )

damaltor
23.10.2007, 10:58
ich denke da an den c64 =) der hatte zwar deutlich mehr ram, aber nur 1 mhz... das war ein ganz hübscher basic verschnitt.

aber ansonsten: find ich ne tolle idee! das ist das zwischensstück zwischen easyasuro und C/Bascom. :)

robo.fr
23.10.2007, 19:31
zwischensstück zwischen easyasuro und C/Bascom. Smile

Zuviel der Ehre O:)

Der Speicher ist mittlerweile schon ganz schön eng geworden. Normalerweise kann ich bei meinen Programmen einem Atmega8 immer viel Platz mit der Compileroption "Os" schaffen.

Hat jemand eine Ahnung, warum das mit der ASURO Lib 2.6.1 nicht geht?

damaltor
23.10.2007, 21:39
das sollte wohl gehen... aber versuche mal die anderen optimierungsstufen. im allgemeinen macht Os die kleinsten ergebnisse, aber nicht zwingendermaßen!

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Optimierungsgrad

Sternthaler
24.10.2007, 00:08
Hallo robo.fr,
Mit der Lib sollte eigendlich alles in Ordnung sein.
Du nutzt so ziemlich die ganze Breitseite der in der Lib vorhandenen Befehle, so dass folgende Sourcen aus der Lib benutzt werden:
- adc.c
- asuro.c
- encoder.c
- encoder_low.c
- leds.c
- motor_low.c
- print.c
- time.c
- uart.c

Es bleiben nur ein paar 'Spezialisten' außen vor:
- i2c.c
- lcd.c
- motor.c (Ist 'nur' leistungsgesteuertes Fahren von stochri drin)
- rc5.c
- sound.c <-- Hierzu wäre noch ein Kommando TUUUT oder FIEP bei dir denkbar ;-) P.S.: Mein Alias deutet heute Abend nicht auf eine Verwandschaft mit Erich hin O:)
- switches.c

Trotzdem macht es Spaß, gerade weil es Groß ist.
Gruß Sternthaler

[EDIT]
Oh je, ich bemerke gerade, dass du noch die Lib 2.6.1 einsetzt.
Die ist sowieso noch nicht von m.a.r.v.i.n 'zerstückelt' worden. Hier wird immer der komplette Lib-Inhalt mit eingebunden.
Erst ab Version 2.7 wurde zerhackt.

robo.fr
24.10.2007, 09:00
Hallo Sternthaler,

vielleicht erfreut es Dich, selbst einen Befehl an AB++ dranzubasteln. Das ist relativ einfach:

1. Anzahl Keywords erhöhen hier MAX_KEYWORDS 11
2. neues Token erzeugen z.B. "tuut". Also TOKEN_TUUT
3. text für den Befehl in das Array keywords eintragen
4. den Befehlscode in die case-Auswahliste eintragen

Und schon hat man einen neuen Befehl O:)

********************** 1 ***************************
#define MAX_KEYWORDS 11
********************** 2 ***************************
enum {
TOKEN_TUUT,
TOKEN_LIST,
....
********************** 3 ***************************
static const struct word_token keywords[] =
{
{"tuut", TOKEN_TUUT},
{"list", TOKEN_LIST},
...

********************** 4 ***************************
( findet sich in uint8_t exec_token(uint8_t token) )

switch(token)
{
case TOKEN_TUUT:
{
sound(....);
}break;

case TOKEN_LIST:
{
list(); // list program
}break;

Sternthaler
24.10.2007, 23:37
Hallo robo.fr,
danke für die schöne Bedienungsanleitung.
Mal sehen, ob ich zum TuuuuT-en komme.

Sieht im Innern von AB++ sieht es doch recht übersichtlich aus.
Sollte also auch für viele andere TUUT-er, PIIEP-er und weiters nicht so schwierig sein.

Gruß Sternthaler

damaltor
25.10.2007, 17:58
vor allem ein großes lob an dich für diese sehr gute modulare implementierung - kein unstrukturierter code, der kaum noch zu bearbeiten ist. das token system gefällt mir.

M1.R
14.11.2007, 20:12
Schade nur, daß das Terminalprogramm kein "ä" anzeigen konnte, ein richtiges hä? hätte mir noch besser gefallen.

Hallo robo,

bei meinen vergeblichen Recherchen, wie man Kommazahlen ausgeben kann (hier (https://www.roboternetz.de/phpBB2/viewtopic.php?p=327900#327900)),
bin ich zufällig auf die Methode zur Darstellung von Umlauten gestoßen.
Das geht mit ANSI oktal Code.
SerWrite ("h\204?", 3); gibt hä?

Gruss
M.

robo.fr
15.11.2007, 16:47
Auch nicht schlecht, wenn ich dazu komme, baue ich's ein.

Bis dann,
robo