Defines explication

Fermé
Tibo06 Messages postés 5 Date d'inscription mercredi 4 juillet 2007 Statut Membre Dernière intervention 21 mars 2008 - 20 mars 2008 à 09:49
Tibo06 Messages postés 5 Date d'inscription mercredi 4 juillet 2007 Statut Membre Dernière intervention 21 mars 2008 - 21 mars 2008 à 16:51
Bonjour a tous!
Tout d'abord merci de me repondre si vous le faite.
Alors voila mon probleme (je vais essayer d'etre le plus clair possible), je sais bien ce qu'est un #include mais le reste me parait quelque peu mysterieux.
D'apres ce que j'ai compris il sagit des definitions des adresse des registre du µC mais je sui scurieux de savoir ce que fait au final la derniere ligne

BASE_PIO_LED->PIO_OER = (LED_A | LED_B);

pouvez vous m'expliquer par ordre cronologique ce qui se passe svp?

Je dois aussi avouer que je ne saisi pas non plus ces lignes
#define PIO_OER         (AT91_CAST(AT91_REG *) 	0x00000010)
#define AT91C_BASE_PIOA	(AT91_CAST(AT91PS_PIO) 0xFFFFF400)

Pour les AT91 CAST et REG * et les 0x... je ne m'y retrouve plus pourriez vous me dire ce qui se passe pour chacune des variables.

Pour cette ligne il me faudrai juste la confirmation que la variable vaut 1 décalé de 0 donc 1.
#define AT91C_PIO_PA0	(1 <<  0)





/**Dans fichier AT91SAM7S64.h**/
#ifndef __ASSEMBLY__
typedef volatile unsigned int AT91_REG;// Hardware register definition
#define AT91_CAST(a) (a)
#else
#define AT91_CAST(a)
#endif

#ifndef __ASSEMBLY__
typedef struct _AT91S_PIO {
	...
	...
	...
	AT91_REG	PIO_OER;	// Output Enable Register
	...
	...
} AT91S_PIO, *AT91PS_PIO;
#else
#define ...
#define ...
#define ...
#define PIO_OER         (AT91_CAST(AT91_REG *) 	0x00000010) // (PIO_OER) Output Enable Register
#define ...
#define ...
#endif

#define AT91C_PIOA_PER	(AT91_CAST(AT91_REG *) 0xFFFFF400) //(PIOA) PIO Enable Register


#define AT91C_PIO_PA0	(1 <<  0)	//Pin Controlled by PA0
#define AT91C_PIO_PA1	(1 <<  1)	//Pin Controlled by PA1
#define AT91C_BASE_PIOA	(AT91_CAST(AT91PS_PIO) 0xFFFFF400) //(PIOA) Base Address




/**Dans fichier AT91SAM7S-EK.h**/
#include "AT91SAM7S64.h"

#define AT91B_LED1          AT91C_PIO_PA0
#define AT91B_LED2          AT91C_PIO_PA1
#define AT91D_BASE_PIO_LED  AT91C_BASE_PIOA



/**Dans fichier main.c**/

#include "AT91SAM7S-EK.h"
#include "AT91SAM7S64.h"

#define LED_A          AT91B_LED1
#define LED_B          AT91B_LED2
#define BASE_PIO_LED   AT91D_BASE_PIO_LED

BASE_PIO_LED->PIO_OER = (LED_A | LED_B);


Merci beaucoup à tous.
Tibo

3 réponses

Tibo06 Messages postés 5 Date d'inscription mercredi 4 juillet 2007 Statut Membre Dernière intervention 21 mars 2008
20 mars 2008 à 09:52
Juste un truc, je sais quand meme que 0x... c'est de l'hexa mais je ne voit pas ce que ca fait apres les parentheses ou *
En gros un define tout simple ca va mais quand ce deviens tortueux je galere un peu voir meme beaucoup.
0
Bonjour

BASE_PIO_LED->PIO_OER = (LED_A | LED_B);

Cette ligne met à un 2 bits d'un port du microcontroleur, ce qui a pour effet d'allumer ou d'éteindre (ça dépend du hard) les deux leds correspondantes. Au passage, ça met à 0 tous les autres bits du port, tant pis pour eux.

Le sens du AT91_CAST change suivant que __ASSEMBLY__ est défini ou non. Je suppose que __ASSEMBLY__ est défini dans les passages en assembleur, et pas dans les passages en C. Pour en être sûr, il faudrait lire le manuel du compilateur.
Nous allons nous en tenir au cas du 'pur C'
la définition #define PIO_OER (AT91_CAST(AT91_REG *) 0x00000010) ne s'applique pas puisqu'elle est dans la branche #else du #ifndef __ASSEMBLY__
C'est la définition de la structure AT91S_PIO qui s'applique et PIO_OER est un champ de cette structure, (ce qui explique qu'il aparaît à droite d'un -> )

#define AT91C_BASE_PIOA (AT91_CAST(AT91PS_PIO) 0xFFFFF400) maintenant - toujours dans le cas du C
regarde la définition de AT91_CAST, tu vois que c'est équivallent à
#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400)
ce qui définit un pointeur sur la structure AT91S_PIO, pointeur dont la valeur est constante et vaut 0xFF..FF400.

Sans cette syntaxe, comment ferais tu en C pour écrire dans le registre d'adresse 0xFFFFF410 ? (bien sûr que oui, il y a d'autres manières, mais pas plus 'légères', je crois)
0
Tibo06 Messages postés 5 Date d'inscription mercredi 4 juillet 2007 Statut Membre Dernière intervention 21 mars 2008
21 mars 2008 à 16:37
Bonjour, merci pour cette reponse. J'ai compris à peu pres l'explication mais ce n'est pas encore bien clair, en fait je me doutais bien que c'etait des definitions d'adresse de registre mais si je devais ecrire des lignes comme celles ci par moi meme je ne pense en etre capable.
J'imagine qu'il me faudrai une bonne revision des structures define et pointeurs. Connaitrais tu un tuto bien fait sur le sujet?
Merci encore
Tibo
0
Bonjour

Désolé pour le tuto, je n'en ai pas.
0
Tibo06 Messages postés 5 Date d'inscription mercredi 4 juillet 2007 Statut Membre Dernière intervention 21 mars 2008
21 mars 2008 à 16:51
Ce n'est pas grave, c'est deja tres gentil d'avoir passé du temps pour m'expliquer tout ca.
Bonne journée et joyeuse paque
Tibo
0