commander deux sorties en même temps sur un esp8266

Bonjour, L'instruction digitalWrite(pin,état) est super mais oblige à piloter plusieurs sorties les unes après les autres. J'ai découvert que l'on peut piloter plusieurs sorties simultanément en écrivant directement dans un registre nommé GPO.

Voici un exemple qui permet de faire clignoter les sorties 4, 5 et 2 simultanément:

void setup() { 
  pinMode(2, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop() {
  GPO |= 0x00000034;  // GPIO-2 GPIO-4 GPIO-4 et GPIO-5 SET   00110100 force bits 4 et 5 à 1
  delay(200);
  GPO &= 0xFFFFFFCB;  // GPIO-2 GPIO-4 et GPIO-5 RESET 1100 1011  force bits 4 et 5 à 0                   
  delay(200);
}

Ca marche très bien pour les sorties correspondant aux bits 0 à 7 mais pas pour les bits de poids plus élevés. Par exemple, si je veux faire clignoter les sorties 12 et 13 simultanément comme si-dessous cela ne fonctionne pas.

void setup() { 
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
}
void loop() {
  GPO |= 0x03000000;// GPIO-12 GPIO-13 0011 0000 0000 0000
  delay(200);
  GPO &= 0xCFFFFFFF; // GPIO-12 GPIO-13 1100 1111 1111 1111            
  delay(200);
}

Si quelqu'un à une idée, je suis preneur

hello si GPO correspond bien à 2 octets, tu devrais avoir non, testes

GPO |= 0x03000;// et non 0x3000 000. GPIO-12 GPIO-13 0011 0000 0000 0000

GPO &= 0xCFFF; // et non 0xCFFFFFF. GPIO-12 GPIO-13 1100 1111 1111 1111

Non! GPO est un registre 32 bits (esp8266). La sortie 12 correspond au bit 12 comme la sortie 13 au bit 13. voir le lien suivant:

http://www.esp8266.com/viewtopic.php?f=13&t=9407&start=8

Donc, pour moi, sauf erreur cela correspond à:

bit 12 = 0001 0000 0000 0000 = 0x01000000 ( 4 octets ) bit 13 = 0010 0000 0000 0000 = 0x02000000 bit 12+13 = 0011 0000 0000 0000 = 0x03000000

Mais ça ne fonctionne pas. On dirait qu'il y a un bug ou que GPO n'est pas sur 32 bits. Mais dans ce dernier cas, comment accéder aux sorties 9 à 15? Pire qu'en est-il de la sortie 16!

Si quelqu'un peut m'expliquer..

Merci beaucoup pepe Tu m'a ouvert les yeux. J'ai honte.. Pourquoi ais-je mis 2 zéros par digit. Je vais vérifier si ça marche.

J'ai essayé cela (version 16 bits) sans succès:

void setup() { 
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);  
}

void loop() {
  //1100 1111 1111 1111 
  // C    F    F    F  
  GPO &= 0xCFFF;  
  GPO &= 0xCFFF; // 1100 1111
  delay(200);
  // 0011 0000 0000 0000
  //   3   0   0   0
  GPO &= 0x3000;                      
  delay(200);
}

Puis j'ai essayé ce qui suit (version 32 bits) sans succès non plus:

void setup() { 
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);  
}

void loop() {
  //1111 1111 1111 1111 1100 1111 1111 1111 
  //   F    F    F    F    C    F    F    F    
  GPO &= 0xFFFFCFFF;
  delay(200);

  // 0000 0000 0000 0000 0011 0000 0000 0000
  //   0    0    0     0    3    0    0    0
  GPO &= 0x00003000;                      
  delay(200);
}

Marche pas non plus. Je ne sais plus quoi faire...

OUPS! Je devais être fatigué hier soir. Erreur de copier/coller: La version 32 bits fonctionne très bien si on remplace la ligne GPO &= 0x00003000; par la ligne GPO |= 0x00003000;

La version 16 bits avec la même ligne rectifiée car même erreur ne fonctionne pas. Ce qui me semble normal vu que c'est un microprocesseur 32 bits.

Conclusion: Je sais comment mettre à 1 ou à 0 plusieurs GPIO [u]simultanément.[/u]