I2c.. non vuole saperne :)

Buongiorno :) Allora, vorrei usare l'interfaccia i2c della mia Arduino Diecimila. Tempo fa per vedere se riuscivo, l'ho collegata a un LCD che usava questo protocollo: niente da fare, si blocca alla chiamata endTransmission. Ho chiesto aiuto qui, ma non ho risolto.. Alla fine ho lasciato stare pensando che magari dipendeva dall'LCD che per qualche motivo funzionava solo con i moduli PICAXE (era fatto per quelli, ma in realta' dovrebbe essere generico).. Ora ho una scheda MD23 che funziona con i2c, ho provato a collegarla ma niente, stesso identico problema.. Ho provato praticamente tutte le possibili combinazioni di indirizzi, chiamate, collegamenti ecc ecc.. Qualcuno mi sa dare qualche indicazione di cos'altro potrei verificare? Ho letto che la diecimila dovrebbe avere i pullup resistors integrati quindi non dovrebbero essere necessari.. sbaglio? Ho provato a vedere con un multimetro ma mi pare che il pin SDA sia a 0v quando la scheda non trasmette.. non dovrebbe essere a 5v ? O sto facendo un test che non ha senso ?

Altra cosa, gli indirizzi i2c vanno shiftati giusto? Ho provato sia 0xB0 (l'indirizzo reale) che 0x58 (shiftato)..

Qualsiasi aiuto o indizio e' bene accetto!

Ciao

Una domanda stupida… stai usando 2 resistenze di pullup da 4,5 k su SDA e SCL?

massimo

no, non le sto usando.. ma la Diecimila (meglio l'atmega168) non dovrebbe averli gia' integrati ? L'ho letto da qualche parte, e poi dice cosi' anche sulla libreria Wire..

io ce li metto sempre perche le spec dicono 4.5k e quelli interni sono da 100k

comunque...

prova a seguire le istruzioni qui http://www.nearfuturelaboratory.com/2007/01/11/arduino-and-twi/

oppure posta il tuo codice che lo guardiamo

m

ah non sapevo che quelli interni fossero da 100k! ho letto un po' ovunque che la gente in generale li usa, anche se in teoria dovrebbero gia' esserci, tant'e' che nel dubbio ho chiesto qui e in effetti mi dissero che sono superflui.. Boh?

Allora provero' a metterli.. purtroppo a casa non ne ho cosi' mi tocca aspettare lunedi' :( Se non va casomai provo a postare il codice..

Cmq Massimo tu sei uno degli autori di Arduino vero? Colgo l'occasione per farti i complimenti.. e' una schedina stupenda :) Ed e' bello leggerci scritto sopra, per una volta, made in italy!

Grazie

Facciamo del nostro meglio per far vedere che anche gli italiani sanno fare tecnologia.

Ok, ho messo su le resistenze, ma niente da fare ancora :'(

Ecco un pezzetto di codice:

define ADDRESS (0xB0 >> 1)

void writeRegisterByte(byte reg, byte value) { Serial.println("1s"); Wire.beginTransmission(ADDRESS); Wire.send(reg); // choose register Wire.send(value); // value Serial.println("2s"); Wire.endTransmission(); Serial.println("3s"); }

e poi, per esempio:

writeRegisterByte(MODE_REGISTER, mode);

Lui arriva a stampare 2s e poi si pianta su endTransmission..

Il setup e' cosi': Ho collegato i CLOCK e i DATA delle due schede tramite una breadboard. Nella stessa ho messo una resistenza che va da +5 a CLOCK e una dallo stesso +5 a DATA.. Ma i due segnali vanno collegati a due +5 diversi ? non credo..

ho caricato qui una foto del sistema.. magari c'e' qualcosa di banale che mi sfugge

http://img293.imageshack.us/img293/6153/1001041fa7.jpg

Like so

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1201476854/5#5

+5 to resistor to A4 +5 to resistor to A5

Common GND

Also try 1.8k or 4.7k resistor

ok, ho trovato il problema.

versione breve: non funziona se uploadi il tuo programma da Linux. Se lo stesso programma lo uploadi da windows, funziona.

versione lunga: allora per capire dove si piantasse sono andato un po' in debug sul codice di Wire e twi, e ho scoperto che la linea dove il programma si pianta e' la seguente su twi.c (twi_writeTo):

TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);

A quel punto nel tentativo di districare tutte quelle macro, sono andato a cercare dove erano definite ed ho scoperto che non sono sotto il codice di Arduino, ma sotto le librerie avr che, sotto linux, sono installate a parte con i pacchetti standard (nel mio caso ubuntu 6.06). A quel punto vado a controllare e trovo che TWCR e' definito in decine di posti diversi in modo diverso. Ho detto vuoi vedere che si incasina? Cos' ho detto provo su windows, li l'ambiente AVR e' integrato e quindi non dovrebbe avere di questi problemi. Cosi' ho provato ed effettivamente ha funzionato. Non ho indagato fino infondo (ci ho gia' perso un weekend praticamente) ma un'ipotesi cosi' a naso e' che prenda qualche versione sbagliata di quella macro o di qualche altro file. Ho trovato poi anche quest'altro thread dove si parla di un problema analogo..

Ora funziona sia con le resistenze che senza..

Ottimo lavoro :)

Mi rivolgo a tutti i lettori, quando postate una domanda fornite piu info possibili. Tipo sapere che sei su linux, mac o windows aiuta perche ogni sistema operativo ha le sue menate