Projekt
Hardware
Bedienung
BASIC (1)
BASIC (2)
BASIC (3)
Interna
Beispiele
Erweiterungen
Bibliotheken
Treiber
Programme


Bezugsquellen:
Bausatz
Leerplatine

AVR-ChipBasic2: BASIC-Referenz (3)
Ein-/Ausgabe, Dateien
V1.50 (c) 2006-2015 Jörg Wolfram




1 Ein- und Ausgabe über den Parallelport



1.1 DIR n

setzt die I/O-Richtung der 8 Portpins an der parallelen Schnittstelle. Eine 0 bedeutet Eingang, eine 1 Ausgang.
10 DIR $F0
Pin D0-D3 werden als Eingang, D4-D7 als Ausgang konfiguriert.
Die Funktion kann durch Treiber auf Programmplatz 8 deaktiviert werden, in diesem Fall wird mit der Meldung "IO disabled" das Programm abgebrochen.

1.2 OUT n,b

Hier gibt es mehrere Funktionen, n=0..7 setzt einzelne Bits, n=$100 bis $1ff erlaubt es, mehrere Bits gleichzeitig zu setzen bzw. zu löschen. dabei dienen die unteren 8 Bits von n als Maske.
Beispiele:
10 OUT 7,0
Setzt D0 auf 0-Pegel.
10 OUT $1F0,$F0
Setzt D3-D7 auf 1-Pegel.
Die Funktion kann durch Treiber auf Programmplatz 8 deaktiviert werden, in diesem Fall wird mit der Meldung "IO disabled" das Programm abgebrochen. Mit n=512 ($200) wird die SPI-Schnittstelle konfiguriert. Ist b=255 ($ff), wird die SPI-Schnittstelle auf Standardwerte und zurückgesetzt. Bei anderen Werten wird die SPI-Schnittstelle nach folgendem Schema konfiguriert: Die Bits 0-5 werden in des SPCR-Register des Mikrocontrollers geschrieben, Bit 6 in das SPSR-Register.


Bit Bit=0 Bit=1
0 siehe SCK-clockteiler siehe SCK-clockteiler
1 siehe SCK-clockteiler siehe SCK-clockteiler
2 Datenübernahme mit Vorderflanke des Taktes Datenübernahme mit Rückflanke des Taktes
3 Takt in Ruhelage LOW Takt in Ruhelage HIGH
4 SPI Slave SPI Master
5 Bit 7 wird zuerst gesendet Bit 0 wird zuerst gesendet
6 Bitrate x 1 Bitrate x 2


Über den SCK Clockteiler kann im Master-Mode die SPI-Clockfrequenz eingestellt werden. Dabei sind folgende Werte möglich:


Bit 6 Bit 1 Bit 0 Frequenz
0 0 0 5 MHz
0 0 1 1,25 MHz
0 1 0 312,5 KHz
0 1 1 156,25 KHz
1 0 0 10 MHz
1 0 1 2,5 MHz
1 1 0 625 KHz
1 1 1 312,5 KHz


Die Clockfrequenz von 10MHz kann nur im Master-Mode verwendet werden, wobei der Slave-Mode nur bedingt einsetzbar ist, da die CPU während der Bildausgabe (ca. 70% der Zeit) die SPI-Schnittstelle nicht bedienen kann. Direkter Zugriff auf die I/O Register des ATMega644 steht im Bereich n=$400 bis $4ff zur Verfügung. Hier sollte man Vorsicht walten lassen, es ist damit auch möglich das System zu Stillstand zu bringen.
01 OUT $4B9,92
Setzt das TWBR Register (I2C-Bitrate) auf 92 (100KHz bei Vorteiler 1).
Bei Adressen im Bereich n=$0800 bis $ffff wird auf eine Funktion im Treiber (Programmplatz 8) zugegriffen. Ist kein entsprechender Treiber geladen ist dies nur eine Dummy-Funktion, die das Fehlerregister setzt.

1.3 Die Funktion IN(n)

Hier gibt es mehrere Möglichkeiten, n=0..7 liest einzelne Bits des I/O-Ports, n=$1xx erlaubt es, mehrere Bits gleichzeitig zu lesen wobei xx als Bitmaske dient.
Eine erweiterte Funktionalität steht im Bereich n=$400 bis $4ff zur Verfügung. Hier kann direkt auf die I/O Register des ATMega644 zugegriffen werden.
01 D=IN($426)
liest das PIN-Register (Port-Input) von Port C in die Variable D ein.
Bei Adressen im Bereich n=$0800 bis $ffff wird auf eine Funktion im Treiber (Programmplatz 8) zugegriffen. Ist kein entsprechender Treiber geladen oder benutzt dieser die angegebene Adresse nicht, wird ein Fehler (NO IO DRIVER) generiert.

1.4 Die Funktion ADC(n)

Diese Funktion dient zum Einlesen von Analogwerten über den integrierten Analog-Digital-Wandler. Auch hier gibt es mehrere Möglichkeiten, n=0..7 werden die I/O-Leitungen D0...D7 mit der internen Referenzspannung von 2,56 Volt eingelesen. Im Parameterbereich n=$1xx ist es möglich, das ADMUX Register direkt zu steuern. Damit lassen neben unterschiedlichen Referenzen auch die differentiellen Modes nutzen.

1.5 Die Funktion SPI(n)

Mit dieser Funktion wird ein Byte über die SPI-Schnittstelle ausgegeben und der eingelesene Wert zurückgegeben.
10 IF SPI(67)<>67 PRINT "ERROR"
Wenn MOSI mit MISO verbunden und die SPI-Schnittstelle aktiviert ist, sollte kein "ERROR" angezeigt werden.

1.6 SPISEL n

Mittels diesem Signal lässt sich der SPI-SS Portpin schalten. Ab Version 1.44 hat sich die Auswertung des Parameters geändert, damit die SPI-Multiselect Erweiterung genutzt werden kann. Dazu wird bei Werten < 255 das Byte mit deaktiviertem SS Signal ausgegeben und erst danach das SS Signal aktiviert.
  • SPISEL nn(0...254) aktiviert das SS Signal (LOW-Pegel an PORTB.4)
  • SPISEL 255 deaktiviert das SS Signal (HIGH-Pegel an PORTB.4)
01 SPISEL $F7
02 A=SPI($FF)
03 SPISEL $FF
Mit diesem Befehl wird die Selectleitung aktiviert, 0xFF über die SPI-Schnittstelle ausgegeben und danach die Selectleitung wieder deaktivert. Mit SPI-Multiselect Erweiterung wird ser SS-Ausgang an Bit 3 aktiviert.
Bei Zugriffen auf den DataFlash-Baustein wird immer der feste SPISEL-Wert von 254 (Bit0 = 0) verwendet.

2 Kommunikation



2.1 SPUT a,b...

ein oder mehrere Bytes werden an die serielle Schnittstelle ausgegeben.
01 SPUT 65,10
gibt ein großes "A" und einen Zeilenvorschub an die serielle Schnittstelle aus.

2.2 SGET V

Ein Zeichen von der seriellen Schnittstelle wird eingelesen und in die Varaiable V gespeichert. Diese Funktion ist aber nur beim ATMega644P nutzbar, und nur wenn der Eingangspin der seriellen System-Schnittstelle auf PD1 liegt. Ansonsten wird mit einer Fehlermeldung abgebrochen. Die Funktion kehrt erst zurück wenn das Zeichen eingelesen wurde, alternativ kann mit der ESC Taste abgebrochen werden. In diesem Fall wird der Wert -1 zurückgegeben.
01 SGET C
wartet auf ein Zeichen von der seriellen Schnittstelle und speichert die in die Variable C

2.3 BAUD n

Hiermit kann die Bitrate der seriellen Schnittstelle eingestellt werden. Diese Einstellung gilt aber nur zur Laufzeit der Programmes und wird nach Programmende wieder durch die Systemeinstellung überschrieben. Es sind folgende Bitraten möglich:


n Bitrate (Bps)
0 1200
1 2400
01 BAUD 1
setzt die Bitrate auf 2400Bps.

2.4 ESPUT a,b...

ein oder mehrere Bytes werden an die zweite serielle Schnittstelle ausgegeben. Diese Funktion ist aber nur beim ATMega644P nutzbar, und nur wenn der Eingangspin der seriellen System-Schnittstelle auf PD1 liegt. Ansonsten wird mit einer Fehlermeldung abgebrochen.
01 ESPUT 65,66,10
gibt einen Zeilenvorschub an die zweite serielle Schnittstelle aus.

2.5 ESGET V

Ein Zeichen von der zweiten seriellen Schnittstelle wird eingelesen und in die Varaiable V gespeichert. Diese Funktion ist aber nur beim ATMega644P nutzbar, und nur wenn der Eingangspin der seriellen System-Schnittstelle auf PD1 liegt. Ansonsten wird mit einer Fehlermeldung abgebrochen. Die Funktion kehrt erst zurück wenn das Zeichen eingelesen wurde, alternativ kann mit der ESC Taste abgebrochen werden. In diesem fall wird der Wert -1 zurückgegeben.
01 ESGET C
wartet auf ein Zeichen von der zweiten seriellen Schnittstelle und speichert die in die Variable C

2.6 EBAUD n

Hiermit können die Bitrate und weitere Parameter der zweiten seriellen Schnittstelle des ATMega644P eingestellt werden. Diese Funktion ist aber nur nutzbar, wenn der Eingangspin der seriellen System-Schnittstelle auf PD1 liegt. Ansonsten wird mit einer Fehlermeldung abgebrochen.
Die Bits 0...2 sind für die Bitrate verantwortlich, dabei sind folgende Bitraten möglich:


bbb Bitrate (Bps)
000 1200
001 2400
010 4800
011 9600 (default)
100 19200
101 31250 (MIDI)
110 38400
111 57600


Mit Bit 4 kann die Anzahl der Stopp-Bits eingestellt werden:


b Stopp-Bits
0 1 Stopp-Bit
1 2 Stopp-Bits


Mit den Bits 5...7 lässt sich eines von 8 verschiedenen Datenformaten wählen:


bbb Format
000 8 Bit, kein Parity-Bit
001 8 Bit, gerade Parity
010 6 Bit, kein Parity-Bit
011 8 Bit, ungerade Parity
100 7 Bit, kein Parity-Bit
101 7 Bit, gerade Parity
110 5 Bit, kein Parity-Bit
111 7 Bit, ungerade Parity


Die Modi 0x00...0x07 sind dabei kompatibel zu früheren Versionen. Weitere Einstellmöglichkeiten ergeben sich natürlich, wenn über OUT Befehle direkt auf die Register des USART zugegriffen wird.
01 EBAUD 5
setzt die Bitrate der zweiten seriellen Schnittstelle auf 31250Bps (MIDI), Format 8/N/1.

2.7 PUMP n

Schaltet die Ladungspumpe für die serielle Schnittstelle aus (n=0) oder ein (n=1).
01 PU 1
schaltet die Ladungspumpe ein. Die Ladungspumpe ist auch per default nach dem Start eingeschaltet.

2.8 XSEND n,a

gibt einen Datenblock aus dem Array über das XMODEM Protokoll aus. N ist dabei die Blocknummer und a die Arrayposition (0...640). Um das ACK/NAK Handling muss man allerdings selbst kümmern.
01 SGET C:IF C<>21 THEN GOTO 1
02 FOR Z=0 TO 5:A=Z*128
03 XSEND Z,A
04 SGET C:IF C=21 THEN GOTO 3
05 NEXT:SPUT 4
Dieses Programm sendet den kompletten Array-Inhalt via X-Modem an ein anderes Gerät.

2.9 XREC(a)

liest einen Datenblock über das XMODEM Protokoll in das Array ein. A ist dabei die Arrayposition (0...640). Um das ACK/NAK und Error Handling muss man allerdings wieder selbst kümmern.
01 SPUT 21
02 FOR Z=0 TO 5:A=Z*128
03 C=XREC(A):SPUT 6:NEXT
04 SGET C: SPUT 6
Dieses Programm liest den kompletten Array-Inhalt via X-Modem von einem anderen Gerät. Bei einem Empfangsfehler wird einfach abgebrochen. Dies könnte aber mit ONERR abgefangen werden.

2.10 ICOMM adr,start,num [IC]

Generische I2C Routine. Der Erste Parameter adr gibt die Slave-Adresse an. Gleichzeitig wird mit Bit 0 festgelgt, ob geschrieben (0) oder gelesen (1) werden soll. Die beiden anderen Parameter geben die Startadresse im Array und die Anzahl der zu übertragenden Bytes an.
01 DATA HI(B),LO(B),LO(A),HI(A):ICOMM $a0,0,4
02 SYNC 1
Schreibt den Wert der Variable A an die Adresse B eines I2C-EEPROMs (>24C16) mit der Adresse 0. Dabei ist auf die Reihenfolge der Bytes zu achten, da Beim I2C EEPROM zuerst das High-Byte der Adresse und danach das Low-Byte der Adresseübertragen werden muss. Um eventuelle Wartezeiten nach der Aktion muss man sich selbst kümmern, Ein Schreiben in den EEPROM mit darauffolgendem Lesen gibt mit hoher Sicherheit einen I2C-Fehler,SYNC 2 schafft eine Pause von mindestens 20ms. Wird die Anzahl der zu schreibenden Bytes auf 0 gesetzt, werden solange Bytes aus dem Array ausgegeben, bis 0x00 erkannt wird. Im Lesemodus bedeutet eine 0 als Anzahl, dass als erstes die Anzahl der zu lesenden Bytes eingelesen wird. Ein I2C-Slave, der nichts senden möchte, muss also nur ein 0x00 zurücksenden, welches mit einem ACK beantwortet wird. Ein Dummy-Byte wie in vorherigen Versionen ist nicht mehr nötig.

3 Speicher



3.1 EPOKE adr,dat [EP]

Speichert ein Datenbyte in den internen EEPROM. Als Adressen sind 0...1999 möglich.
02 EPOKE V,$12
speichert den Wert 18 an die Adresse V im internen EEPROM.

3.2 EPEEK(adr)

Die Funktion liest ein Byte aus dem internen EEPROM. Als Adressen sind 0...1999 möglich.
02 W=EPEEK(V)
liest den Wert von EEPROM-Adresse V (internes EEPROM) und speichert diesen in der Variable W.
An die I2C-Schnittstelle kann ein zusätzlichs EEPROM (derzeit nur 24C64...24C512) angeschlossen werden. Bei anderen Typen lässt sich die gleiche Funktionalität (etwas umständlicher) über ICOMM realisieren.

3.3 XPOKE adr,dat [XP]

Speichert ein Byte im externen EEPROM, die Baustein-Adresse ist im Konfigurationsmenü festgelegt und nur dort einstellbar. Die Baustein-Adressen 6 und 7 sind für SRAM/FRAM vorbehalten, da hier nicht gewartet wird, bis der Schreibvorgang abgeschlossen ist.
01 XPOKE 100,C
speichert den Wert der Variablen C an die Adresse 100.

3.4 XPEEK(adr)

Die Funktion liest ein Byte aus dem externen EEPROM. Als Adressen sind 0...$FFFF möglich.
02 W=XPEEK(100)
liest den Wert von EEPROM-Adresse 100 /externes EEPROM) und speichert diesen in der Variable W.

3.5 VPOKE adr,dat [VP]

Dieser Befehl schreibt ein Byte in den Bildspeicher. Als Adressen sind 0...2759 möglich.
01 VPOKE 0,66:VPOKE 690,$08
schreibt ein schwarzes "B" auf grünem Grund in die linke obere Bildschirmecke.

3.6 VPOKE adr,arrayadr,num [VP]

Werden bei VPOKE drei Parameter angegeben, ist es möglich ganze Byte-Sequenzen auf einmal in den Bildspeicher zu schreiben. Als Adresse wieder sind 0...2759 möglich. Zweiter Parameter ist eine Arrayposition im Bytebereich, ab der die zu schreibenden Daten stehen. Als dritter Parameter wird angegeben, wie oft die Sequenz in den Bildspeicher geschrieben wird.
Im Array selbst stehen die Daten paarweise als Bytes. Das erste Byte gibt den zu schreibenden Wert an und das zweite Byte die danach zu überspringenden Bytes. Der zweite Wert kann zwischen 0 und 127 liegen, ist Bit 7 gesetzt (Wert > 127) wird 128 abgezogen, der Offset normal ausgeführt und danach die Sequenz beendet.
01 DA 0,65,0,66,0,67,27+128
02 VP 0,0,10
schreibt 10x untereinander "ABC".

3.7 VPEEK(adr)

Die Funktion liest ein Byte aus dem Bildspeicher. Als Adressen sind 0...2759 möglich.
01 ? "A"
02 ? VPEEK(0)
sollte in der ersten Zeile ein "A" und in der zweiten Zeile 65 (das ist der ASCII-Wert von "A") ausgeben.

3.8 PAGE num

Mit dieser Funktionlässt sich die Position des Array-Bereiches 768...1023 im externen Speicher festlegen. Als Werte sind 0...255 möglich, das gibt einen theoretisch nutzbaren Speicherbereich von 64 Kilobytes.
01 PAGE 0
setzt das Fenster auf die ersten 256 Bytes im externen RAM.

3.9 CCHAR src-char,dest-char

Kopiert im Videomodus 4 einzelne Zeichen vom eingebauten ROM-Zeichensatz in den benutzerdefinierten Zeichensatz. Src-char ist dabei die Zeichennummer im ROM-Zeichensatz (0...255) und dest-char die Zeichennummer im RAM Zeichensatz (0...127). Sollen mehrere Zeichen kopiert werden, muß dies z.B. in einer Schleife geschehen.

3.10 CCHAR src-char,dest-char,color

Kopiert im Videomodus 6 einzelne Zeichen vom eingebauten ROM-Zeichensatz in den benutzerdefinierten Zeichensatz. Src-char ist dabei die Zeichennummer im ROM-Zeichensatz (0...255) und dest-char die Zeichennummer im RAM Zeichensatz (0...63). Der Wert color ergibt sich aus Vordergrundfarbe+16*Hintergrundfarbe für die Kopie. Sollen mehrere Zeichen kopiert werden, muß dies z.B. in einer Schleife geschehen.

4 Dateisystem-Funktionen

Wenn Sie bereits mit Personal Computern vertraut sind, werden Sie jetzt ein klein wenig umdenken müssen, da das Dateisystem von AVR-ChipBasic2 ein bisschen anders aufgebaut ist. Voraussetzung um mit Dateien arbeiten zu können ist ein Dataflash-Modul, welches in den Programmier-Port gesteckt wird. Je nach Typ können bis zu 0,5 oder 1 Megabyte Daten gespeichert werden. Natürlich ist es immer etwas weniger, denn die Daten wollen auch organisiert werden, was wiederum Speicherplatz auf dem Medium beansprucht. Um mit dem Dataflash-Modul arbeiten zu können, muss dieses "formatiert" werden. Das geschieht im DFLASH Menü, welches über das Hauptmenü erreichbar ist. Im Gegensatz zu flüchtigen Speichern (RAM) oder Festplatten sind Schreibzugriffe auf Flash oder EEPROM Speicher nur in begrenzter Anzahl möglich. Meistens liegt diese Zahl zwischen 10000 und 1 Million, je nach Speichertyp und Hersteller. Um die Speicherblöcke möglichst gleichmäßig "abzunutzen" enthalten sie einen Zähler, der bei jedem Schreibvorgang um 1 erhöht wird. Wenn eine Datei erzeugt wird, werden nun Blöcke mit möglichst niedrigem Zählerstand verwendet und auch beim häufigen Schreiben auf den gleichen Block kann es passieren, dass ein neuer Block mit niedrigerem Zählerstand gesucht wird. Darum muss man sich aber nicht kümmern, das Ganze passiert völlig transparent, kann aber zu kurzzeitigen Verzögerungen im Programmablauf führen. Die Dataflash-Module sollten nicht allzu häufig formatiert werden, da dabei die Informationen über den "Abnutzungsgrad" der Blöcke verloren gehen. Der freie Speicherplatz ist in Blöcke (Pages) von 256 Bytes aufgeteilt, die wiederum maximal 128/256 Dateien (Files) zugeordnet werden können. Jede Datei kann minimal 1 und maximal 128 Datenblöcke enthalten was Dateigrößen von 256 Bytes bis 32 Kilobytes erlaubt. Dateinamen, wie man sie vom PC her kennt, gibt es hier aber nicht. Damit Dateien in der Fileselect-Box unterscheidbar sind, haben sie einen fest eincodierten Typ und die ersten 12 Bytes werden als Dateiname angezeigt. Wenn USR Dateien angelegt werden, sollte auch in die ersten 12 Bytes eine mehr oder weniger eindeutige Identifizierung geschrieben werden. Der Einfachkeit halber kann man auch den ersten Block der Datei nur für den Namen reservieren, auch wenn dadurch Speicherplatz verschenkt wird. Ansonsten wird einfach mit der Dateinummer gearbeitet. Zusätzlich gibt es noch die Befehle RREAD und RWRITE, mit denen Pages im Dataflash direkt gelesen oder geschrieben werden können.

4.1 FTYPE(n)

Die Funktion FTYPE liefert entweder den Flashtyp (n=-1) oder der Dateityp der Datei n. Für n=-1 ist das Resultat


Wert Bedeutung
0 kein Dataflash angeschlossen
2048 4MBit Dataflash angeschlossen
4096 8MBit Dataflash angeschlossen


für 0<=n<=255 ist das Resultat (derzeit)


Wert Bedeutung
252 Datei ist nicht belegt
16 BASIC-Programm
18 Backup-Datei
20 USR-Datei
22 Chip8-Datei
24 AVR-Binärdatei
26 GPS-Positionsliste
28 Sampling data (Messdaten)
30 Logikblock-Definition
31 Image-Datei
32 Screenshot-Datei
34 S12(X)-Binärdatei
-1 Dateinummer existiert nicht




4.2 FSIZE(n)

Die Funktion FSIZE(n) liefert entweder die Zahl der verfügbaren Files/Pages oder die Größe einer datei in 256Bytes-Pages.


n Rückgabewert
-1 Anzahl der freien Files
-2 Anzahl der freien Pages
0...255 Anzahl der Pages in der Datei oder 0 (nicht belegt)




4.3 FCREATE f,p [FCR]

Erzeugt das USR-File f mit p Pages. Die Anzahl der Pages kann dabei zwischen 1 und 128 liegen was einer Dateigröße von 256 Bytes...32 Kbytes entspricht. Da FCREATE im Fehlerfall abbricht, sollte vorher mit FTYPE und FSIZE sichergestellt werden, dass die Datei auch erzeugt werden kann. Es werden immer Files vom Typ USR (Dateityp 0x14) erzeugt, ausser es wird als dritter Parameter ein anderer Dateityp angegeben.
40 'create file F with P pages
41 'R=F or -1 if failed
42 R=-1:IF P<1 THEN RETURN
43 IF P>128 THEN RETURN
44 IF FTYPE(-1)=0 THEN RETURN
45 IF FTYPE(F)<>0 THEN RETURN
46 IF FSIZE(-2)<P THEN RETURN
47 FCREATE F,P: R=F: RETURN
Die Subroutine erzeugt das File F mit P Pages, wenn dies möglich ist. In der Variable R steht dann das Resultat: entweder die Filenummer F oder -1, falls das Anlegen des Files nicht möglich ist. Zu beachten ist dabei, daß für diese Funktion das letzte Drittel des Array (Zelle 512-767) temporär genutzt wird und dort befindliche Daten überschrieben werden.

4.4 FWRITE f,p,a [FWR]

Schreibt 256 Bytes aus dem Array in die Page P von File F. Der dritte Parameter bestimmt die Arrayposition:


a Arraybereich
0 0...255
1 256...511
2 512...767


Da FWRITE im Fehlerfall abbricht, sollte vorher mit FTYPE und FSIZE sichergestellt werden, dass die Page auch geschrieben werden kann.
50 'write array 0...255 to
51 'file F in page P
52 R=-1:IF P<1 THEN RETURN
53 IF FTYPE(F)<>20 THEN RETURN
54 IF P>FSIZE(F) THEN RETURN
55 FWRITE F,N,0: R=F: RETURN
Die Subroutine schreibt den Inhalt der Arrayzellen 0...255 in die Page P von File F. In der Variable R steht das Resultat: entweder die Filenummer F oder -1, falls das Schreiben der Page nicht möglich ist.

4.5 FREAD f,p,a [FRD]

Liest 256 Bytes aus Page P von File F und schreibt sie in das Array. Der dritte Parameter bestimmt wieder die Arrayposition:


a Arraybereich
0 0...255
1 256...511
2 512...767


Da FREAD im Fehlerfall abbricht, sollte vorher mit FTYPE und FSIZE sichergestellt werden, dass die Page auch gelesen werden kann.
50 'read page P of file F to
51 'array 256...511
52 R=-1:IF P<1 THEN RETURN
53 IF FTYPE(F)<>20 THEN RETURN
54 IF P>FSIZE(F) THEN RETURN
55 FREAD F,N,1: R=F: RETURN
Die Subroutine liest den Inhalt der Page P von File F in die Arrayzellen 256...511. In der Variable R steht das Resultat: entweder die Filenummer F oder -1, falls das Lesen der Page nicht möglich ist.

4.6 FDELETE f [FDEL]

Löscht das File F, wenn es vorhanden und vom Typ USR ist. Da FDELETE im Fehlerfall abbricht, sollte vorher mit FTYPE und FSIZE sichergestellt werden, dass das File vorhanden ist.
56 'delete file F
57 R=-1
58 IF FTYPE(F)<>20 THEN RETURN
59 FDELETE F: R=F: RETURN
Die Subroutine löscht das File F, falls es vorhanden ist.

4.7 FSELECT v,a [FSEL]

Stellt die Fileselect-Box dar, falls ein formatierter Dataflash-Baustein angeschlossen ist. Die Nummer des gewählten Files liegt im Anschluss in der Variable v. Ist der Dataflash nicht ansprechbar oder wird die Auswahl mit der ESC-Taste abgebrochen, wird die Variable v auf -1 gesetzt. Der wert a ist die Array-Position, ab der die nullterminierte Boxüberschrift steht. Der Rahmen der Fileselct-Box wird mit der aktuell eingestellten Vordergrundfarbe gezeichnet, der Hintergrund ist immer schwarz. Der ursprüngliche Bildinhalt wird nach Verlassen der Fileselect-Box wiederhergestellt.
60 'draw fileselct box
61 DATA 0,"Select file:",0
62 FSELECT F,0: RETURN
Die Subroutine zeigt eine Filelesect-Box mit dem Titel "Select file:".

4.8 FFIND(a)

Da das Dateisystem nicht mit Verzeichnissen arbeitet, braucht man die Dateinummer um in eine bestimmte Datei zu schreiben oder von ihr zu lesen. Dazu dient die Funktion FFIND. Der Parameter a ist wieder ein Zeiger auf den Bytebereich des Arrays. Das erste Byte gibt den gesuchten Dateityp an (siehe Tabelle oben), danach folgt die Anzahl der zu vergleichenden Bytes am Anfang der Datei und das Vergleichsmuster. Rückgabewert ist die erste gefundene Dateinummer oder -1, falls keine entsprechende Datei gefunden wurde.
10 DATA 0,252,0:F=FFIND(0)
Es wird nach der ersten freien Datei gesucht (Kennung 252) und liefert die Dateinummer bzw. -1 falls keine freie Datei mehr vorhanden ist.

5 Direktzugriff auf das Dataflash-Modul

In manchen Fällen kann es sinnvoll sein, anstelle der Dateisystemfunktionen Daten direkt auf das Dataflash-Modul zu schreiben oder von dort zu lesen. Dazu dienen die folgenden beiden Befehle:

5.1 RREAD p,a [RRD]

Liest 256 Bytes aus Page P und schreibt sie in das Array. P ist hierbei die Page-Nummer im Dataflash und bezieht sich nicht auf eine Datei. Der zweite Parameter bestimmt wieder die Arrayposition:


a Arraybereich
0 0...255
1 256...511
2 512...767


Da RREAD im Fehlerfall abbricht, sollte sichergestellt sein, dass die Page auch gelesen werden kann.

5.2 RWRITE p,a [RWR]

Schreibt 256 Bytes aus dem Array in die Page P. P ist hierbei die Page-Nummer im Dataflash und bezieht sich nicht auf eine Datei.
Achtung! Diese Funktion kann das Dateisystem zerstören und sollte deshalb nur mit Vorsicht oder auf unformatierte Dataflash-Bausteine angewendet werden. Der zweite Parameter bestimmt die Arrayposition:


a Arraybereich
0 0...255
1 256...511
2 512...767


Da RWRITE im Fehlerfall abbricht, sollte sichergestellt sein, dass die Page auch geschrieben werden kann.

6 Laden und Speichern von Programmen

Da die BASIC Programme mit 95 Zeilen a 32 Zeichen nicht gerade sehr üppig ausgestattet sind, gibt es die Möglichkeit, Programme während der Laufzeit auf den Dataflash zu schreiben oder von dort zu laden.

6.1 LOADP f,p

Lädt das Programm mit der Dateinummer f an den Programmplatz p. Dabei ist es nicht möglich, das gerade laufende Programm zu überschreiben. Wird dies versucht, bricht das Programm mit einer Fehlermeldung ab.

6.2 SAVEP f,p

Schreibt das Programm von Programmplatz n in die Datei mit der Nummer f. Dazu muß die Datei entweder nicht vorhanden oder eine Programmdatei sein. VORSICHT, eine eventuell vorhandene Datei wird ohne Nachfrage überschrieben!
10 DATA 0,252,0:C=FFIND(0)
11 IF C<0 THEN E=1:RETURN 
12 DATA 0,16,4,"Test"
13 D=FFIND(0)
14 IF D<0 THEN E=2:RETURN 
15 SAVEP C,8:LOADP D,8
16 GOSUB 8,1:LOADP C,8
17 FDELETE C:E=0:RETURN
Dieses Unterprogramm sucht nach einem freien Dateiplatz und nach einer Programmdatei, die mit "Hallo" beginnt. Ist beides gefunden, wird das aktuelle Programm 8 auf dem freien Speicherplatz gesichert, das Hallo-Programm in Programmplatz 8 geladen und dann mittelx GOSUB gestartet. Wenn das Programm dann mittels RETURN zurückkehrt, wird das ursprünglich an Programmplatz 8 befindliche Programm wiederhergestellt und die temporär erzeugte Datei gelöscht. Das aufgerufene Programm sollte dabei die Variable C nicht ändern.

7 Meldungen und Fragen in der Box



7.1 ALERT n

Zeigt eine Alert-Box an. Die Daten dazu befinden sich im Array ab Position n. Als Erstes steht dort ein Byte (Vordergrundfarbe + 16 * Hintergrundfarbe), gefolgt von nullterminiertem Text. Fehlt der Abschluss mit 0x00, wird die Ausgabe nach 20 Zeichen abgebrochen. Der aktuelle Bildschirminhalt wird vorher gesichert und nach Betätigen der ENTER Taste wieder restauriert.
01 DATA 0,97,"Hallo Welt",0
02 ALERT 0
Zeichnet eine Alertbox mit blauer Schrift Hallo Welt auf gelbem Grund. Wird die Enter Taste gedrückt, verschwindet die Box wieder.

7.2 ASK V,n

Zeigt eine Frage-Box an. Die Daten dazu befinden sich im Array ab Position n. Zuerst steht dort ein Byte (Vordergrundfarbe + 16 * Hintergrundfarbe), gefolgt von nullterminiertem Text. Fehlt der Wert 0x00, wird die Ausgabe nach 20 Zeichen abgebrochen.
01 DATA 0,97,"Weitermachen?",0
02 ASK P,0
03 IF P=0 WAIT 20: GOTO 2
04 ? "Ende"
Wenn "Y" oder Enter gedrückt wurde, bekommt P den Wert 1 zugewiesen, wurde "N" oder ESC gedrückt, erhält P den Wert 0. Groß- und Kleinschreibung spielt dabei keine Rolle. Der aktuelle Bildschirminhalt wird vorher gesichert und nach Betätigen einer gültigen Taste wieder restauriert.

8 Menü-Funktionen



8.1 MENU(n)

Die Funktion MENU(n) zeigt ein User-definiertes Menu an. Dabei zeigt n auf eine Zeile im aktuellen Programm, ab der in 1 oder 2 Kommentarzeilen Arraytext hinterlegt sind. Das letzte Zeichen in der ersten Zeile enthält zwei Steuerbits. Diese lsssen sich z.B. mittels der Ziffern "0"..."3" einstellen:


Zeichen Menü-Eigenschaften
0 Eine Menü-Ebene, Funktion kehrt nur beim Drücken einer der in der nächsten Tabelle gelisteten Tasten zurück.
1 Zwei Menü-Ebenen, Funktion kehrt nur beim Drücken einer der in der nächsten Tabelle gelisteten Tasten zurück.
2 Eine Menü-Ebene, Funktion kehrt nur beim Drücken einer beliebigen Taste zurück (ausser Shift, CTrl und Alt).
2 Zwei Menü-Ebenen, Funktion kehrt nur beim Drücken einer beliebigen Taste zurück (ausser Shift, CTrl und Alt).


Die folgende Tabelle listet die Rückgabewerte auf, die beim Betätigen der Tasten ESC und F1...F3 auf. Für alle anderen tasten wird der "normale" Tastencode zurückgeliefert.
Offset Taste Rückgabewert
0...5 ESC 1
6...11 F1 2
12...17 F2 3
18...23 F3 4
24...29 F4 5
30...35 linke CTRL + ESC 6
36...41 linke CTRL + F1 7
42...47 linke CTRL + F2 8
48...53 linke CTRL + F3 9
54...59 linke CTRL + F4 10


Das folgende Programm zeigt ein Beispielmenü an. Die Daten dazu befinden sich in den Zeillen 1 und 2
01 '1111112222223333334444445555551
02 '666666777777888888999999AAAAAA
03 A=MENU(1)
04 ? @0,0;"Menu:",A," "
05 B=KEY(2):IF A>1 GOTO 3
Mit der linken CTRL-Taste kann zwischen beiden Menüebenen hin- und hergeschaltet werden. Dabei wird gewartet, bis eine gültige Taste (ESC, F1...F4) gedrückt wurde und in der obersten Zeile wird der letzte Rückgabewert angezeigt.ESC bricht das Programm ab.

created with latex2web.pl v0.63 © 2006-2013 Joerg Wolfram