arreter Wire ?

Bonjour à tous. Une question concernant la library wire : J'utilise l'I2C dans le setUp de mon code, ensuite je ne l'utilise plus et je souhaiterais utiliser les pins A4 et A5. Je ne voie par de fonction pour "arrêter Wire", l'inverse de wire.begin() en quelque sorte. Si l'un d'entre vous à déjà été confronté au problème ou a une idée votre aide sera la bienvenue ! Merci d'avance, Jacques.

Bonsoir, La classe Spi ne dispose pas de "destructor". Si tu utilises Spi c'est que des éléments I2C sont connectés sur A4 et A5 quid de ces périphériques ?

bouault: Bonjour à tous. Une question concernant la library wire : J'utilise l'I2C dans le setUp de mon code, ensuite je ne l'utilise plus et je souhaiterais utiliser les pins A4 et A5. Je ne voie par de fonction pour "arrêter Wire", l'inverse de wire.begin() en quelque sorte. Si l'un d'entre vous à déjà été confronté au problème ou a une idée votre aide sera la bienvenue ! Merci d'avance, Jacques.

bonsoir Jacques tu souhaiterais faire quoi exactement apres ton setup ? le 1er probleme que je vois c'est qu'il y a surement des resitances de pull-up sur les lignes I²C SDA/SCL

Merci pour vos réponses. Quelques explications, nécessaires en effet : J'ai une carte maison, que nous avons baptisé "Arpschuino", qui me sert à graduer 16 lampes en soft PWM, piloté en DMX.

Elle est équivalente à un arduino, mieux régulé et équipé d'un max 485 pour la liaison DMX. Elle fonctionne parfaitement bien mais l'adresse DMX est en dur dans le code source et il faut re-uploader la carte pour la changer.

j'ai donc fait une deuxième petite carte, l'arpdress-board ;) équipé d'un attiny 2313 et de 3 roues codeuses BCD pour pouvoir modifier l'adresse sans ordinateur. Donc on définit l'adresse avec les 3 roues, on banche l'arpdress-board sur l'arpschuino, un coup de reset,un clignotement de led indique que l'adresse à bien été prise en compte et on retire la petite carte. L’adresse est conservé dans l'EEPROM.

En fonctionnement normal la carte n'utilise donc pas la liaison I2C qui ne sert que pendant le setUp. Je précise que les résistances de pullUp sont sur l'arpdress-board et pas sur la carte principale. Tout cela fonctionne bien sauf que les sorties A4 et A5 (ou plus exactement D18 et D19) ne sont plus accessibles, même avec l'arpdress board enlevée.

Il faudrait donc que je puisse désactiver complétement la library wire à la fin du setUp. Malgré mes recherches je n'ai malheureusement encore rien trouvé.

Je vous joint 2 photos pour que vous visualisiez la chose.

A bientôt, Jacques.

Bon je n'arrive pas à joindre les photos...

les photos zipées

photos.zip (118 KB)

Indépendamment du côté matériel soulevé par Artouste pour le côté logiciel je ne vois que la solution de revenir aux fondamentaux.

  • L'I2C dans les micros avr est matérielle.
  • Le matériel dans le micro se gère avec des registres d'un octet.
  • La datasheet du micro indique quels registres sont spécialisés dans la gestion de l'I2C.

Deux méthodes, qui ne s'excluent pas forcément, lire la datasheet et : - soit modifier les bits qui vont bien dans les registres qui vont bien. - soit une fois les registres identifiés, les lire et en faire une copie avant l'activation de l'I2C Les lire aussi après activation de l'I2C pour voir les différences (pas obligatoire mais cela ne mange pas de pain et cela permet d'éliminer les registres qui ne changent pas). Et pour couper l'I2C rétablir les registres dans l'état où ils étaient avant l'activation de l'I2C.

A priori les registres concernant l'I2C sont : TWBR : TWI Bit Rate Register TWCR : TWI Control Register TWSR : TWI Status Register TWDR : TWI Data Register TWAR : TWI (Slave) Address Register TWAMR : TWI (Slave) Address Mask Register

Il est aussi possible que l'une des fonctions pinMode, digitalRead ou digitalWrite fasse le contrôle et désactive d'elle même l'I2C ou la PWM, il faudrait se pencher sur le code des différentes fonctions.

Jamais testé mais à mon avis un pinMode(pin,INPUT) + digitalWrite(pin,LOW) devrait remettre les choses dans l'ordre.

Sinon comme le suggère 68tjs, stocké les registres, faire les manips i2c puis recoller les valeurs.

OK, je regarde ça ce matin et je vous dis. Merci beaucoup.

J’avance !
code de test :

#include <Wire.h>
void setup() {
  Serial.begin(9600);
  
  byte var = TWBR ;
  Serial.print("sans Wire : ");
  Serial.print("TWBR = ");
  Serial.println(var, BIN);
  
  var = TWCR ;
  Serial.print("sans Wire : ");
  Serial.print("TWCR = ");
  Serial.println(var, BIN);
    
  var = TWSR ;
  Serial.print("sans Wire : ");
  Serial.print("TWSR = ");
  Serial.println(var, BIN);

  var = TWDR ;
  Serial.print("sans Wire : ");
  Serial.print("TWDR = ");
  Serial.println(var, BIN);

  var = TWAR ;
  Serial.print("sans Wire : ");
  Serial.print("TWAR = ");
  Serial.println(var, BIN);

  var = TWAMR ;
  Serial.print("sans Wire : ");
  Serial.print("TWAMR = ");
  Serial.println(var, BIN);
            
  Serial.println();
  Serial.println();
///////////////////avec Wire//////////////////:  
  Wire.begin();
  
  var = TWBR;
  Serial.print("avec Wire : ");
  Serial.print("TWBR = ");
  Serial.println(var, BIN);
  
  var = TWCR;
  Serial.print("avec Wire : ");
  Serial.print("TWCR = ");
  Serial.println(var, BIN);

  var = TWSR;
  Serial.print("avec Wire : ");
  Serial.print("TWSR = ");
  Serial.println(var, BIN);
  
  var = TWDR;
  Serial.print("avec Wire : ");
  Serial.print("TWDR = ");
  Serial.println(var, BIN);
  
  var = TWAR;
  Serial.print("avec Wire : ");
  Serial.print("TWAR = ");
  Serial.println(var, BIN);
  
  var = TWAMR;
  Serial.print("avec Wire : ");
  Serial.print("TWAMR = ");
  Serial.println(var, BIN);

  Serial.println();                   
  Serial.print("merci 68tjs");     
}
void loop() { 

}

resultats sur le moniteur série :

sans Wire : TWBR = 0
sans Wire : TWCR = 0
sans Wire : TWSR = 11111000
sans Wire : TWDR = 11111111
sans Wire : TWAR = 11111110
sans Wire : TWAMR = 0


avec Wire : TWBR = 1001000
avec Wire : TWCR = 1000101
avec Wire : TWSR = 11111000
avec Wire : TWDR = 11111111
avec Wire : TWAR = 11111110
avec Wire : TWAMR = 0

merci 68tjs

Bonjour Jacques en fait seul TWBR et TWCR semblent etre affectés tu ne dois pas etre trres loin de la solution :grin:

En effet !! Ça à l'air de marcher ! J'ai juste rajouté à la fin de setUp :

TWBR = 0;
TWCR = 0;

La magie des registres...

En tous cas merci beaucoup à vous tous.

Artouste: en fait seul TWBR et TWCR semblent etre affectés

C'est ce que me semblait mais comme je n'avais pas fait la manip j'ai préféré attendre les résultats. TWBR gère le débit (100k, 400k autre ?) TWCR permet de positionner l'I2C. TWAR et TWAMR doivent gérer l'I2C en mode esclave mais je ne sais pas si Wire gère le mode esclave et donc s'il peut y toucher.

La lib Wire gère aussi le mode esclave apparemment. Pour être sur on peut mettre :

 TWBR = 0
TWCR = 0
TWSR = 11111000
TWDR = 11111111
TWAR = 11111110
TWAMR = 0

Mon arpdress-board est en mode esclave mais j'utilise la library pour attiny qui est différente. En tout cas tout marche bien à présent, merci encore.