Pages: [1]   Go Down
Author Topic: i2c e pullup resistor  (Read 795 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Full Member
***
Karma: 0
Posts: 104
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao a tutti, visto che sto usando il protocollo i2c e mi ci sto affezionando, me lo sto studiando un po' meglio per cercare di capirci di più..

non capisco molto bene le pullup resistor. esattamente dove metterle. mettiamo che io abbia una rete "particolarmente" complessa, chessò per esempio 3 arduini e 4 device (sensori, mettiamo), e comunicano tutti tramite un bus i2c.. e i device non richiedono particolari resistenze di pullup.. uso un valore standard come 4.7k ohm..
dove le metto? due nel bus per tutti quanti? una per ogni device? e gli arduini usano quelle interne?
e più che altro.. a cosa servono? a rendere il segnale più stabile?

scusate la carrellata di domande  smiley-red
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 110
Posts: 6975
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

--> http://www.robot-electronics.co.uk/acatalog/I2C_Tutorial.html
--> http://dsscircuits.com/articles/effects-of-varying-i2c-pull-up-resistors.html

Le resistenze di pull-up devono essere uniche per il bus.
Se le metti esterne, cosi puoi controllarne il valore più facilmente, devi disabilitare quelle interne degli Arduino.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Se le metti esterne, cosi puoi controllarne il valore più facilmente, devi disabilitare quelle interne degli Arduino.

Non è una opzione, le pull up per la I2C DEVONO essere esterne, quelle integrate nel 328 sono di valore troppo alto per garantire il corretto funzionamento della I2C, il loro scopo è solo tenere agganciate a Vdd i pin di input lasciati flottanti, p.e. nel caso di pulsante che chiude verso GND.
Le pull up sul bus I2C servono per tenere le due linee SDA e SCL agganciate a 1 logico, sono indispensabili perché i relativi pin vengono settati come open drain, cioè chiudono solo verso GND e non verso Vdd.
Le pull up per la I2C devono garantire una corrente minima di 1 mA (4.7k) se il bus è molto corto, pochi cm, e con solo due-tre device collegati, velocità massima 100 kHz, se si vuole ottenere il massimo previsto dalle specifiche della I2C la corrente deve essere di ~3 mA (1.8k).
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 104
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ehm.. e come disattivo quelle di arduino? devo modificare qualcosa nella Wire.h?

comunque grazie, sto trovando un po' di risposte:

"Of course as you add more and more devices to the lines the bus capacitance will increase and that means you'll have to start decreasing your resistance (t = RC) if you want to maintain your signal integrity."

anche se " so it's always good practice to look at the signals on an oscilloscope. " e io non saprei come fare smiley-sad
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 110
Posts: 6975
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

come disattivo quelle di arduino?

Code:
digitalWrite(SDA, 0);
digitalWrite(SCL, 0);
dopo l'inizializzazione della wire.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5787
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ma mica sono attive di default, se lui non le ha attivate non deve fare nulla  smiley
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ehm.. e come disattivo quelle di arduino? devo modificare qualcosa nella Wire.h?

Se l'I2C è a 5V puoi anche lasciarle attive, 30 k in parallelo a 4.7k hanno un effetto minimo, se l'I2C è a 3.3V allora devi disabilitare le pull up interne usando le due righe che ti ha postato PaoloP.
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ma mica sono attive di default,

Invece si, le attiva la libreria di default.

Code:
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);
[/code
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ma mica sono attive di default,

Invece si, le attiva la libreria di default.

Code:
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);
Esattamente nel file /ibraries/Wire/utility/twi.cpp.
Basta commentare quelle 2 righe, oppure scriversi un metodo begin() nuovo che accetti in input anche lo stato delle pull-up interne.
Logged


0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5787
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

questa mi mancava (come infinite altre cose  smiley),
grazie delle delucidazioni
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

0
Offline Offline
Full Member
***
Karma: 0
Posts: 104
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

perfretto grazie.. ho trovato un sito che spiega come utilizzare arduino come oscilloscopio ora provo a capire se con una resistnza esterna funziona meglio..
Logged

Pages: [1]   Go Up
Jump to: