Go Down

Topic: [Question] Utilisation des adresses des registres (Read 511 times) previous topic - next topic

68tjs

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.
Code: [Select]
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.
Code: [Select]
#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


68tjs

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.

coyotte

Hello,

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

Quote
contente toi de ce fait arduino et ne va pas chercher ailleurs
Avec des raisonnement pareils, on n'aurait jamais inventé la roue...  ::)

Coyotte
Conference over procrastination has been postponed to tomorrow

Go Up