Hi,
@PIC18F2550
SPEAK.spin ist eigentlich nur ein I2C-Treiber.
Im Abschnitt "i2c_read" liest er ein Byte nach dem anderen aus EEPROM #1 oder #2.
Code: Alles auswählen
'*********************************************************************************************************
i2c_read andn dira, _sdamask ' set sda to input
mov _data, #0
mov _loop_cnt, #8
mov _delay, cnt
add _delay, _i2cd
:bit_loop waitcnt _delay, _i2cd ' delay 1/4 period
shl _data, #1
or outa, _sclmask ' set clock high
waitcnt _delay, _i2cd ' delay 1/4 period
and _sdamask, ina wz, nr ' test data input bit
if_nz add _data, #1 ' set bit in output data if input bit was high
waitcnt _delay, _i2cd ' delay 1/4 period
andn outa, _sclmask ' set clock low
waitcnt _delay, _i2cd ' delay 1/4 period
djnz _loop_cnt, #:bit_loop
cmp _count, #1 wz, nr ' see if this is not the last byte to read
if_nz andn outa, _sdamask ' generate an ack by setting sda low
if_z or outa, _sdamask ' generate a nack
or dira, _sdamask ' set sda back to output
waitcnt _delay, _i2cd ' delay 1/4 period
or outa, _sclmask ' set clock high
waitcnt _delay, _i2cd ' delay 1/4 period
waitcnt _delay, _i2cd ' delay 1/4 period
andn outa, _sclmask ' set clock low
waitcnt _delay, _i2cd ' delay 1/4 period
shl _data, #24 ' <-- Das gelesene Byte wird 24x nach links geshiftet = 32 Bit Wert
mov frqa, _data ' <-- Der 32-Bit Wert wird in Counter A (frqa) geschrieben
i2c_read_ret ret
'*********************************************************************************************************
Der Counter A (es gibt auch B) muss natürlich vorher im richtigen Modus initialisiert werden.
Aber das wäre jetzt zu ausführlich.
Gruss
Werner
P.S.
Die Ausgabegeschwindigket kann durch die Konstante "outdelay" im DAT Abschnitt
verändert werden. 5500 ist ungefähr original SP0256-AL2 mit 3.12 Mhz.
Um so kleiner der Wert, um so mehr Micky Maus.
![Überglücklich :D](./images/smilies/icon_e_biggrin.gif)