Pages: 1 [2]   Go Down
Author Topic: comunicazione I2C  (Read 4525 times)
0 Members and 2 Guests are viewing this topic.
0
Offline Offline
Faraday Member
**
Karma: 49
Posts: 6017
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

se non si mettono non funziona.
Se si usano quelle interne, puo' funzionare, tenendo le connessioni molto corte ci sono casi in cui si puo' fare. ad esempio se usi un RTC che e' fisicamente vicino al micro perche' hai fatto uno standalone, puoi provare ad usare quelle interne.

Il valore delle resistenze non altera solo l'assorbimento, ma anche la forma d'onda dei segnali i2c, ed e' quello il motivo del mancato aggancio alla alta velocita'
Logged

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

Cagliari, Italy
Online Online
Tesla Member
***
Karma: 115
Posts: 7254
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho visto che nel file twi.c c'è la funzione che inizializza il bus per il master.
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);

  // initialize twi prescaler and bit rate
  cbi(TWSR, TWPS0);
  cbi(TWSR, TWPS1);
  TWBR = ((F_CPU / TWI_FREQ) - 16) / 2;

  /* twi bit rate formula from atmega128 manual pg 204
  SCL Frequency = CPU Clock Frequency / (16 + (2 * TWBR))
  note: TWBR should be 10 or higher for master mode
  It is 72 for a 16mhz Wiring board with 100kHz TWI */

  // enable twi module, acks, and twi interrupt
  TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA);
}
Qui vengono attivate le resistenze di pullup interne.
Io collegato un RTC e un LCD con modulo specifico se breadboard e funzionano. (in effetti i cavetti sono abbastanza corti)
Cosa succede se oltre a quelle interne, che vengono attivate automaticamente dalla libreria, metto anche quelle esterne?

Logged

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

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 335
Posts: 23122
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Usualmente è meglio non attivarle.
Come ha detto Testato, il valore influisce anche il fronte d'onda.
Guarda qui:
http://dsscircuits.com/articles/effects-of-varying-i2c-pull-up-resistors.html
con le pull-up interne i fronti di salita sono molto lenti. Meglio disattivarle (commentando quelle 2 righe di codice) e mettere quelle esterne.
Logged


0
Offline Offline
Faraday Member
**
Karma: 49
Posts: 6017
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Cosa succede se oltre a quelle interne metto anche quelle esterne?
E' come se stessi facendo un parallelo, quindi facendo i calcoli puoi capire di quanto stai caricando
Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti, volevo chiedere: ho visto diversi schemi per collegare due modelli di Arduino con i2c ed alcuni hanno la 5V in comune e altri no, da cosa dipende?
Io ho provato con una mega ed un arduino uno alimentati separatamente sia con la 5V in comune che senza ed in tutte e due i casi funziona perfettamente, ho anche letto che se le due schede hanno alimentazione separata bisogna collegare la5V del master con il vin dello slave ma non mi  sono fidato a  provare.
Qualcuno di voi mi sa dire qual'é la configurazione corretta?
« Last Edit: May 24, 2014, 01:05:56 pm by yaroslavpopovic » Logged

Switzerland
Online Online
Faraday Member
**
Karma: 116
Posts: 6020
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I due Arduino, se alimentati tramite due alimentatori diversi, devono avere in comune il segnale di "riferimento" ovvero ... il GND, e null'altro (salvo ovviamente il bus I2C) !

Guglielmo
Logged

Search is Your friend ... or I am Your enemy !

Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I due Arduino, se alimentati tramite due alimentatori diversi, devono avere in comune il segnale di "riferimento" ovvero ... il GND, e null'altro (salvo ovviamente il bus I2C) !

Guglielmo


Grazie Guglielmo, e quale sarebbe la soluzione migliore, tenendo presente che sfrutterei praticamente quasi tutti i pin digitali sia del master che dello slive?
Due alimentatori o un unico (attualmente utilizzo uno da 9V da 850mA per il mega, basterebbe questo per tutti e due?),  considerando che le varie schede relè  le alimento separatamente.

Grazie
Logged

Switzerland
Online Online
Faraday Member
**
Karma: 116
Posts: 6020
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quello che conta è cosa colleghi ai due Arduino ...
... in pratica devi vedere quanto assorbi su ciascuno, fare la somma, aggiungici un 30% per prudenza e ... hai che potenza ti serve per l'alimentatore.

Ovviamente, se hai servo o motori, ricordati di alimentarli con alimentatore separato per non sovraccaricare quello con cui alimenti Arduino e per ... non portare dentro disturbi smiley-wink

Guglielmo
Logged

Search is Your friend ... or I am Your enemy !

Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie
Logged

Pages: 1 [2]   Go Up
Jump to: