{"id":58,"date":"2014-08-23T09:54:27","date_gmt":"2014-08-23T08:54:27","guid":{"rendered":"http:\/\/www.jelectronique.com\/?p=58"},"modified":"2014-08-30T13:22:15","modified_gmt":"2014-08-30T12:22:15","slug":"tuto-asf-entreessorties","status":"publish","type":"post","link":"https:\/\/www.jelectronique.com\/?p=58","title":{"rendered":"TUTO XMEGA (ASF) : Entr\u00e9es\/Sorties"},"content":{"rendered":"<blockquote>\n<p class=\"sectionedit6\">La derniere version de ce tuto est disponible sur le <a href=\"http:\/\/wiki.jelectronique.com\/doku.php?id=avr_studio_6&amp;#gpio_-_ioport\">WIKI <\/a><\/p>\n<\/blockquote>\n<h2 id=\"asf_atmel_software_framework\" class=\"sectionedit6\">ASF Atmel Software Framework<\/h2>\n<h3 id=\"introduction\" class=\"sectionedit7\">Introduction<\/h3>\n<div class=\"level3\">\n<p>ASF est un framwork developp\u00e9 pour faciliter le d\u00e9veloppement de vos applications.<\/p>\n<\/div>\n<h3 id=\"ajouter_une_librairie\" class=\"sectionedit8\">Ajouter une librairie<\/h3>\n<div class=\"level3\">\n<p>Aller dans ASF \u2192 ASF Wizard<br \/>\nDans project, s\u00e9lectionner votre projet<br \/>\nSelectionner \u201cGPIO &#8211; General purpose Input\/Output (service)<br \/>\nCliquer sur \u201cAdd\u201dcliquer sur Add pour l&rsquo;int\u00e9grer \u00e0 votre projet.<\/p>\n<p><a class=\"media\" title=\"avr_studio_asf_gpio.png\" href=\"http:\/\/wiki.jelectronique.com\/lib\/exe\/detail.php?id=avr_studio_6&amp;media=avr_studio_asf_gpio.png\"><img decoding=\"async\" class=\"media\" src=\"http:\/\/wiki.jelectronique.com\/lib\/exe\/fetch.php?w=800&amp;tok=49305f&amp;media=avr_studio_asf_gpio.png\" alt=\"\" width=\"800\" \/><\/a><\/p>\n<p>Cliquer sur \u201cApply\u201d pour confirmer l&rsquo;importation.<\/p>\n<p>Vous pouvez maintenant utiliser les fonctions de cette librairie. Pour acc\u00e9der \u00e0 la descriptions d\u00e9taill\u00e9es de ces fonctionner aller dans ASF Explorer \u2192 GPIO \u2192 <abbr title=\"Application Programming Interface\">API<\/abbr> Documentation<\/p>\n<\/div>\n<h3 id=\"gpio_-_ioport\" class=\"sectionedit9\">GPIO &#8211; IOPORT<\/h3>\n<div class=\"level3\">\n<p>La librairie GPIO contient les fonctions de base permettant de lire, configurer ou commander une pin d&rsquo;entr\u00e9e\/sortie.<\/p>\n<p>La librairie IOPORT est \u00e9galement incluse dans le \u201cpack\u201d GPIO et vous offre quelques fonctionnalit\u00e9s suppl\u00e9mentaires en se basant sur la librairie GPIO.<\/p>\n<p>Nous allons ajouter dans notre projet<\/p>\n<pre class=\"code C\"><span class=\"co2\">#include &lt;ioport.h&gt;<\/span><\/pre>\n<p>pour pouvoir utiliser certains mot-cl\u00e9s.<\/p>\n<\/div>\n<h4 id=\"commander_une_sortie\">Commander une sortie<\/h4>\n<div class=\"level4\">\n<p>La premi\u00e8re chose \u00e0 faire et de d\u00e9finir quelle pin vous souhaitez commander. Pour ma part, je souhaite piloter une led qui est connect\u00e9e \u00e0 PD4. Pour simplifier la lisibilit\u00e9 du code, nous allons d\u00e9finir un nom pour cette sortie :<\/p>\n<pre class=\"code c\"><span class=\"co2\">#define LED_ROUGE IOPORT_CREATE_PIN(PORTD, 4)<\/span><\/pre>\n<p>Ensuite, il faut initialiser les fonctions IOPORT avant de pouvoir les utiliser.<\/p>\n<pre class=\"code c\">ioport_init<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><\/pre>\n<p>Vous devez \u00e9galement d\u00e9finir la direction de votre pin<\/p>\n<pre class=\"code c\">ioport_set_pin_dir<span class=\"br0\">(<\/span>LED_ROUGE<span class=\"sy0\">,<\/span> IOPORT_DIR_OUTPUT<span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><\/pre>\n<p>Ma led est allum\u00e9e quand PD4 est \u00e0 0V. Les XMEGA permettent facilement d&rsquo;inverser la commande d&rsquo;une sortie et ensuite avoir une code plus \u201clogique\u201d avec un allumage de la led quand la sortie est mise \u00e0 \u201c1\u201d.<\/p>\n<pre class=\"code c\">ioport_set_pin_mode<span class=\"br0\">(<\/span>LED_ROUGE<span class=\"sy0\">,<\/span>IOPORT_MODE_INVERT_PIN<span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><\/pre>\n<p>Pour finir par la mettre \u00e0 l&rsquo;\u00e9tat haut<\/p>\n<pre class=\"code c\">ioport_set_pin_level<span class=\"br0\">(<\/span>LED_ROUGE<span class=\"sy0\">,<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><\/pre>\n<p>Ce qui vous fait, au final<\/p>\n<pre class=\"code C\"><span class=\"co2\">#include &lt;avr\/io.h&gt;<\/span>\r\n<span class=\"co2\">#include &lt;ioport.h&gt;<\/span>\r\n\u00a0\r\n<span class=\"co2\">#define LED_ROUGE IOPORT_CREATE_PIN(PORTD, 4) \/\/LED_Rouge = PD4<\/span>\r\n\u00a0\r\n<span class=\"kw4\">int<\/span> main<span class=\"br0\">(<\/span><span class=\"kw4\">void<\/span><span class=\"br0\">)<\/span>\r\n<span class=\"br0\">{<\/span>\r\n\t<span class=\"co1\">\/\/Initialisation des entr\u00e9es\/sorties<\/span>\r\n\tioport_init<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\t\t\t\t\t\t<span class=\"co1\">\/\/Initialisation d'IOPORT<\/span>\r\n\tioport_set_pin_dir<span class=\"br0\">(<\/span>LED_ROUGE<span class=\"sy0\">,<\/span> IOPORT_DIR_OUTPUT<span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\t<span class=\"co1\">\/\/LED_ROUGE est une sortie<\/span>\r\n\tioport_set_pin_mode<span class=\"br0\">(<\/span>LED_ROUGE<span class=\"sy0\">,<\/span>IOPORT_MODE_INVERT_PIN<span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\t<span class=\"co1\">\/\/Inverse la commande de la pin LED_ROUGE <\/span>\r\n\u00a0\r\n\tioport_set_pin_level<span class=\"br0\">(<\/span>LED_ROUGE<span class=\"sy0\">,<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\t\t\t<span class=\"co1\">\/\/LED_Rouge \u00e0 l'\u00e9tat haut<\/span>\r\n\u00a0\r\n    <span class=\"kw1\">while<\/span><span class=\"br0\">(<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">)<\/span>\r\n    <span class=\"br0\">{<\/span>\r\n        <span class=\"co1\">\/\/TODO:: Please write your application code <\/span>\r\n    <span class=\"br0\">}<\/span>\r\n<span class=\"br0\">}<\/span><\/pre>\n<\/div>\n<h4 id=\"lire_une_entree\">Lire une entr\u00e9e<\/h4>\n<div class=\"level4\">\n<p>On va ajouter \u00e0 notre code la lecture d&rsquo;un bouton et modifier l&rsquo;\u00e9tat de la led en fonction de l&rsquo;appui du bouton. De la m\u00eame mani\u00e9re que pour la LED, nous allons nommer cette entr\u00e9e bouton.<\/p>\n<pre class=\"code C\"><span class=\"co2\">#define BOUTON IOPORT_CREATE_PIN(PORTF, 1)\t\t\/\/BOUTON = PF1<\/span><\/pre>\n<p>Mon bouton met une masse sur l&rsquo;entr\u00e9e lors de l&rsquo;appui. Tout comme pour la LED, il est plus logique d&rsquo;inverser cette entr\u00e9e afin d&rsquo;avoir un \u00e9tat \u201c1\u201d lors de l&rsquo;appui.<\/p>\n<pre class=\"code C\">\tioport_set_pin_dir<span class=\"br0\">(<\/span>BOUTON<span class=\"sy0\">,<\/span> IOPORT_DIR_INPUT<span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\t\t\t<span class=\"co1\">\/\/BOUTON en entr\u00e9e<\/span>\r\n\tioport_set_pin_mode<span class=\"br0\">(<\/span>BOUTON<span class=\"sy0\">,<\/span>IOPORT_MODE_INVERT_PIN<span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\t\t<span class=\"co1\">\/\/Inverse l'\u00e9tat de la pin<\/span><\/pre>\n<p>Nous allons ensuite tester de mani\u00e8re permanente l&rsquo;\u00e9tat du bouton. Si le bouton est appuy\u00e9, la LED sera allum\u00e9e.<\/p>\n<pre class=\"code C\"><span class=\"kw1\">if<\/span><span class=\"br0\">(<\/span>ioport_get_pin_level<span class=\"br0\">(<\/span>BOUTON<span class=\"br0\">)<\/span><span class=\"br0\">)<\/span>\t\t<span class=\"co1\">\/\/Appui sur le bouton<\/span>\r\n\tioport_set_pin_level<span class=\"br0\">(<\/span>LED_ROUGE<span class=\"sy0\">,<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\t<span class=\"co1\">\/\/Allume la LED<\/span>\r\n<span class=\"kw1\">else<\/span>\t\t\t\t\t\t<span class=\"co1\">\/\/Relachement du bouton<\/span>\r\n\tioport_set_pin_level<span class=\"br0\">(<\/span>LED_ROUGE<span class=\"sy0\">,<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\t<span class=\"co1\">\/\/Eteind la LED<\/span><\/pre>\n<p>Voici le code complet :<\/p>\n<pre class=\"code C\"><span class=\"co2\">#include &lt;avr\/io.h&gt;<\/span>\r\n<span class=\"co2\">#include &lt;ioport.h&gt;<\/span>\r\n\u00a0\r\n<span class=\"co2\">#define LED_ROUGE IOPORT_CREATE_PIN(PORTD, 4)\t\/\/LED_Rouge = PD4<\/span>\r\n<span class=\"co2\">#define BOUTON IOPORT_CREATE_PIN(PORTF, 1)\t\/\/BOUTON = PF1<\/span>\r\n\u00a0\r\n<span class=\"kw4\">int<\/span> main<span class=\"br0\">(<\/span><span class=\"kw4\">void<\/span><span class=\"br0\">)<\/span>\r\n<span class=\"br0\">{<\/span>\r\n\t<span class=\"co1\">\/\/Initialisation des entr\u00e9es\/sorties<\/span>\r\n\tioport_init<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\t\t\t\t\t\t\t<span class=\"co1\">\/\/Initialisation d'IOPORT<\/span>\r\n\tioport_set_pin_dir<span class=\"br0\">(<\/span>LED_ROUGE<span class=\"sy0\">,<\/span> IOPORT_DIR_OUTPUT<span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\t\t<span class=\"co1\">\/\/LED_ROUGE est une sortie<\/span>\r\n\tioport_set_pin_mode<span class=\"br0\">(<\/span>LED_ROUGE<span class=\"sy0\">,<\/span>IOPORT_MODE_INVERT_PIN<span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\t\t<span class=\"co1\">\/\/Inverse la commande de la pin  <\/span>\r\n\u00a0\r\n\tioport_set_pin_dir<span class=\"br0\">(<\/span>BOUTON<span class=\"sy0\">,<\/span> IOPORT_DIR_INPUT<span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\t\t\t<span class=\"co1\">\/\/BOUTON en entr\u00e9e<\/span>\r\n\tioport_set_pin_mode<span class=\"br0\">(<\/span>BOUTON<span class=\"sy0\">,<\/span>IOPORT_MODE_INVERT_PIN<span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\t\t<span class=\"co1\">\/\/Inverse l'\u00e9tat de la pin<\/span>\r\n\u00a0\r\n\t<span class=\"kw1\">while<\/span><span class=\"br0\">(<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">)<\/span>\r\n\t<span class=\"br0\">{<\/span>\r\n\t\t<span class=\"kw1\">if<\/span><span class=\"br0\">(<\/span>ioport_get_pin_level<span class=\"br0\">(<\/span>BOUTON<span class=\"br0\">)<\/span><span class=\"br0\">)<\/span>\t\t<span class=\"co1\">\/\/Appui sur le bouton<\/span>\r\n\t\t\tioport_set_pin_level<span class=\"br0\">(<\/span>LED_ROUGE<span class=\"sy0\">,<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\t<span class=\"sy0\">\/<\/span>Allume la LED\r\n\t\t<span class=\"kw1\">else<\/span>\t\t\t\t\t\t<span class=\"co1\">\/\/Relachement du bouton<\/span>\r\n\t\t\tioport_set_pin_level<span class=\"br0\">(<\/span>LED_ROUGE<span class=\"sy0\">,<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\t<span class=\"co1\">\/\/Eteind la LED\t\t<\/span>\r\n\t<span class=\"br0\">}<\/span>\r\n<span class=\"br0\">}<\/span><\/pre>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>La derniere version de ce tuto est disponible sur le WIKI ASF Atmel Software Framework Introduction ASF est un framwork developp\u00e9 pour faciliter le d\u00e9veloppement de vos applications. Ajouter une librairie Aller dans ASF \u2192 ASF Wizard Dans project, s\u00e9lectionner&hellip; <a href=\"https:\/\/www.jelectronique.com\/?p=58\" class=\"more-link\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":26,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-58","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-electronique"],"_links":{"self":[{"href":"https:\/\/www.jelectronique.com\/index.php?rest_route=\/wp\/v2\/posts\/58","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.jelectronique.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jelectronique.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jelectronique.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jelectronique.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=58"}],"version-history":[{"count":4,"href":"https:\/\/www.jelectronique.com\/index.php?rest_route=\/wp\/v2\/posts\/58\/revisions"}],"predecessor-version":[{"id":103,"href":"https:\/\/www.jelectronique.com\/index.php?rest_route=\/wp\/v2\/posts\/58\/revisions\/103"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.jelectronique.com\/index.php?rest_route=\/wp\/v2\/media\/26"}],"wp:attachment":[{"href":"https:\/\/www.jelectronique.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=58"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jelectronique.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=58"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jelectronique.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=58"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}