Salve,
forse sto per dire delle grandi cavolate, quindi vi autorizzo ad insultarmi se necessario ;D
Ho acquistato qualche tempo fa dei Digispark Attiny85, tipo questi
vorrei ora utilizzarli per leggere delle tensioni analogiche, dovrei leggere due tensioni quindi ho necessità di due PIN, A0 ed A1, i dati verranno inviati al PC per cui i PIN comuni alla USB non possono esser utilizzati.
Vorrei anche poter visualizzare i valori letti su un display e pensavo di acquistarne uno I2C da collegare all'Attiny85.
Il punto è che il pin A1 è comune all'SCK del bus I2C.
Dalla documentazione che ho letto i dispositivi I2C dovrebbero avere una logica a drain aperto e quindi richiedono una resistenza di pull-up collegata con il positivo di alimentazione per poter lavorare correttamente, secondo voi potrei omettere tale resistenza dato che l'Attiny85 gestirà il clock? credo che lo stato alto venga portato a +5V dal microcontrollore anche senza la resistenza di pull-up ma poi si avranno letture corrette del segnale analogico collegato all'ADC?
Pensavo di gestire via software la lettura del pin A1 ad intervalli di circa mezzo secondo e di aggiornare il display solo quando è realmente necessario, se i valori non variano inutile rinfrescare il display.
Nello schema che allego R2 e R3 fungono da partitore di tensione per una delle due tensioni da leggere, R6 l'ho inserita per evitare che la tensione presente sul partitore interferisca con il BUS I2C quando in uso e credo non disturbi troppo la lettura della tensione analogica.
Grazie in anticipo per i suggerimenti che mi darete
Dino
NO, il bus I2C richiede OBBLIGATORIAMENTE le resistenze di pull-up dato che, essndo appunto open-drain, il pin della MCU chiude SOLO verso GND ma mai verso Vdd, valore che la resistenza di pull-up ha il compito di dare.
Non puoi usare lo stesso pin come I2C ed ingresso analogico. Se non ti bastano i pin ... purtroppo hai semplicemente sbagliato a scegliere il chip di MCU ... :
gpb01: NO, il bus I2C richiede OBBLIGATORIAMENTE le resistenze di pull-up
Lo standard prevederebbe la resistenza di pull-up ma negli esempi viene omessa per cui ho immaginato che in realtà non è a collettore aperto... Tutorial/LibraryExamples/MasterWriter
per questo ho posto la domanda, credo che dovrò studiarmi bene la libreria ed il datasheet del uC perché non mi sembra che le porte settate come uscite possano lavorare a collettore aperto ma solo limitare la corrente.
Quell'esempio è sbagliato ... le specifiche del bus I2C sono uno standard e non è che ci si può inventare nulla ...
... occhio che, ad esempio, Arduino MEGA monta le resistenze di pull-up direttamente sulla scheda (basta andare a vedere lo schematico per trovarle) e che un'infinità di breakout board che trovi in giro (... la maggior parte), per le cose più diverse, le hanno quasi sempre già presenti.
dinodf:
... credo che dovrò studiarmi bene la libreria ed il datasheet del uC perché ...
SI e sarebbe stato il caso che te lo fossi studiato prima di cominciare a disegnare il tuo circuito, così da capire a cosa andavi incontro ... :
Sia nel datasheet del ATtiny85, che in quello del ATmega328P usato nell'esempio che indichi, è chiaramente indicato che l'interfaccia TWI (che nulla ha a che vedere con il funzionamento dei pin di I/O), in uscita, è open-drain e che necessita delle resistenza esterne di pull-up.
In realtà non è come credi, l'esempio è corretto e perfettamente funzionante; le specifiche come già detto prevedono l'inserzione delle resistenze di pull-up ed a farlo ci pensa la libreria Wire nella fase di inizializzazione
/*
* Function twi_init
* Desc readys twi pins and sets twi bitrate
* Input none
* Output none
*/
void twi_init(void)
{
// initialize state
twi_state = TWI_READY;
twi_sendStop = true; // default value
twi_inRepStart = false;
// activate internal pullups for twi.
digitalWrite(SDA, 1);
digitalWrite(SCL, 1);
questo implica che con l'utilizzo della libreria su citata le porte del uC non sono open-drain, ora compatibilmente con gli impegni quotidiani, devo studiarmi le librerie adatte agli ATtiny85 dato che questi mC hanno un hardware leggermente diverso e non sono compatibili con la libreria Wire, ho posto il quesito proprio per capire se qualcuno aveva già affrontato il problema, ti ringrazio per avermi ricordato che è chiaramente indicato tutto nel datasheet, ma come vedi tutto è sempre influenzato anche dal software...
Il problema maggiore credo derivi dalla frequenza del clock (100kHz in normal mode) che non va molto d'accordo con il circuito soprattutto quando la tensione del punto da misurare (ramo alto del partitore R2 R3) è bassa dato che la resistenza interna di pull-up è molto alta
... onestamnete NON avevo mai fatto caso a questa cosa e NON so esattamente neanche quanto correttamente funzioni dato che, senza le pull-up esterne, normalmente, parecchie cose non funzionano (ed il forum è pieno di casi in cui questo succede). I datasheet parlano chiaro e dicono di usare pull-up esterne !
Del resto ... le pull-up interne hanno un valore veramente troppo elevato per il buon funzionamento di un bus I2C difatti il datasheet le da tra i 20 ed i 50 KΩ ... valori, nel 90% dei casi, veramente eccessivi per il suo buon funzionamento.
Sempre nel datasheet, nella sezione delle caratteristiche elettriche, sono date le formule per il calcolo delle resistenze di pull-upesterne, in funzione della velocità del bus e della capacità del cavo.
Quindi ... mi spiace, ma, se si vogliono evitare guai, le pull-up vanno messe esternamente e quello che fa la libreria Wire è anche poco corretto (... per varie ragioni, incluso il portare, fortunatamnete con resistenze di valore piuttosto elevato, i 5V sul bus I2C, quando potrebbe essere usato con devices che lavorano a 3.3V, indipendentemente dai 5V della MCU). Ah, ti rammento poi che, alla faccia della libreria Wire, su Arduino MEGA, hanno montato di base delle pull-up estenne sulla scheda (... pull-up che era meglio che evitavano per gli stessi motivi di quelle interne) .
Electrical Interconnection
As depicted in Figure 22-1, both bus lines are connected to the positive supply voltage through pull-up resistors. The bus drivers of all TWI-compliant devices are open-drain or open-collector. This implements a wired-AND function which is essential to the operation of the interface. A low level on a TWI bus line is generated when one or more TWI devices output a zero. A high level is output when all TWI devices tri-state their outputs, allowing the pull-up resistors to pull the line high. Note that all AVR devices connected to the TWI bus must be powered in order to allow any bus operation.
The number of devices that can be connected to the bus is only limited by the bus capacitance limit of 400 pF and the 7-bit slave address space. A detailed specification of the electrical characteristics of the TWI is given in ”Two-wire Serial Interface Characteristics” on page 317. Two different sets of specifications are presented there, one relevant for bus speeds below 100kHz, and one valid for bus speeds up to 400kHz.
Dopo di che, poco più avanti, dice:
Note that the internal pull-ups in the AVR pads can be enabled by setting the PORT bits corresponding to the SCL and SDA pins, as explained in the I/O Port section. The internal pull-ups can in some systems eliminate the need for external ones.
... ovvero, in alcuni sistemi (== in casi particolari), le pull-up interne potrebbero sostituire le esterne ... il che conferma ancora che, nella maggior parte delle applicazioni, le pull-up vanno messe esternamente e, ove occorre, calcolate in funzione delle capacità collegate al bus ... noi qui, di solito, suggeriamo un valore attorno ai 4.7KΩ.
Credo che la soluzione più semplice sia utilizzare un ADC con interfaccia i²C così da poter collegare sia il display che il convertitore analogico digitale in parallelo, prevedendo due resistenze di pull-up da 4K7, così si avrà anche più precisione nella lettura della tensione dato che gli ADC hanno fino a 16bit di risoluzione, con poca spesa