twi multi master con microcontroller Atmel

Come dal titolo voglio realizzare una connessione di più micro tramite twi, sfruttando il bus in multimaster. Cioè tutti i micro connessi al bus possono essere sia master che slave e allora mi sono documentato sulla procedura da implementare. La procedura di arbitrazione non mi risulta chiara ancora peggio leggendo qui Atmel AVR TWI I2C Multimaster Issue - Robot Room, dove sembra ci siano problemi che alle volte saltano fuori impedendo di fatto l'arbitrazione.

Addirittura in quel documento si impotizza come poter risolvere il problema via hardware, nel senso che Atmel dovrebbe modificare i chip aggiungendo un'altro vettore di interrupt a TWI.

Mi sapete dire qualcosa in merito? avete qualche ulteriore link?.

Ciao.

bel sito e bell'articolo, peccato che non specifichi i micro sui cui ha avuto il problema.. magari è già stato risolto.
la twi di arduino già implementa il multi-master, ci metti poco a creare un piccolo test (sempre che non abbiano già messo la pezza software)

@lesto:
in quel sito non c'è molta roba ma quello che c'è è molto interessante.
L'idea della mia stazioncina meteo ed il "trucco" dei 3 led come semaforo per switchare l'alimentazione da pannello solare o batteria l'ho presa da lì :sweat_smile:

@Mauro:
mi associo alle richieste di lesto.
Stiamo ovviamente parlando di chip con supporto TWI integrato in hardware, quindi niente Tiny o simili giusto?

la twi di arduino già implementa il multi-master, ci metti poco a creare un piccolo test (sempre che non abbiano già messo la pezza software)

Ho informazioni scadute sulla twi di arduino in quanto sapevo non lavorasse in multimaster.
Ok guarderò l'implementazione del core 1.0, o c'è stato backport.

mi associo alle richieste di lesto.
Stiamo ovviamente parlando di chip con supporto TWI integrato in hardware, quindi niente Tiny o simili giusto?

Si esatto, niente USI, solo TWI, quindi 328 644 ecc.

Sto leggendo AVR-315, per l'ennesima volta. Ho già usato TWI in modo semplice per dialogare con i sensori di temperatura ma questi si accontentano di una gestione Single master multislave che la più semplice da usare.

Non farebbe male spiegare qui cosa sono quei termini NACK, ACK ecc. Mi colpisce: The TWI module operates as a state machine and is event driven:

Appena ci capisco voglio provare a fare quello che ho fatto per lcd, cioè scrivere su TWI con fprintf(&stream, "send to twi address %d", twi_address);

Ciao.

ACK è Acknowledge, ossia "ricevuto". NAK non so, forse sta per Not Acknowlege ma non so.
Non ho mai avuto problemi proprio perché ho sempre usato il TWI in modalità mono-master, come te.

Se Arduino ha già messo mano al codice per sistemare quel bug forse sarebbe da capire a quando risale l'articolo su Robotroom.

l'implementazione multimaster per quel che so c'è sempre stata, ma quando sono arrivato io c'era già l'IDE 21

Ma il problema non è se c'era o meno, ma se funzionava o meno :wink:
Robotroom la usava ma non gli funzionava. Ora provo a guardare il codice del core 1.0.1

Da AVR315:

The SCL period is controlled by settings in the TWI Bit Rate Register (TWBR)
and the Prescaler bits in the TWI Status Register (TWSR). Slave operation does not
depend on Bit Rate or Prescaler settings, but the CPU clock frequency in the Slave
must be at least 16 times higher than the SCL frequency. Note that Slaves may
prolong the SCL low period, thereby reducing the average TWI bus clock frequency.

Che vuol dire?
Il periodo della frequenza di clock dipende dall'impostazione del registro TWI Bit Rate Register (TWBR)
e dal prescaler bit presente nello status register TWSR. Le operazioni dello slave non dipendono dalle impostazioni di TWBR e dal prescaler ma dalla frequenza di clock a cui lavora lo slave e questa frequenza deve essere almeno 16 volte più alta della frequenza del pin SCL.

Questo non lo capisco:
Nota che lo slave può prolungare il periodo low del pin SCL, riducendo di conseguenza la frequenza del bus.
Si questo quando accade? poi lo slave non dovrebbe non essere in grado di controllare SCL.

@leo72 hai postato mentre scrivevo
Certo però io data su quell'articolo non ne trovo, il dubbio fosse vecchio lo avuto anche io, come pure mi sono chiesto quale micro ha usato.

Si quelle sigle significano proprio quello che hai detto. Se la finite di postare mentre scrivo posto anche io :~
Ok grazie leo72 per prenderti il compito di spulciare nel core, mi hai risparmiato una difficoltosa perchè lo avrei dovuto scaricare quel core.

Ciao.

Ciao,

I2C multi master, come diceva Leo, e' implementato nella libreria, ma e' mal documentato.

Alcuni esempi di utilizzo si trovano qui

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1248239313
http://digitalcave.ca/resources/avr/arduino-i2c.jsp

Ciao,
Marco.