La manipulation des entrées-sorties à l’aide des registres de port

Description des registres AVR & MSP

R/W MSP AVR USAGE
r/w PxDIR DDRx DIRECTION DES E/S : 0 = input / 1 = output
r PxIN PINx LECTURE DES E/S
r/w PxOUT PORTx ÉCRITURE DES E/S OU SÉLECTION DES RÉSISTANCES DE TIRAGE : 1 = pullup / 0 = pulldown
r/w PxREN   Pullup / Pulldown : 0 = disabled / 1 = enabled
r/w PxSEL   Sélection des fonctions

AVR n’a que les pullups doc AVR, voir datasheet chap. 14 p.75 doc MSP, voir slau144j.pdf p.329, 333

Exemple de programme

/*
  BLINK pin 2 to 9
*/
void setup()
{
  DDRD |= B11111100; // Pin 2 to 7 as outputs
  DDRB |= B00000011; // Pin 8 to 9 as outputs
}

void loop()
{
  // Pin 2 to 7 HIGH
  PORTD |= ( 1<<2 ) | ( 1<<3 ) | ( 1<<4 ) | ( 1<<5 ) | ( 1<<6 ) | ( 1<<7 );
  // Pin 8 to 9 HIGH
  PORTB |= ( 1<<0 ) | ( 1<<1 );

  _delay_ms( 500 );

  // Pin 2 to 7 LOW
  PORTD &= ~( 1<<2 ) & ~( 1<<3 ) & ~( 1<<4 ) & ~( 1<<5 ) & ~( 1<<6 ) & ~( 1<<7 );
  // Pin 8 to 9 LOW
  PORTB &= ~( 1<<0 ) & ~( 1<<1 );

  _delay_ms( 500 );
}

Liens

Manipulation des registres de l’ESP8266

Je n’ai pas trouvé de page qui décrit comment manipuler les registres de l’ESP, mais en fouillant dans les librairie, j’ai réussi à trouver comment réaliser un programme Blink.

/*
  Blink ESP8266 avec manipulation directe du registre GPO.

~/Library/Arduino15/packages/esp8266/hardware/esp8266/2.3.0/cores/esp8266/core_esp8266_wiring_digital.c
~/Library/Arduino15/packages/esp8266/hardware/esp8266/2.3.0/cores/esp8266/esp8266_peri.h

#define ESP8266_REG(addr) *((volatile uint32_t *)(0x60000000+(addr)))
#define GPOS   ESP8266_REG(0x304) //GPIO_OUT_SET WO
#define GPOC   ESP8266_REG(0x308) //GPIO_OUT_CLR WO
#define GP16O  ESP8266_REG(0x768)

GPIO disponibles
0, 1, 2, 3, 4, 5,
9, 10,
12, 13, 14, 15, 16


!! 1 et 3 sont pour l’UART
!! 6, 7, 8 et 11 n’existent pas

*/

#define LED_PIN LED_BUILTIN

void setup()
{
  pinMode( LED_PIN, OUTPUT );
  Serial.begin( 115200 );
  Serial.print( "\n\nLED_PIN = " );
  Serial.println( LED_PIN );
}

void loop()
{
  GPO &= ~(1<<LED_PIN);
  delay( 100 );
  GPO |= (1<<LED_PIN);
  delay( 1000 );
}