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.
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:
Setzt D0 auf 0-Pegel.
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.
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.
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.
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.
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 |
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.
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.
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.
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).
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.
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.
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.
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.
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.
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.
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
|