Wenn Sie Datenfiles im EEPROM der CC-Unit anlegen, dann haben Sie immer nur einen sequentiellen Zugriff, d.h. Daten werden immer hintereinander als Words abgelegt, wobei jeder Speicherzugriff zwei Bytes benötigt. CC-Basic erlaubt auch nur ein Datenfile. Das ist für viele Aufgaben gut und einfach einzusetzen, aber es ist nicht sehr flexibel.
Datenblatt des 24C65 lesen (auf der CD direkt ausführbar)
Ganz anders wäre es bei einem wahlfreien Zugriff. Sie könnte jedes der 8192 Bytes im EEPROM direkt lesen und verändern. Sie könnten mehrere Datenfiles verwalten, Sie könnten platzsparend Einzelbytes ablegen, und Sie könnten jede Menge Fehler bauen, indem Sie sich z.B. das laufende Basic-Programm überschreiben.
Sie könnten? Nein Sie können!
Mit dem folgenden kleinen Assemblerprogramm haben Sie den gewünschten wahlfreien Zugriff. Insgesamt vier Bytes werden zwischen Basic und Maschinenprogramm ausgetauscht: I²C-Busadresse, Datenbyte und zwei Bytes für die interne Adresse des EEPROM. Schreibzugriffe erfordern einen Einsprung bei &H101, Lesezugriffe bei &H130. Das Programm verwendet Systemaufrufe aus dem CC-Betriebssystem, die schon in [1] erläutert wurden.
;Wahlfreier Zugriff auf ein EEPROM EEIO.ASM AdrI2C .equ $A1 ;Übergabe Busadresse Dat .equ $A2 ;Daten in/out AdrHi .equ $A3 ;interne Adresse AdrLo .equ $A4 ;als Word .org $101 ;Einsprung $101, Daten schreiben ;CC-EEPROM vom Bus abmelden jsr $08BB ;I2C_ReadLast ;Byte in eigenes EEPROM schreiben ldx AdrI2C ;I2C-Adresse jsr $083C ;I2C_Start ldx AdrHi ;Adr High jsr $0846 ;I2C_Write ldx AdrLo ;Adr low jsr $0846 ;I2C_Write ldx Dat ;Daten jsr $0846 ;I2C_Write jsr $08E5 ;I2C_Stop ;CC-EEPROM wieder anmelden ldx #$0A0 ;Adresse 24C65, write jsr $083C ;I2C_Start ldx $066 ;AdrCounter Hi jsr $0846 ;I2C_Write ldx $067 ;AdrCounter Lo jsr $0846 ;I2C_Write ldx #$0A1 ;Adresse 24C65, read jsr $083C ;I2C_Start rts ;Einsprung $130, Daten lesen ;CC-EEPROM vom Bus abmelden jsr $08BB ;I2C_ReadLast ;Byte aus eigenem EEPROM lesen ldx AdrI2C ;I2C-Adresse jsr $083C ;I2C_Start ldx AdrHi ;Adr High jsr $0846 ;I2C_Write ldx AdrLo ;Adr low jsr $0846 ;I2C_Write ldx $0A1 ;I2C-Adresse incx ;Adr+1, Lesen jsr $083C ;I2C_Start jsr $086F ;I2C_Read sta Dat ;Daten speichern jsr $08BB ;I2C_ReadLast ;CC-EEPROM wieder anmelden ldx #$0A0 ;Adresse 24C65, write jsr $083C ;I2C_Start ldx $066 ;AdrCounter Hi jsr $0846 ;I2C_Write ldx $067 ;AdrCounter Lo jsr $0846 ;I2C_Write ldx #$0A1 ;Adresse 24C65, read jsr $083C ;I2C_Start rts .end
Ein erstes kleines Programm soll den Lesezugriff demonstrieren, wobei ein kleines Basic-Programm sich selbst in Tokenform aus dem Speicher liest. Die I²C-Adresse ist hier &HA0. Das ist die Basisadresse des EEPROMs auf der CC-Unit. Haben Sie es bemerkt? Hier kann man ganz locker die Adresse eines eignen, zusätzlichen Speicherbausteins angeben.
'************************************** ' ' C-Control/BASIC EEio1.BAS ' ' Aufgabe: ' ' - Wahlfreier Zugriff auf ein EEPROM ' - Auslesen der CC-EEPROM-Inhalte ' '************************************** ' --- Definitionen -------------------- define AdrI2C byte define Dat byte define Adr word ' --- Programmoperationen ------------- AdrI2C = &H0A0 'CC-EEPROM for Adr = 0 to 40 sys &H130 'EEPROM lesen print Dat, next Adr end syscode "EEio.obj"
EEIO1.BAS starten (Auf der CD: direktes Download in die Unit)
Terminal starten (nur auf der CD möglich)
Das Programm hat übrigens eine Länge von 35 Bytes. Wer genau hinschaut, kann den Aufbau im EEPROM entschlüsseln. Nähere Informationen dazu findet man in [2].
Die ersten 40 Bytes im CC-EEPROM
Wahlfreie Schreibzugriffe auf das EEPROM der CC-Unit sind nun auch nicht schwieriger. Das folgende Programm beschreibt den Adressbereich 4000 bis 4255 mit einer aufsteigenden Zahlenfolge. Die Daten werden dann zur Kontrolle wieder zurückgelesen.
'************************************** ' ' C-Control/BASIC EEio2.BAS ' ' Aufgabe: ' ' - Wahlfreier Zugriff auf ein EEPROM ' - Schreiben eines Datenbereichs ' '************************************** ' --- Definitionen -------------------- define AdrI2C byte define Dat byte define Adr word ' --- Programmoperationen ------------- AdrI2C = &H0A0 'CC-EEPROM for Dat = 000 to 255 adr = 4000 + Dat sys &H101 'EEPROM schreiben next Dat for Adr = 4000 to 4255 sys &H130 'EEPROM lesen print Dat, next Adr end 'syscode "EEio.obj"
EEio2 starten
Terminal starten