Dieses uBasic von Uwe Berger entstand auf dem Grundgerüst von Adam Dunkel
Sehr viele Infos zum Projekt von Uwe Berger gibt es auf mikrocontroller.net
Rene Böllhoff hat dazu einen Fastparser ins Leben gerufen.
Die neuste Version (akuell ist die 70) befindet sich im SVN

Von mir wurde das Systen um viele Befehl erweitert.
Der Editor und die CMD entstanden neu.
LCD und Tastatur wurden neu Entwickelt und hinzugefügt um ein eigenständiges Gerät zu bekommen.

Es gibt eine Reihe von Befehlen, die das System "versteht".
Die CMD ist das erste Element das gestartet wird .
Die Abkürzung CMD steht für: Kommandozeileninterpreter.
Hier werden grundlegende Funktionen des Systems gesteuert und ausgeführt.

Die Ausgaben erfolgen auch über die 2. serielle Schnittstelle (38400, 8, n, 1)
Der Bootloader nutzt die 1. serielle Schnittstelle.

WICHTIG, wenn die Datei "main" vorhanden ist, wird diese sofort
nach Einschalten oder Reset mit dem Basicinterpreter gestartet.

Das Basicprogramm und der Editor kann jeder Zeit mit "ESC" beendet werden.

Nun die CMD-Befehle im einzelnen:

mem

freien Speicher anzeigen (RAM)

info

Statusinformationen der SD-Karte ausgeben

clear

TFT LCD löschen

dir

Dateien von SD-Karte auflisten

list

"Dateiname"

Basicprogramm anzeigen

hd

"Dateiname"

Datei in HEX anzeigen (auflisten)

touch

"Dateiname"

neue leere Datei anlegen

write

"Dateiname"

in Datei schreiben, muß vorher angelegt sein (mit touch)

rename

"Dateiname" "Dateiname"

Datei umbenennen

delete

"Dateiname"

Datei löschen

cd

"Verzeichnis"

Verzeichnis wechseln

mkdir

"Verzeichnis"

neues Verzeichnis anlegen

edit

"Dateiname"

Editor starten
Ist die Datei nicht vorhanen, wird sie angelegt.
Die Datei wird mit F1 gespeichert oder beim Beenden nachgefragt.
Ende mit ESC oder F10

run

"Dateiname"

Basicprogramm starten

time

Runtime des Basicprogramms ausgeben

basic

"Dateiname"

Zeileninterpreter starten, die Zeilen werden auf SD-Karte in der Datei "temp"
gespeichert, wenn kein anderer Dateiname angegeben wurde.
Ist diese Datei vorhanen, wird sie überschrieben.
Ist diese Datei nicht vorhanen, wird sie neu angelegt.
Ende mit ESC, das Basicprogramm wird sofort ausgeführt.

sound

"Dateiname"

eine wav - Datei abspielen
Das Format ist
8KHz 8Bit Mono oder
11KHz 8Bit Mono oder
16KHz 8Bit Mono.
Andere Formate werden nicht unterstützt.

reset

das System wird neu gestartet

color

Hilfsprogramm, aus RGB wird eine Farbe gewählt und als Wert angezeigt

aa

Hilfsprogramm, Ram mit 0xaa füllen

dump

adresse (Adresse in hex)

Hilfsprogramm, Raminhalt anzeige, Ende mit ESC



Nun kommt der 2. interessantere Teil, der Basicinterpreter.
Die unveränderten Grundbefehle stehen im Manual von Uwe Berger.
Die Befehle PUSH und POP werden nicht unterstützt.
Einige Variablen haben neue Werte, es ist ja genügend Speicher vorhanden.
Schau mer mal die an...
max. Stringlaenge 80
max. Länge der Eingabe beim INPUT-Befehl 32
max. Schachtelungstiefe fuer GOSUB 8
max. Schachtelungstiefe fuer FOR-NEXT 12
max. Länge von Funktions- und Variablennamen in call(), vpeek() und vpoke() 32
max. Länge Programmname (gosub) 32
Nun gibt es eine Reihe von Befehle, die neu dazu gekommen sind.
Die werden hier erläutert.
pwm

Wert wird an PWM Kanal 0 bis 3 ausgegeben

a = adc(2)
b = 1
pwm(b) = a

get

serielle Porterweiterung (0 bis max. 8) lesen, Adr = Port (8Bit)

a = get(2)
pwm(3) = a

put

ein Byte wird an die serielle Porterweiterung (0 bis max. 8) gesendet

a=0b01010101
put(4) = a

on

ein Bit wird an der seriellen Porterweiterung (0 bis max. 71) für eine bestimmte Zeit
eingeschaltet. Die Schaltzeit betägt pro Schritt 100ms. Steht die Zeit auf 0,
bleibt dieses Pin eingeschaltet.

on(4)=0
rem dieses Pin bleibt eingeschaltet
on(4)=10
rem dieses Pin wird nach 1 sec. wieder ausgeschaltet

off

ein Bit wird an der seriellen Porterweiterung ausgeschaltet(0 bis max. 71)

off(14)

test

ein Bit wird von der seriellen Porterweiterung zurückegeben(0 bis max. 71)

a = test(9)
if a=1 then print "Lampe ist an"

save

Variable auf SD-Katen-Datei schreiben

save "Dateiname","Bezeichnung",a

load

Variable von SD-Kate lesen, wenn die nicht da ist kommt 0 zurück

a = load "Dateiname","Bezeichnung"

fprint

alle Ausgaben wie bei "print" auf SD-Katen-Datei schreiben

fprint "Dateiname" , 3+3 , "Hallo du da"

delete

Datei auf SD-Kate löschen

delete "Dateiname"

show

zeigt ein BMP-Bild an Position x (max. 320 breit), y (max. 240 hoch)
das Bild muß x/4 ,0 teilbar sein

show 12, 18, "bild"

pen

es wird die letzte Koordinate des TouchPanel zurück gegeben

pen x,y
if x>10 and y>10 and x<20 and y<20 then show 12, 18, "bild"


Diese Befehle werden mittels der Callfunktion aufgerufen.
clear

lösche LCD mit Farbe f

srand
c = rand (10000)
call("clear",c)
wait (1000)
call("clear",0)

area

legt eine Zeichenbereich von x1, y1, nach x2, y2 fest

call("area",0,0,239,319)
call("area",a(0),a(1),a(2),a(3)

pset

zeichne ein Punkt an x, y mit Farbe f

call("pset",120,100,0)
call("pset",a,b,c)

line

zeichne eine Linie von x1, y1, nach x2, y2 mit Farbe f

call("line",120,100,190,200,0)
call("line",a,b,c,d,e)

rect

zeichne ein Rechteck von x1, y1, nach x2, y2 mit Farbe f

call("rect",120,100,190,200,0)
call("rect",a,b,c,d,e)

frect

zeichne ein Rechteck von x1, y1, nach x2, y2 und fülle mit Farbe f

call("frect",120,100,190,200,0)
call("frect",a,b,c,d,e)

circle

zeichne ein Kreis an x, y, mit Radius r mit Farbe f

call("circle",120,100,190,0)
call("circle",a,b,c,d)

fcircle

zeichne ein Kreis an x, y, mit Radius r und fülle mit Farbe f

call("fcircle",120,100,190,0)
call("fcircle",a,b,c,d)

text

schreibt ein Text an x, y, text, größe, Farbe, Hintergrundfarbe

call("text",120,100, hallo,0,0,500)
call("text",a,b, hallo,c,d,e)

number

schreibt eine Zahl an x, y, z, größe, Farbe, Hintergrundfarbe

z=100
call("number",120,100,z,0,0,500)
call("number",a,b,z,c,d,e)

sound

eine wav - Datei abspielen
Das Format ist 8KHz 8Bit Mono oder
11KHz 8Bit Mono oder 16KHz 8Bit Mono.
Andere Formate werden nicht unterstützt.
Wird ein Sound gespielt, wartet das Basicprogramm bis Soundende.

call("sound","test.wav")
w$ = "test.wav"
call("sound",w$)

cd

das Verzeichnis wechseln,
cd "name" wechselt in das Verzeichnis "name".
cd ".." wechselt in das übergeornete Verzeichnis.

call("cd","ton")
call("sound","test.wav")
w$ = "test.wav"
call("sound",w$)
call("cd","..")


Hier mal eine Übersicht der 98 Befehle
Kommentar:
rem

Variablenzugriff:
let dim vpoke vpeek epoke epeek ( )

Ausgabe:
print tab sound text number

Prüfen:
if then else

Schleifen:
for to downto step next

Verzweigung:
call goto gosub return

Mathematik:
abs not xor shl shr or | and & mod % < <= > >= <> = + - * / $ , : ; "

Zufallszahl:
srand rand

Eingabe:
input pen

Warten:
wait

Hardwarezugriff:
dir in out adc get put pwm on off test

Stringverarbeitung:
data read restore left$ right$ mid$ chr$ str$ upper$ lower$ instr$ val asc m_strlen len

Grafik:
clear area pset line rect frect circle fcircle show

Datei:
cd fprint load save delete

Programmende:
end


Soweit der Interpreter Fehler im Basic-Programm erkennt, werden sie in folgender Form auf der Standardausgabe ausgegeben:
error "errornumber" at sourceline: "linenum" ("basiclinenum"?) in program "name" Dabei entspricht "linenum" der Zeile im
BASIC-Quelltext (also nicht die BASIC-Zeilennumer) und "basic-linenum" der BASIC-Zeilennummer (soweit vorhanden).
Wenn innerhalb der Konfiguration der Support für externe Unterprogramme aktiviert ist,
bezeichnet "name" die Programm-Datei, in der der Fehler aufgetreten ist. Für die richtige Differenzierung des Fehlers wird keine Garantie gegeben.

Fakt ist aber, dass wenn ein Fehler auftritt, ist etwas am Basic-Programm faul (oder das Ende des dynamischen Speichers erreicht)!
Bei Auftreten eines Fehlers, wird das Basic-Programm abgebrochen.
1

SYNTAX_ERROR

2

UNKNOWN_ADC_CHANNEL

3

UNKNOWN_IO_PORT

4

FOR_WITHOUT_TO

5

UNKNOWN_STATEMENT

6

UNKNOWN_CALL_FUNCT

7

UNKNOWN_CALL_FUNCT_TYP

8

UNKNOWN_CVAR_NAME

9

SHORT_IF_WITH_ELSE

10

GOSUB_STACK_DETH

11

FOR_STACK_DETH

12

GOSUB_STACK_INVALID

13

UNKNOWN_SUBPROC

14

GOSUB_NO_EXT_SUBPROC

15

ARRAY_OUT_OF_RANGE

16

OUT_OF_MEMORY

17

NOT_ENOUGH_DATA

18

UNKNOWN_LINENUMBER

19

INPUT_IS_NOT_NUMBER

20

UNKNOWN_VARIABLE

21

STRING_TO_LARGE

22

DATA_READ_TYPE_DIFF

23

STRINGVAR_NOT_INIT

40

VALUE_TOO_HIGH

41

UNKNOWN_PWM_CHANNEL

50

ERROR_FILE_NOT_FOUND

51

ERROR_CREATING_FILE

52

ERROR_OPEN_FILE

53

ERROR_SEEK_FILE

54

ERROR_WRITING_FILE

55

ERROR_DELETE_FILE


Wenn Fragen auftauchen, beantworte ich die gern per eMail:

eMail


Home