[Question] Utilisation des adresses des registres

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 == &registre)  {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

J'ai attaqué sur le forum anglophone en parrallèle étant bien conscient que je posais une question à la c*n.
Si je retire les trop fréquentes réponses : "contente toi de ce fait arduino et ne va pas chercher ailleurs", j'ai eu une réponse très sensée :
Les registres ne sont pas en RAM donc essayer de les traiter comme un pointeur est voué à l'échec.

Les registres sont dans une zone réservée de la flash, d'où cette macro qui m'était inconnue jusqu'à aujourd'hui _SFR_IO8().

Je repars faire des fouilles archéologiques dans les fichiers avr.

Hello,

Trouvé ce document qui confirme tes découvertes : http://courses.cs.washington.edu/courses/csep567/10wi/lectures/Lecture7.pdf

contente toi de ce fait arduino et ne va pas chercher ailleurs

Avec des raisonnement pareils, on n'aurait jamais inventé la roue... ::slight_smile:

Coyotte