
Wahlfreier
Speicherzugriff
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