Si Law....molto sudore
Ho sistemato un po' la routine. é ampiamente commentata. L'errore di lettura detto un po' alla buona era che io andavo a testare la linea sda (quella che "contiene" il bit)
dopo aver fatto il clock, pensando che rimanesse in quello stato...invece no, va testata all'interno del ciclo di clock.
é un po' un casino da spiegare, ma chi ha letto un po' sull'i2c, sa a cosa mi riferisco.
Poi, per quanto riguarda la lettura dei bit entranti, cioè dalla eprom al pic ho fatto in un modo un po' diverso da quello che ho visto in giro.
Se la eprom deve inviare il numero B'11000001', spedirà così:
1 primo bit (cioè il più significativo del numero finale che ricevera il master)
1 secondo bit
0 terzo
0 quarto
0 quinto
0 sesto
0 settimo
1 ottavo
man mano che il registro adibito a buffer del pic li riceve, li shifta verso sinistra per poi avere il numero finale.
Di solito mi pare che la procedura sia questa, io l'ho usata per inviare dati, slave address ecc.
Ma in fase di lettura, faccio in modo diverso.
Mi precarico in un registro il numero 255 B'11111111', ma potrei fare anche B'00000000', basterebbe solo cambiare la logiga del test
Poi, andando a vedere se la linea sda è alta (cioè bit 1 entrante) o bassa (bit zero entrante) faccio:
TESTA SDA: ALTA? SI LASCIA IMMUTATO BIT 0 del registro precaricato
bassa? azzera relativo bit
ecc...
Logicamente al primo test, cioè quando lo slave manda il bit più significativo, io dovrò azzerare o meno il settimo bit del registro... non il primo.
é comunque una bozza...per esempio le varie rotines read andrebbero eliminate e fatta una sola valida per tutti gli otto bit. Funziona bene anche così, ma occupa più memoria di una sola richiamabile
con una CALL
Bhè ragazzi io ci ho provato a farmi capire....ma sono un po' una zappa a spiegarmi
quindi allego il listato