La dernière version de cette article est disponible sur le WIKI.
Les entrées/Sorties des XMEGA sont regroupés par port de 8 bits. Ces ports s’appellent PORTx où x est la lettre du port. Exemple : PORTA, PORTB. Les Pin indivituelles s’appellent Pxn où x correspond au nom du port et n au numéro de la pin. Exemple : PA0
La direction
Chaque pin peut être utilisée en sortie ou en entrée. Ce choix se définit dans le registre DIR. Si DIRn est à “0” la pin est paramétrée en entrée si DIRn est à “1” la pin est configurée en sortie.
Entrée | “0” |
---|---|
Sortie | “1” |
PORTR.DIR = 0xFF; //Met port R en sortie
Etat d’une sortie
L’état de la sortie est contrôlé par le registre OUT. La sortie passera à VCC si OUTn est à “1” et la sortie passera à 0V si la OUTn est à “0”
0V | “0” |
---|---|
VCC | “1” |
PORTR.OUT = 0x0F; //Met PR0 à PR3 3.3V et PR4 à PR7 à 0V
Lecture de l’état d’une entrée
L’état logique d’une entrée peut être obtenu par une lecture du registre IN.
unsigned char EtatPortA; EtatPortA = PORTA.IN;
Configuration
Chaque Pin peut avoir une configuration particulière. Ce paramétrage est réalisé via le registre PINnCTRL.
Nom | Configuration de l’entrée/sortie |
---|---|
PORT_OPC_TOTEM_gc | 0 ou VCC |
PORT_OPC_BUSKEEPER_gc | Mémorise le dernier état sur l’entrée via une résistance Pull-up ou Pull-down |
PORT_OPC_PULLDOWN_gc | Pull-down sur l’entrée |
PORT_OPC_PULLUP_gc | Pull-up sur l’entrée |
PORT_OPC_WIREDAND_gc | OUT=1 → H, OUT=0 → 0V (Collecteur ouvert) |
PORT_OPC_WIREDANDPULL_gc | OUT=1 → Pull-Up, OUT=0 → 0V (Collecteur ouvert avec résistance de tirage) |
PORT_OPC_WIREDOR_gc | OUT=1 → VCC, OUT=0 → H |
PORT_OPC_WIREDORPULL_gc | OUT=1 → VCC, OUT=0 → Pull-Down |
PORTA.PIN0CTRL |= PORT_OPC_PULLUP_gc; //Activation de la résistance de tirage à l'état haut sur PIN0 du PORT A
Sur les PIN déclenchant des interruptions, il est possible de définir le mode de déclenchement.
PORTA.PIN0CTRL |= PORT_ISC_RISING_gc;
Nom | Configuration de l’entrée |
---|---|
PORT_ISC_BOTHEDGES_gc | Front montant et descendant |
PORT_ISC_RISING_gc | Front montant |
PORT_ISC_FALLING_gc | Front descendant |
PORT_ISC_LEVEL_gc | Niveau bas |
PORT_ISC_INPUT_DISABLE_gc | Désactivation du buffer d’entrée |
Inversion
Il est possible d’inverser une entrée. Appliquer 0V sur l’entrée donnera un “1” logique et inversement, appliquer VCC donnera un “0”.
PORTA.PIN0CTRL |= PORT_INVEN_bp;
Interruption
Chaque entrée a 2 interruptions. Activer une interruption se fait en 3 étapes :
-
Configurer le registre PINnCTRL (Choix du mode de déclenchement, front montant etc …)
-
Mettre à “1” le bit correspondant à l’entrée dans le registre INT0MASK
-
Définir le niveau de priorité en paramétrant les registres INT0LVL et INTLVL
Sortie de veille
Quand l’XMEGA se met en veille sont horloge est désactivée. Un changement sur l’entrée doit être détecté de maniéré asynchrone. Tous les modes de déclenchement (front montant, niveau etc …) ne sont pas possible sur toutes les pin. Seule la PIN2 de chaque port permettra un reveil du microcontroleur quelque soit le mode de déclenchement choisi. Pour les autres PIN, il faudra soit les paramétrer en PORT_ISC_BOTHEDGES_gc ou en PORT_ISC_LEVEL_gc.