I2C + ds1307 + LCD = ... le bazard
bonjour à tous
pour mon projet de régulation de chauffage j'utilise un lcd en i2c, ainsi qu'une horloge ds1307
à priori ça semblait fonctionner pas trop mal, sauf que de temps en temps, j'ai le 1307 qui fait totalement n'importe quoi. ca commencé quand j'ai rallongé mon bus i2c pour déporter l'écran. avec une longueur d'environ 2m, rien de bien énorme non plus.
l'écran lui fonctionne normalement, j'ai même rajouté un second écran "local" (en plus de celui déporté), les deux fonctionnent (sur la même adresse) et affichent bien la même chose.
mais le ds1307, non, lui il part en sucette et transmet des valeurs totalement fantaisistes (par exemple heure à 85, etc etc). et une fois qu'il est parti en vrille, la seule solution est de lui enlever la pile pour le remettre à zéro, sinon rien à faire il n'est plus possible de régler aucune valeur.
j'ai essayé de diminuer la vitesse du bus avec wire.setclock(10000); mais ça ne change rien.
du coup j'ai supprimé ma rallonge et gardé uniquement l'écran "local" de manière à revenir à la configuration initiale, et... c'est mieux mais ça foire toujours !
donc je ne sais pas trop, est-ce le ds1307 qui est défectueux ? un problème sur mon bus i2c, par exemple les résistances de tirage de valeur inadaptées ? actuellement il y à priori des réistances partout : sur le shield avec le ds1307, et sur les deux écrans. j'ai lu je ne sais plus où qu'avec une liaison un peu longue ce n'est pas plus mal d''avoir des résistances aux deux bouts, c'est ce que j'ai. mais du coup je me dis que si il y en plusieurs, il faudrait en augmenter la valeur... actuellement il y sur les écrans des 4,7k (du moins c'est ce que je mesure à l'ohmetre entre scl/sda et vcc, parceque pour ce qui est de lire la valeur sur les cms, mes yeux n'ont plus envie..) et pareil sur le shield avec le ds1307
donc concrètement... je fais quoi ? je vire les résistances du ds1307 et je ne garde que celles des deux écrans?
pour mon projet de régulation de chauffage j'utilise un lcd en i2c, ainsi qu'une horloge ds1307
à priori ça semblait fonctionner pas trop mal, sauf que de temps en temps, j'ai le 1307 qui fait totalement n'importe quoi. ca commencé quand j'ai rallongé mon bus i2c pour déporter l'écran. avec une longueur d'environ 2m, rien de bien énorme non plus.
l'écran lui fonctionne normalement, j'ai même rajouté un second écran "local" (en plus de celui déporté), les deux fonctionnent (sur la même adresse) et affichent bien la même chose.
mais le ds1307, non, lui il part en sucette et transmet des valeurs totalement fantaisistes (par exemple heure à 85, etc etc). et une fois qu'il est parti en vrille, la seule solution est de lui enlever la pile pour le remettre à zéro, sinon rien à faire il n'est plus possible de régler aucune valeur.
j'ai essayé de diminuer la vitesse du bus avec wire.setclock(10000); mais ça ne change rien.
du coup j'ai supprimé ma rallonge et gardé uniquement l'écran "local" de manière à revenir à la configuration initiale, et... c'est mieux mais ça foire toujours !
donc je ne sais pas trop, est-ce le ds1307 qui est défectueux ? un problème sur mon bus i2c, par exemple les résistances de tirage de valeur inadaptées ? actuellement il y à priori des réistances partout : sur le shield avec le ds1307, et sur les deux écrans. j'ai lu je ne sais plus où qu'avec une liaison un peu longue ce n'est pas plus mal d''avoir des résistances aux deux bouts, c'est ce que j'ai. mais du coup je me dis que si il y en plusieurs, il faudrait en augmenter la valeur... actuellement il y sur les écrans des 4,7k (du moins c'est ce que je mesure à l'ohmetre entre scl/sda et vcc, parceque pour ce qui est de lire la valeur sur les cms, mes yeux n'ont plus envie..) et pareil sur le shield avec le ds1307
donc concrètement... je fais quoi ? je vire les résistances du ds1307 et je ne garde que celles des deux écrans?
l'i2c été prévue pour des liaisons entre circuits intégrés sur une même carte.
donc 2 m c'est extrêmement long
le coté génial de l'i2c est l'emploi de collecteur ouvert qui permet de réaliser des fonctions ou câblé sans aucun élément externe, donc un gain de place sur les cartes.
son défaut (question portée) c'est les collecteurs ouverts, pas de chance.
un collecteur ouvert muni de sa résistance de collecteur n'est rien d'autre qu'un transistor qui fonctionne en émetteur commun.
j'ai bien "résistance de collecteur" et non pas pull-up, terme que je hais car il fait perdre la réalité de l'électronique.
on donc un système : émetteur, canal de transmission, récepteur.
Émetteur :
l'impédance de sortie d'une émetteur commun est justement égal à la résistance de collecteur (raison de plus pour haïr le terme pull-up en dehors du domaine purement numérique de fixation de niveau logique)
récepteur :
l'impédance d'entrée d'un récepteur i2c est égal à une très forte impédance (dont on peut négliger le rôle) et une capacité parasite.
origine du défaut :
la capacité parasite devra se charger à travers la résistance de collecteur. donc si la constante de temps t= r*c est trop grande (r ou c trop grand) les fronts des signaux i2c seront écroulés et les signaux seront incompréhensibles.
liaison :
il faut ajouter l'inductance de fils et encore de la capacité parasite entre fils.
donc plus le fil est long plus il y de défaut.
conseils :
difficile d'en donner parce que je n'ai pas vraiment eu d'expérience avec l'i2c en grande longueur mais au vu de ce que je connais par ailleurs je dirai (en mon âme et conscience)
1) câbler plutôt les modules en étoile afin de séparer les connexions longues et courtes.
2) adapter au cas par cas les valeurs des résistances de collecteur.
c'est à dire conserver un bon temps de charge --> si la capa augmente on diminue la résistance.
garder 10k pour les distances courtes (<20/30 cm) et diminuer pour les liaisons longues.
tout en gardant en mémoire que du point de vue courant toutes les résistances se retrouve en parallèle et donc attention à ne pas faire passer trop de courant dans les transistors.
sous 5v une résistance équivalente de 1 k ne provoque pas plus de 5 ma ce n'est pas non plus la mer à boire.
mais 100 ohms c'est plutôt à éviter
.
sinon si cela ne fonctionne toujours pas il existe des circuits intégrés dédiés pour augmenter la portée des liaisons i2c.
donc 2 m c'est extrêmement long

le coté génial de l'i2c est l'emploi de collecteur ouvert qui permet de réaliser des fonctions ou câblé sans aucun élément externe, donc un gain de place sur les cartes.
son défaut (question portée) c'est les collecteurs ouverts, pas de chance.
un collecteur ouvert muni de sa résistance de collecteur n'est rien d'autre qu'un transistor qui fonctionne en émetteur commun.
j'ai bien "résistance de collecteur" et non pas pull-up, terme que je hais car il fait perdre la réalité de l'électronique.
on donc un système : émetteur, canal de transmission, récepteur.
Émetteur :
l'impédance de sortie d'une émetteur commun est justement égal à la résistance de collecteur (raison de plus pour haïr le terme pull-up en dehors du domaine purement numérique de fixation de niveau logique)
récepteur :
l'impédance d'entrée d'un récepteur i2c est égal à une très forte impédance (dont on peut négliger le rôle) et une capacité parasite.
origine du défaut :
la capacité parasite devra se charger à travers la résistance de collecteur. donc si la constante de temps t= r*c est trop grande (r ou c trop grand) les fronts des signaux i2c seront écroulés et les signaux seront incompréhensibles.
liaison :
il faut ajouter l'inductance de fils et encore de la capacité parasite entre fils.
donc plus le fil est long plus il y de défaut.
conseils :
difficile d'en donner parce que je n'ai pas vraiment eu d'expérience avec l'i2c en grande longueur mais au vu de ce que je connais par ailleurs je dirai (en mon âme et conscience)
1) câbler plutôt les modules en étoile afin de séparer les connexions longues et courtes.
2) adapter au cas par cas les valeurs des résistances de collecteur.
c'est à dire conserver un bon temps de charge --> si la capa augmente on diminue la résistance.
garder 10k pour les distances courtes (<20/30 cm) et diminuer pour les liaisons longues.
tout en gardant en mémoire que du point de vue courant toutes les résistances se retrouve en parallèle et donc attention à ne pas faire passer trop de courant dans les transistors.
sous 5v une résistance équivalente de 1 k ne provoque pas plus de 5 ma ce n'est pas non plus la mer à boire.
mais 100 ohms c'est plutôt à éviter

sinon si cela ne fonctionne toujours pas il existe des circuits intégrés dédiés pour augmenter la portée des liaisons i2c.
Arduino Forum > International > Français (Moderators: jfs, Snootlab) > I2C + ds1307 + LCD = ... le bazard
arduino
Comments
Post a Comment