Bonjour à toutes et à tous.
Je me prend la tête avec ces adresses.
Chaque registre d'un avr possède une adresse fixe que l'on peut trouver dans la datasheet.
Ainsi :
PIND à pour adresse 0x09
DDRD - > 0x0a
PORTD -> 0x0b
Avec quelques difficultés j'ai réussi à accéder à un registre par son adresse en utilisant la macro _SFR_IO8(hex) comme je l'ai vu appliqué dans le fichier iom328p fourni par Atmel.
uint8_t mem_DDRD ;
mem_DDRD = DDRD;
Serial.print("DDRD de depart ");Serial.println(DDRD, BIN);
#define registre _SFR_IO8(0x0A)
if (&DDRD == ®istre) {Serial.println("Meme adresse \n");} // controle que l'adresse pointée est la même
else {Serial.println("adresses differentes\n");}
Serial.println("\n Modif sur DDRD");
DDRD |= (1<<PORTD7) |(1<<PORTD5) |(1<<PORTD3) ;
Serial.print("DDRD ");Serial.println(DDRD, BIN);
Serial.print("Controle sur Reg ");Serial.println(registre, BIN);
Serial.println("\nRAZ sur registre");
registre = mem_DDRD;
Serial.print("Registre ");Serial.println(registre, BIN);
Serial.print("Controle sur DDRD ");Serial.println(DDRD, BIN);
J'ai du utiliser un #define à l'intérieur du code.
#define registre _SFR_IO8(0x0A)
Je ne suis absolument pas arrivé à utiliser la macro _SFR_IO8() autrement.
Cela fonctionne, cela ne me parait pas anormal mais j'aimerais avoir la confirmation que c'est autorisé.
Existe-t-il une autre façon de faire ?
Par contre impossible de faire l'opération inverse : on connaît un nom, on sait qu'il pointe sur un registre mais comment en obtenir l'adresse puisque dans ce cas la datasheet ne nous est d'aucun secours.
Merci
iom328p.h
Debian : /usr/lib/avr/include/avr
1.65 : hardware/tools/avr/avr/include/avr
1.7.8 : hardware/tools/avr/avr/include/avr