1

TUTO XMEGA (ASF) : Entrées/Sorties

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		
	}
}

admin

One Comment

  1. 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

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *