La derniere version de ce tuto est disponible sur le WIKI
ASF Atmel Software Framework
Introduction
ASF est un framwork developpé pour faciliter le développement de vos applications.
Ajouter une librairie
Aller dans ASF → ASF Wizard
Dans project, sélectionner votre projet
Selectionner “GPIO – General purpose Input/Output (service)
Cliquer sur “Add”cliquer sur Add pour l’intégrer à votre projet.
Cliquer sur “Apply” pour confirmer l’importation.
Vous pouvez maintenant utiliser les fonctions de cette librairie. Pour accéder à la descriptions détaillées de ces fonctionner aller dans ASF Explorer → GPIO → API Documentation
GPIO – IOPORT
La librairie GPIO contient les fonctions de base permettant de lire, configurer ou commander une pin d’entrée/sortie.
La librairie IOPORT est également incluse dans le “pack” GPIO et vous offre quelques fonctionnalités supplémentaires en se basant sur la librairie GPIO.
Nous allons ajouter dans notre projet
#include <ioport.h>
pour pouvoir utiliser certains mot-clés.
Commander une sortie
La première chose à faire et de définir quelle pin vous souhaitez commander. Pour ma part, je souhaite piloter une led qui est connectée à PD4. Pour simplifier la lisibilité du code, nous allons définir un nom pour cette sortie :
#define LED_ROUGE IOPORT_CREATE_PIN(PORTD, 4)
Ensuite, il faut initialiser les fonctions IOPORT avant de pouvoir les utiliser.
ioport_init();
Vous devez également définir la direction de votre pin
ioport_set_pin_dir(LED_ROUGE, IOPORT_DIR_OUTPUT);
Ma led est allumée quand PD4 est à 0V. Les XMEGA permettent facilement d’inverser la commande d’une sortie et ensuite avoir une code plus “logique” avec un allumage de la led quand la sortie est mise à “1”.
ioport_set_pin_mode(LED_ROUGE,IOPORT_MODE_INVERT_PIN);
Pour finir par la mettre à l’état haut
ioport_set_pin_level(LED_ROUGE, 1);
Ce qui vous fait, au final
#include <avr/io.h> #include <ioport.h> #define LED_ROUGE IOPORT_CREATE_PIN(PORTD, 4) //LED_Rouge = PD4 int main(void) { //Initialisation des entrées/sorties ioport_init(); //Initialisation d'IOPORT ioport_set_pin_dir(LED_ROUGE, IOPORT_DIR_OUTPUT); //LED_ROUGE est une sortie ioport_set_pin_mode(LED_ROUGE,IOPORT_MODE_INVERT_PIN); //Inverse la commande de la pin LED_ROUGE ioport_set_pin_level(LED_ROUGE,1); //LED_Rouge à l'état haut while(1) { //TODO:: Please write your application code } }
Lire une entrée
On va ajouter à notre code la lecture d’un bouton et modifier l’état de la led en fonction de l’appui du bouton. De la même maniére que pour la LED, nous allons nommer cette entrée bouton.
#define BOUTON IOPORT_CREATE_PIN(PORTF, 1) //BOUTON = PF1
Mon bouton met une masse sur l’entrée lors de l’appui. Tout comme pour la LED, il est plus logique d’inverser cette entrée afin d’avoir un état “1” lors de l’appui.
ioport_set_pin_dir(BOUTON, IOPORT_DIR_INPUT); //BOUTON en entrée ioport_set_pin_mode(BOUTON,IOPORT_MODE_INVERT_PIN); //Inverse l'état de la pin
Nous allons ensuite tester de manière permanente l’état du bouton. Si le bouton est appuyé, la LED sera allumée.
if(ioport_get_pin_level(BOUTON)) //Appui sur le bouton ioport_set_pin_level(LED_ROUGE,1); //Allume la LED else //Relachement du bouton ioport_set_pin_level(LED_ROUGE,0); //Eteind la LED
Voici le code complet :
#include <avr/io.h> #include <ioport.h> #define LED_ROUGE IOPORT_CREATE_PIN(PORTD, 4) //LED_Rouge = PD4 #define BOUTON IOPORT_CREATE_PIN(PORTF, 1) //BOUTON = PF1 int main(void) { //Initialisation des entrées/sorties ioport_init(); //Initialisation d'IOPORT ioport_set_pin_dir(LED_ROUGE, IOPORT_DIR_OUTPUT); //LED_ROUGE est une sortie ioport_set_pin_mode(LED_ROUGE,IOPORT_MODE_INVERT_PIN); //Inverse la commande de la pin ioport_set_pin_dir(BOUTON, IOPORT_DIR_INPUT); //BOUTON en entrée ioport_set_pin_mode(BOUTON,IOPORT_MODE_INVERT_PIN); //Inverse l'état de la pin while(1) { if(ioport_get_pin_level(BOUTON)) //Appui sur le bouton ioport_set_pin_level(LED_ROUGE,1); /Allume la LED else //Relachement du bouton ioport_set_pin_level(LED_ROUGE,0); //Eteind la LED } }
Bonjour, bravo pour ce tuto et les autres aussi. Les tuto pour ASF sont trop râres , surtout en français. Une question comment peut on reinitialiser le bit d’inversion une fois qu’on l’a inversé (cad revenir en non-inversé)?
merci