Bonjour,
Je savais qu'il était possible de programmer en assembleur avec l'IDE arduino avec le mot clé: asm
.
Exemple : soustraction de deux variables v1 et v2 en assembleur :
volatile uint8_t value1 asm("v1") __attribute__ ((used)) = 65;
volatile uint8_t value2 asm("v2") __attribute__ ((used)) = 15;
void setup() {
Serial.begin(115200);
asm
(
"lds r18, v1 \n" // lds : charge un octet de l’espace de données vers un registre
"lds r19, v2 \n"
"sub r18, r19 \n" // sub : soustrait deux registres
"sts v1, r18 \n"// sts : Ecrit le résultat à la même adresse qu’il a été extrait
);
Serial.println(value1);
}
void loop() {}
Je viens de constater qu'il était possible de programmer les registres qui gèrent les pins de l'ATmega328P directement et ceci sans passer par le mot clé asm
. C'est ainsi que j'ai programmer la pin D2 d'une UNO afin de faire clignoter une LED :
void setup() {
DDRD |= B00000100; // Sélection de D2 dans le registre DDRD
//PORTD |= B00000100; // Met D2 à HIGH - l'instruction n'est pas nécessaire
}
void loop() {
PORTD |= B00000100; // Met D2 à HIGH
delay(200);
PORTD ^= B00000100; //PORTD &= ~B00000100; // met D2 à low
delay(1000);
}
J'ai trouvé ce schéma concernant la gestion de ces registres :
C'est ainsi que :
- les broches D0, D1, D2, D3, D4, D5, D6 et D7 font partie du groupe D ;
- les broches D8, D9, D10, D11, D12 et D13 font partie du groupe B ;
- les broches analogiques font partie du groupe C.
Du coup il y a 9 registres utilisables :
-
PORTD, PIND et DDRD pour les broches D0, D1, D2, D3, D4, D5 et D6;
-
PORTB, PINB et DDRB pour les broches D8, D9, D10, D11, D12 et D13;
-
PORTC, PINC et DDRC pour les broches analogiques.
-
les registres DDR (Data Direction Register) permettent de positionner le sens d'un port (INPUT, OUTPUT);
-
les registres PORT permettent de positionner l'état d'un port (HIGH ou LOW);
-
les registres PIN permettent de lire l'état d'un port.
Là où je coince c'est au niveau de la sélection d'une pin en entrée et en INPUT_PULLUP.
J'ai bien compris que pour paramétrer en entrée par exemple la pin D7, il va falloir que je positionne à 0 le bit de poids fort (b7) dans le registre DDRD. A l'inverse si je souhaite programmer cette pin en sortie, il me faut armer ce bit : DDRD |= B10000000;
Donc pour paramétrer une pin en entrée, il faut mettre à 0 le bit du registre DDR qui lui correspond. Mais alors comment fait on pour paramétrer une pin en entrée avec l'utilisation du pullup interne ?
J'ai pensé qu'il fallait peut-être mettre le bit à 1 dans le registre DDR et utiliser le registre PIN correspondant ?
Merci par avance.