Pages: [1]   Go Down
Author Topic: Communication I2C et interruption externe  (Read 1134 times)
0 Members and 1 Guest are viewing this topic.
Pays de la betise
Offline Offline
Sr. Member
****
Karma: 4
Posts: 419
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

J'essaie de faire communiquer 2 arduinos via l'I2C.
L'esclave reçoit correctement les octets envoyés par le maître, sauf quand le sketch de l'esclave contient une interruption externe (ex:"attachInterrupt(0, detection_zero, FALLING);")

A ce moment là, les 2 premiers octets sont altérés.
Ex: master envoie "01234", l'esclave reçoit par exemple "!%234"

A noter que la routine de reception I2C (tiré de l'exemple slave_receiver) ne se trouve pas dans une routine d'interruption.

Je suppose qu'il y a un lien avec les interruptions, j'ai tenté de remplacer le n° d'interruption 0 par un autre, en vain.

Auriez-vous une explication à ce phénomène ?

Gromain
Logged

"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

Toulouse, France
Offline Offline
Newbie
*
Karma: 0
Posts: 8
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

bonjour Gromain,

je suis moi aussi en train de bosser sur un systeme zero crossing detection + communication i2c. mais j'en suis pour l'instant a la phase d'etude...
du coup ton probleme m'interpelle ! as-tu trouve une explication a ce souci ?
voire meme une solution ?

mon projet est le suivant : reguler la temperature d'une piece chauffee par 3 radiateurs electriques (pilotes par cartes de puissance + detection zero crossing + arduino + i2c)

luccio
Logged

France
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3511
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si la routine de réception I2C est interrompue trop longtemps (ou trop souvent), peut être qu'elle perd des données.

Il faudrait soit masquer les interruptions pendant la réception d'un caractère I2C, soit réduire au strict minimum le temps passé dans la routine d'interruption pour ne pas perturber la réception I2C.
Logged

Toulouse, France
Offline Offline
Newbie
*
Karma: 0
Posts: 8
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

effectivement...
sauf dans le cas d'un gradateur : les interruptions et le traitement qui en decoule doivent etre fait en temps reel. sinon ca risque de provoquer des variations visibles en sortie des cartes de puissance --> ampoule dont l'intensite lumineuse varie, radiateur qui chauffe plus ou moins ....
Logged

France
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3511
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

La notion de temps réel est toute relative. La réception d'un caractère sur une liaison I2C à 400KHz c'est 25µs donc 1/800 de la période secteur.
Maintenant si vous avez des contraintes aussi sévères sur vos timings, il faut organiser le logiciel pour que la communication n'arrive pas au moment ou l'interruption est attendue. La période secteur est régulière donc le moment ou arrive l'interruption est prévisible. Il ne faut pas initialiser de transfert un certain temps avant l'arrivée prévue de cette interruption. Il faut peut être mettre en place une espèce de petit ordonnanceur qui va se synchroniser sur la période secteur pour gérer les dialogues. Il y a ici http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1256745982/0 un petit OS temps réel qui pourrait vous simplifier la tache.
Logged

Toulouse, France
Offline Offline
Newbie
*
Karma: 0
Posts: 8
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok merci pour toutes ces precisions !
je vais y jetter un oeil de ce pas
Logged

Pays de la betise
Offline Offline
Sr. Member
****
Karma: 4
Posts: 419
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
as-tu trouve une explication a ce souci ?
voire meme une solution ?

pour répondre à ta question, non, je n'ai pas trouvé d'explication. Pour tout dire, je voulais mettre en place une communication I2C pour faire une passerelle "provisoire" entre 2 arduino, donc je n'ai pas insisté.
Logged

"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

Pages: [1]   Go Up
Jump to: