Newsgroup: it.hobby.elettronica.digitale
Titolo: I2C,questo bastardo

sto cercando di fare parlare un microcontrollore,16f57 con una EEprom
seriale x24c02
quando mando il send,dopo vere mandato lo start,a seconda di come gli gira
mi manda o non mi manda l'acknowledge che deve tirare a livello basso il
pullup su SDA
sto usando tempi lunghi,es clock da 8 uS,quando il minimo č 4
dove posso sbagliare?
avendo messo una routine in loop temo di avere superato il num max di
write(100.000),dovrebbe comportare comunque una anomalia sull'ack?
grazie

 dove posso sbagliare?
Mi sembra che il segnale di ACK sia da attendere fino al raggiungimento
di un timeout prefissato e non bisogna aspettarselo subito al ciclo di
clock successivo. Questa è una raccomandazione in particolare valida
con le EEprom, dato che l'accesso puo' durare parecchio tempo.
Se vuoi verificare se il problema è quello, prova a rallentare in
maniera abnorme il clock (che ne so, prendendo un clock di qualche
decina di Hz) e guarda se la comunicazione avviene correttamente.
Tutto questo ovviamente vale se ho inteso correttamente i termini del
tuo problema e se la memoria non mi inganna.
Che routine stai usando per comunicare con la I2C? Le stai sviluppando
tu, oppure le hai trovate su Internet?

 write(100.000),dovrebbe comportare comunque una anomalia sull'ack?
Dimenticavo: si, puo' darsi, ma non sono sicuro. Dovresti verificare
sul datasheet della EEprom

 wrote in message
1158936753.7...@h48g2000cwc.googlegroups.com...
blisca a écrit :


si,il numero è 100000 e penso di averle superate,avendo lasciato
inavvertitamente andare il loop per molti minuti
sto usando 20k di pull up
ok,proverò comunque a mettere un 'attesa
la routine l'ho trovata,ma poi l'ho corretta in quanto col mio piccolo
analizzatore di stati logici (a 8 bit!) vedevo delle cose sbagliate
sto usando questa sequenza
per scrivere:
hi-z
i2cstart
i2csend  address device per scrittura(10100000 nel mio caso)
i2csend  addrss della word  es. 6
i2csend dato  es .183
i2c stop   ;e fino a qui tutto bene
lunga pausa
                    per leggere :
i2cstart
i2csend  address device per scrittura dummy(10100000 nel mio caso)
i2csend  addrss della word  es. 6
i2cstart
i2csend  address device per lettura(10100001 quindi)
i2csend  addrss della word  es. 6
i2creceive
i2cstop
gli errori avvengono nell aprte di scrittura


comunque in questo istante mettendo ritardi di decimi di secondo(!) dopo gli
stop funziona,approfondirò

 stop funziona,approfondirņ
Ecco perchč non sei venuto al Bias ...  :)))
Ciao
Luigi 

 stop funziona,approfondirò
Dai nomi delle funzioni che indichi, ho il sospetto che se lavori in
assembly è probabile che la versione che hai trovato su Internet delle
routine sia quella che ho scritto io un paio di anni fa:
http://www.geocities.com/leibowitz.geo/pic_i2c.html
Se è cosi', sarei ovviamente interessatissimo a conoscere gli errori
che hai trovato (nel mio caso le routine funzionano perfettamente, ma
avro' sicuramente tralasciato qualcosa), dato che non ho un
analizzatore logico.
Del resto, ero a conoscenza del problema dell'ACK ed è per questo che
ad un certo punto scrivo:
---
; Questa versione di i2cwaitack può essere un po' sbrigativa per certi
; dispositivi i2c come certe EEPROM.
; Può essere conveniente introdurre un meccanismo di timeout ed
incrementare
; l'attesa per l'acknowledge fino ad un tempo limite prefissato.
; Si faccia riferimento al datasheet del dispositivo per maggiori
dettagli.
---
per quanto riguarda la routine i2cwaitack
Prova a modificare nella routine il comando:
	btfsc   I2CPORT, SDA    ; SDA low means ack
di modo che si attenda un po' (per esempio chiamando una routine
chiamata longdelay che chiama shortdelay 256 volte) e si ritesti SDA.
Solo dopo N test (che possono prendere anche qualche secondo) si
dichiara fallita l'attesa dell'ACK.

 stop funziona,approfondirò
Dai nomi delle funzioni che indichi, ho il sospetto che se lavori in
assembly è probabile che la versione che hai trovato su Internet delle
routine sia quella che ho scritto io un paio di anni fa:
http://www.geocities.com/leibowitz.geo/pic_i2c.html
Se è cosi', sarei ovviamente interessatissimo a conoscere gli errori
che hai trovato (nel mio caso le routine funzionano perfettamente, ma
avro' sicuramente tralasciato qualcosa), dato che non ho un
analizzatore logico.
mi riprometto di farlo nei prossimi giorni,in ogni caso essendo io un
pivello non preoccuparti troppo per gli errori ,mi sa  che tutto si
spiegherà a tuo favore


 spiegherà a tuo favore
Beh, non si tratta di trovare chi ha ragione o chi no, sarei davvero
felice di poter correggere degli errori.
Prova a modificare la routine che attende l'ACK seguendo il diagramma
di flusso che si trova a pagina 6 del datasheet (dovrebbe essere più o
meno come quello che ti ho indicato). Lo farei io, ma adesso non ho
proprio il tempo, scusami.

 spiegherà a tuo favore
Beh, non si tratta di trovare chi ha ragione o chi no, sarei davvero
felice di poter correggere degli errori.
Prova a modificare la routine che attende l'ACK seguendo il diagramma
di flusso che si trova a pagina 6 del datasheet (dovrebbe essere più o
meno come quello che ti ho indicato). Lo farei io, ma adesso non ho
proprio il tempo, scusami.
ti ringrazio comunque del suggerimento appena posso provo
ciao!