<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2735257926618761763</id><updated>2012-02-16T08:12:40.150+01:00</updated><category term='Pmbsd'/><category term='libre'/><category term='Virtualisation'/><category term='AVR'/><category term='Stage'/><category term='Embarqué'/><category term='Programmation'/><category term='Electronique'/><category term='NetBSD'/><category term='livre'/><category term='Operating System'/><category term='C'/><title type='text'>Pichon Julien</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://pichonjulien.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://pichonjulien.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Julien Pichon</name><uri>http://www.blogger.com/profile/02749623446343456914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2735257926618761763.post-2532429999736032376</id><published>2009-11-22T11:53:00.043+01:00</published><updated>2009-11-22T23:00:39.705+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Electronique'/><category scheme='http://www.blogger.com/atom/ns#' term='AVR'/><title type='text'>Pilotage d'un afficheur 7 segments</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_wN4_ANGd9Gk/SwO8mdZllLI/AAAAAAAAAFs/HViLfWl-2eA/s1600/7segmentDisplay.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_wN4_ANGd9Gk/SwO8mdZllLI/AAAAAAAAAFs/HViLfWl-2eA/s320/7segmentDisplay.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;Un afficheur 7 segments est un composant qui permet d'afficher les chiffres de 0 à 9. Ils sont encore utilisés aujourd'hui malgrè l'importante présence du LCD sur le marché de l'affichage électronique. Les 7 segments sont adaptés lorsqu'un large affichage numérique est requis comme pour les écrans dans les gares, les montres/horloges digitales, calculatrices, multimètres ... En plus de cela ils sont économiques, robustes et fiables comparés aux LCD.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Comment ça fonctionne&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Un segment est en fait une LED, et les 7 sont arrangées en forme de huit. Pour disposer les chiffres il faut allumer certains segments, et en laisser d'autres éteints. Ces segments pour être identifiés facilement sont associés à des lettres:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_wN4_ANGd9Gk/SwLFp1R50FI/AAAAAAAAAFM/6V-iJkFI-oY/s1600/7segments.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_wN4_ANGd9Gk/SwLFp1R50FI/AAAAAAAAAFM/6V-iJkFI-oY/s320/7segments.PNG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Si l'on s'intéresse de plus prés au brochage, on s'aperçoit que chaque LED possède une de ses extrémités connectée à une broche commune. Lorsque toutes les anodes des LED sont mises en commun on parle d'un 7 segments à anode commune (Common anode), et cathode commune (Common cathode) lorsque les LED ont leur cathode en commun. Les boitiers de ces équipements sont donc équipés de 10 broches (8 broches + 1 commune + alimentation + masse).&lt;br /&gt;Pour allumer un segment sur un "Common cathode", il faut utiliser les pin d'un des ports de l'ATtiny2313. Les configurer en sortie, puis passer certaines au niveau HAUT pour pouvoir afficher le chiffre désiré. Pour un "Common anode" c'est différent, il faut configurer certaines pin en entrée pour pouvior les mettre à la masse et ainsi laisser passer le courant. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Montage&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Voici le composant:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_wN4_ANGd9Gk/SwhBx1mIgDI/AAAAAAAAAF8/tY1vGcHjt6g/s1600/Photo+001.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_wN4_ANGd9Gk/SwhBx1mIgDI/AAAAAAAAAF8/tY1vGcHjt6g/s320/Photo+001.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;C'est un afficheur 7 segments que j'ai récupéré, et dont j'ignore le modèle/la marque. J'ai donc avec tatonnement et un peu de chance réussit à découvrir que c'est un "Common anode" dont voici le brochage:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_wN4_ANGd9Gk/SwhXqwpf58I/AAAAAAAAAGs/lUC0HBixYjc/s1600/7seg.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_wN4_ANGd9Gk/SwhXqwpf58I/AAAAAAAAAGs/lUC0HBixYjc/s200/7seg.PNG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Il possède en réalité 8 segments, un segment supplémentaire nommé dp (pour decimal point) permet comme son nom l'indique d'afficher un point pour faire la séparation entre les chiffres avant la virgule et après. Une chose assez surprenante c'est que le dp est à gauche, contrairement à la majorité des 7 segments où il est à droite. Ca m'apprendra à faire de la récup' dans le grenier tiens :/. De plus j'ignore l'utilité des broches 3, 5, 8.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_wN4_ANGd9Gk/Swg-ykXn_lI/AAAAAAAAAF0/1CMmXNEC7Yc/s1600/montage.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_wN4_ANGd9Gk/Swg-ykXn_lI/AAAAAAAAAF0/1CMmXNEC7Yc/s400/montage.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Comme on peut le voir sur le schéma, piloter ce 7seg demande 8 broches. Une résistance est placée entre chaque masse des segments et la pin du microcontrôleur. J'aurais très bien pu mettre une résistance entre Vcc et la broche d'alimentation du 7seg, mais l'éclairage des LED n'aurait pas été uniforme comme expliqué dans &lt;a href="http://www.picbasic.com/resources/articles/ledart.htm"&gt;cet article&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Le montage réalisé sur ma platine d'essai:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_wN4_ANGd9Gk/SwhCJX6w_KI/AAAAAAAAAGE/ZsD2Y06o_Hs/s1600/Photo+005.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_wN4_ANGd9Gk/SwhCJX6w_KI/AAAAAAAAAGE/ZsD2Y06o_Hs/s400/Photo+005.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Oui je sais ça fait un peu fouillis avec les câbles :), plus tard quand j'aurais le matériel je réaliserai des circuits imprimés.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tournons nous à présent vers le code nécessaire pour faire fonctionner l'afficheur.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#define    F_CPU    1000000UL&lt;br /&gt;#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#include "7segment.h"&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * We use Timer1 to trigger an interrupt&lt;br /&gt; * at 1Hz&lt;br /&gt; */&lt;br /&gt;void init_timer()&lt;br /&gt;{&lt;br /&gt;    TCNT1 = 0;&lt;br /&gt;&lt;br /&gt;    /* Clear Timer on Compare Mode */&lt;br /&gt;    TCCR1B |= (1&amp;lt;&amp;lt;WGM12);&lt;br /&gt;&lt;br /&gt;    /* TOP for the counter */&lt;br /&gt;    OCR1A = 15624;&lt;br /&gt;&lt;br /&gt;    /* Enable interrupt when for CTC */&lt;br /&gt;    TIMSK |= (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;&lt;br /&gt;    /* start the timer with a prescaler of 64 */&lt;br /&gt;    TCCR1B |= (1&amp;lt;&amp;lt;CS10) | (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[])&lt;br /&gt;{&lt;br /&gt;    init_timer();&lt;br /&gt;    sei();&lt;br /&gt;&lt;br /&gt;    while(1) {&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ISR(TIMER1_COMPA_vect)&lt;br /&gt;{&lt;br /&gt;    static unsigned char i = 0;&lt;br /&gt;&lt;br /&gt;    put_number(i);&lt;br /&gt;&lt;br /&gt;    if(i &amp;lt; 10)&lt;br /&gt;        i++;&lt;br /&gt;    else&lt;br /&gt;        i = 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Je commence par initialiser le timer1 de manière qu'il déclenche une interruption toute les secondes (1Hz). Ensuite dans le gestionnaire d'interruption j'appel une fonction: put_number, à laquelle on envoi un paramètre: le chiffre que l'on souhait afficher. Celle-ci se charge de piloter correctement les pin de l'ATtiny2313 pour afficher le chiffre donné en paramètre sur le 7seg. La fonction est définie dans 7segment.c et ressemble à ceci:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;int put_number(int num)&lt;br /&gt;{&lt;br /&gt;    clear_display();&lt;br /&gt;    if(num &amp;gt; 10) {&lt;br /&gt;        return -1;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    switch(num) {&lt;br /&gt;        case 0:&lt;br /&gt;            NUM0;&lt;br /&gt;            break;&lt;br /&gt;  ...&lt;br /&gt;        case 9:&lt;br /&gt;            NUM9;&lt;br /&gt;            break;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return 1;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;J'utilise un jeu de macro NUM0 NUM1 ... NUM9 pour simplifier la réutilisation du code, si le brochage change. NUM0 est définit tel que:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;#define NUM0 ({ \&lt;br /&gt;    DDR_a |= a; \&lt;br /&gt;    DDR_b |= b; \&lt;br /&gt;    DDR_c |= c; \&lt;br /&gt;    DDR_d |= d; \&lt;br /&gt;    DDR_e |= e; \&lt;br /&gt;    DDR_f |= f; \&lt;br /&gt;})&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;DDR_a est définit dans l'en-tête 7segment.h, il correspond au Data Direction Register du port auquel est connecté le segment "a". "a" quant à lui est aussi définit dans 7segment.h et il correspond à une pin du microcontrôleur (PB0, PD2 ...). Ainsi on peut utiliser cette bibliothèque indépendemment du brochage fait, il faut juste renseigner correctement dans 7segment.h quel segment est connecté à quel broche, et aussi indiquer à quel port le segment est connecté.&lt;br /&gt;Pour le montage que j'ai effectué voici comment sont renseignées ces informations. &lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;/* Specify the pin-out */&lt;br /&gt;#define a    (1&amp;lt;&amp;lt;PB0)&lt;br /&gt;#define b    (1&amp;lt;&amp;lt;PB3)&lt;br /&gt;#define c    (1&amp;lt;&amp;lt;PB2)&lt;br /&gt;#define d    (1&amp;lt;&amp;lt;PD5)&lt;br /&gt;#define e    (1&amp;lt;&amp;lt;PD4)&lt;br /&gt;#define f    (1&amp;lt;&amp;lt;PD3)&lt;br /&gt;#define g    (1&amp;lt;&amp;lt;PB4)&lt;br /&gt;#define dp    (1&amp;lt;&amp;lt;PD2)&lt;br /&gt;&lt;br /&gt;#define DDR_a    DDRB&lt;br /&gt;#define DDR_b    DDRB&lt;br /&gt;#define DDR_c    DDRB&lt;br /&gt;#define DDR_d    DDRD&lt;br /&gt;#define DDR_e    DDRD&lt;br /&gt;#define DDR_f    DDRD&lt;br /&gt;#define DDR_g    DDRB&lt;br /&gt;#define DDR_dp    DDRD&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Le code source complet se situe &lt;a href="http://pichon.julien62.free.fr/7segment.tar.gz"&gt;ici&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="364" width="445"&gt;&lt;param name="movie" value="http://www.youtube.com/v/KMZxYAmKvG4&amp;hl=fr_FR&amp;fs=1&amp;rel=0&amp;border=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/KMZxYAmKvG4&amp;hl=fr_FR&amp;fs=1&amp;rel=0&amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="445" height="364"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Aller plus loin&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Le montange que je vous ai présenté est simple. Mais qu'arrive-t-il si l'on souhaite piloter plusieurs 7 segments avec un seul ATtiny2313 ? Toutes les broches des ports sont vite consommées. Il existe pour cela plusieurs solutions pour pallier le problème:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Binary Coded Decimal&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Le BCD est un composant électronique qui convertit une entrée décimale codée en binaire, en un ensemble de signaux qui active les bon segments de l'afficheur pour afficher le nombre décimale codé en binaire donné en entrée.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_wN4_ANGd9Gk/SwOwg7WvaXI/AAAAAAAAAFU/xOQuJxlnxIU/s1600/tableau.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_wN4_ANGd9Gk/SwOwg7WvaXI/AAAAAAAAAFU/xOQuJxlnxIU/s320/tableau.PNG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_wN4_ANGd9Gk/SwO4duY6QPI/AAAAAAAAAFk/qI9r3BekXMo/s1600/4511.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_wN4_ANGd9Gk/SwO4duY6QPI/AAAAAAAAAFk/qI9r3BekXMo/s320/4511.PNG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;L'intérêt de ce composant est l'économie des broches utilisées par le microcontrôleur, mais aussi l'économie du code qui doit piloter l'afficheur 7 segments, en effet en utilisant le 4511 on lui délègue la gestion de l'afficheur. On lui soumet juste en entrée un nombre décimal codé en binaire sur les 4 entrées ABCD.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Le multiplexage temporel&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Cette technique est basée sur le phénomène de la &lt;a href="http://fr.wikipedia.org/wiki/Persistance_r%C3%A9tinienne"&gt;persistance rétinienne&lt;/a&gt;, qui consiste à disposer plusieurs afficheurs 7 segments branchés sur un même bus, puis les sélectionner tour à tour pour afficher un chiffre sur chaque afficheur (à la manière d'un signal chipselect). Un seul 7seg affiche un chiffre pendant que les autres n'affichent rien. Si le rafraichissement des 7-segments est assez rapide, on arrive à tromper l'oeil et lui faire croire qu'ils sont tous allumés simultanément et affiche bien un nombre, alors qu'en réalité un seul est allumé.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;Illustrons cela par l'exemple. Deux 7-segments sont branchés sur un même bus, qui lui même est branché sur le port D de l'ATtiny2313 (PD0 à PD6). Puis on utilise une partie du port B pour sélectionner l'afficheur qui va recevoir les données via le port D et donc les afficher, cette sélection se fait grâce à un transistor qui agit comme un bouton poussoir.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://2.bp.blogspot.com/_wN4_ANGd9Gk/SwhVzIbLaZI/AAAAAAAAAGk/kigVzNoqlRo/s1600/montage.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_wN4_ANGd9Gk/SwhVzIbLaZI/AAAAAAAAAGk/kigVzNoqlRo/s400/montage.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Avec un peu de folie on pourrait même penser à ajouter un 4511 entre le bus et la série de signaux sur le PORTD:&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_wN4_ANGd9Gk/SwhVYIV40wI/AAAAAAAAAGc/vtmT8KyHDAM/s1600/montage2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_wN4_ANGd9Gk/SwhVYIV40wI/AAAAAAAAAGc/vtmT8KyHDAM/s400/montage2.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2735257926618761763-2532429999736032376?l=pichonjulien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichonjulien.blogspot.com/feeds/2532429999736032376/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://pichonjulien.blogspot.com/2009/11/pilotage-dun-afficheur-7-segments.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default/2532429999736032376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default/2532429999736032376'/><link rel='alternate' type='text/html' href='http://pichonjulien.blogspot.com/2009/11/pilotage-dun-afficheur-7-segments.html' title='Pilotage d&apos;un afficheur 7 segments'/><author><name>Julien Pichon</name><uri>http://www.blogger.com/profile/02749623446343456914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wN4_ANGd9Gk/SwO8mdZllLI/AAAAAAAAAFs/HViLfWl-2eA/s72-c/7segmentDisplay.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2735257926618761763.post-8963756438935431509</id><published>2009-11-08T14:47:00.006+01:00</published><updated>2009-11-11T12:28:10.936+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Electronique'/><category scheme='http://www.blogger.com/atom/ns#' term='Embarqué'/><category scheme='http://www.blogger.com/atom/ns#' term='AVR'/><title type='text'>AVR et IRQ</title><content type='html'>&lt;span style="font-weight: bold;font-size:130%;" &gt;Le principe des IRQ&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Tout comme les processeurs "normaux", les AVR peuvent être interrompu pendant leur fonctionnement normal (exécution du code/firmware) par un équipement externe grâce au moyen des IRQ (Interrupt ReQuest), ou interruptions matérielles en Français. Une IRQ implémentée grâce a une ligne d'interruption, n'est en fait qu'une simple ligne physique qui relie un périphérique à une broche du microcontrôleur. Cette ligne est toujours dans un état stable (Haut ou Bas), mais change d'état quand quelque chose de spécial se produit: une interruption générée par le périphérique. Cette interruption peut correspondre à une myriade (oui j'essaye d'étendre mon vocabulaire ;)) de choses: quelqu'un a appuyé sur un bouton, un périphérique a fini un travail qu'on lui avait demandé ...&lt;br /&gt;Ce type de fonctionnement s'oppose au polling. Le Polling consiste à vérifier en permanence qu'un évènement ne s'est pas produit. Par exemple, le microcontrôleur va regarder toute les 20ms si une broche n'a pas changé d'état. Ce type de fonctionnement est moins performant car il consomme plus de temps et de ressources, comparé aux IRQ.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Le montage&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dans le montage suivant, j'ai réutilisé le code du PWM de l'&lt;a href="http://pichonjulien.blogspot.com/2009/10/pwm-avec-un-attiny2313.html"&gt;article précédent&lt;/a&gt;. Sauf que le duty cycle n'est plus augmenté au moyen d'une boucle for, mais lorsqu'une interruption survient. Cette interruption est générée par l'appui sur un bouton poussoir. Une fois que le duty cycle atteint son maximum (255 sur un Timer 8 bits), il retombe à 0, pour ensuite remonter jusqu'à 255 ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Voici le schéma:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wN4_ANGd9Gk/SvqUxYeQEFI/AAAAAAAAAE0/jN9O17njLR4/s1600-h/montage.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 305px;" src="http://2.bp.blogspot.com/_wN4_ANGd9Gk/SvqUxYeQEFI/AAAAAAAAAE0/jN9O17njLR4/s400/montage.gif" alt="" id="BLOGGER_PHOTO_ID_5402794279088164946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Il ne change pas énormément du &lt;a href="http://pichonjulien.blogspot.com/2009/10/pwm-avec-un-attiny2313.html"&gt;montage précédent&lt;/a&gt;, si ce n'est que j'ai utilisé le seul bouton que j'avais dans ma boîte à gouter pour générer une IRQ, au lieu de continuer à l'utiliser pour mettre sur ON/OFF l'alimentation du montage. Fini les petites folies.&lt;br /&gt;A noté que j'ai mis une résistance de forte valeur entre INT0 et GND. Cela s'appel une pull down et permet lorsque le circuit est ouvert (boutton poussoir non pressé), de garder INT0 à l'état BAS car sinon l'entrée serait flottante, et des comportements non souhaités pourraient survenir.&lt;br /&gt;&lt;br /&gt;Le montage en photo:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wN4_ANGd9Gk/SvqX1sT6NWI/AAAAAAAAAE8/nPGfiyg4VEU/s1600-h/IMG_0003.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_wN4_ANGd9Gk/SvqX1sT6NWI/AAAAAAAAAE8/nPGfiyg4VEU/s400/IMG_0003.jpg" alt="" id="BLOGGER_PHOTO_ID_5402797651667858786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Le code:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#define  F_CPU  1000000UL&lt;br /&gt;#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;&lt;br /&gt;void initialize_pin()&lt;br /&gt;{&lt;br /&gt;/* Pin change mask register&lt;br /&gt; * enable interrupt for INT0 */&lt;br /&gt;PCMSK |= (1&amp;lt;&amp;lt;INT0);&lt;br /&gt;&lt;br /&gt;/* Rise interrupt on falling edge of INT0 */&lt;br /&gt;MCUCR |= (1&amp;lt;&amp;lt;ISC01);&lt;br /&gt;&lt;br /&gt;/* Enable Interrupt */&lt;br /&gt;GIMSK |= (1&amp;lt;&amp;lt;INT0);&lt;br /&gt;&lt;br /&gt;/* Set PB2 as input */&lt;br /&gt;DDRB |= (1&amp;lt;&amp;lt;PB2);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void init_timer()&lt;br /&gt;{&lt;br /&gt;/* Set Fast PWM mode. */&lt;br /&gt;TCCR0A |= (1&amp;lt;&amp;lt;WGM00) | (1&amp;lt;&amp;lt;WGM01);&lt;br /&gt;&lt;br /&gt;/* Clear 0C0A on compare. */&lt;br /&gt;TCCR0A |= (1&amp;lt;&amp;lt;COM0A1);&lt;br /&gt;&lt;br /&gt;/* Start timer, no prescaling. */&lt;br /&gt;TCCR0B |= (1&amp;lt;&amp;lt;CS00);&lt;br /&gt;&lt;br /&gt;/* Duty cycle 0% */&lt;br /&gt;OCR0A = 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[])&lt;br /&gt;{&lt;br /&gt;initialize_pin();&lt;br /&gt;init_timer();&lt;br /&gt;sei();&lt;br /&gt;&lt;br /&gt;while(1) {&lt;br /&gt;  ;&lt;br /&gt;}&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ISR(INT0_vect)&lt;br /&gt;{&lt;br /&gt;if(OCR0A &amp;gt;= 255)&lt;br /&gt;  OCR0A = 0;&lt;br /&gt;else&lt;br /&gt;  OCR0A += 10;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;La  fonction initialize_pin se charge d'écrire les valeurs dans les registres adéquats, pour que l'interruption INT0 soit déclenchée lorsqu'un front descendant est détecté sur la broche INT0. En effet nous pouvons configurer le changement d'état qui fait que l'interruption est déclenchée:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Un niveau bas est détecté sur la broche.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Lorsque d'un changement d'état de la broche (que la transition se fasse de Haut vers Bas ou Bas vers Haut).&lt;/li&gt;&lt;li&gt;Lors d'un front montant.&lt;/li&gt;&lt;li&gt;Lors d'un front descendant.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;L'ISR (Interrupt Service Routine) INT0_vect est exécutée donc lorsqu'une interruption est générée (appui sur le bouton). Elle se charge juste d'augmenter d'environ 4% la valeur du duty cycle, par conséquent l'éclairage de la LED paraît de plus en plus puissant au fur et à mesure que l'on appui sur le bouton. Lorsque le duty cycle atteint 100% il est remis à 0.&lt;br /&gt;&lt;br /&gt;Je ne reviens pas sur la fonction init_timer vu auparavant.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La vidéo:&lt;br /&gt;&lt;br /&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-6633ccfb4734129b" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v5.nonxt4.googlevideo.com/videoplayback?id%3D6633ccfb4734129b%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331692864%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D77C6A62CA829EA60B135249294C34E1C6B2228CE.501A72F93B1695D2704D91A01E8E1999503A72F1%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D6633ccfb4734129b%26offsetms%3D5000%26itag%3Dw160%26sigh%3DZY8Ix3GX_pheMid0aKCkNSWgFH8&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v5.nonxt4.googlevideo.com/videoplayback?id%3D6633ccfb4734129b%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331692864%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D77C6A62CA829EA60B135249294C34E1C6B2228CE.501A72F93B1695D2704D91A01E8E1999503A72F1%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D6633ccfb4734129b%26offsetms%3D5000%26itag%3Dw160%26sigh%3DZY8Ix3GX_pheMid0aKCkNSWgFH8&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Désolé pour la qualité, c'est tourné avec un appareil photo. En vrai on voit bien la nuance de la puissance d'éclairage qui varie jusqu'à son extinction.&lt;br /&gt;&lt;br /&gt;Rendez-vous au prochain montage, qui je pense concernera un afficheur 7 segments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2735257926618761763-8963756438935431509?l=pichonjulien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichonjulien.blogspot.com/feeds/8963756438935431509/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://pichonjulien.blogspot.com/2009/11/avr-et-irq.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default/8963756438935431509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default/8963756438935431509'/><link rel='alternate' type='text/html' href='http://pichonjulien.blogspot.com/2009/11/avr-et-irq.html' title='AVR et IRQ'/><author><name>Julien Pichon</name><uri>http://www.blogger.com/profile/02749623446343456914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_wN4_ANGd9Gk/SvqUxYeQEFI/AAAAAAAAAE0/jN9O17njLR4/s72-c/montage.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2735257926618761763.post-8211073453973245373</id><published>2009-10-30T23:08:00.024+01:00</published><updated>2009-10-31T13:52:10.193+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Embarqué'/><category scheme='http://www.blogger.com/atom/ns#' term='AVR'/><title type='text'>PWM avec un ATTiny2313</title><content type='html'>Salut à tous,&lt;br /&gt;&lt;br /&gt;Ca se voit que c'est les vacances, je poste beaucoup :D. Ce billet décrit ce qu'est le PWM, à quoi il sert, son implémentation dans les AVR. Et enfin je finis par un montage qui illustre cette technique, avec l'éclairage progressif d'une LED.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Le PWM, qu'est-ce ?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Le Pulse Width Modulation est une technique de modulation comme son nom l'indique, qui permet de faire varier la durée d'une impulsion électrique. Ici on ne module pas la fréquence qui reste la même, mais plutôt la durée d'une impulsion.&lt;br /&gt;&lt;br /&gt;Comme le microcontrôleur fait partie d'un monde numérique (digital), il ne peut fournir qu'une sortie haute (5V par exemple), ou basse (0V toujours par exemple :p). Le problème c'est que son environnement est analogique (ensemble infini de valeurs). Un moteur ne peut pas se contenter d'être allumé ou éteint, pareil pour une LED, il faut donc que le microcontrôleur puisse fournir une sortie analogique.&lt;br /&gt;&lt;br /&gt;Certains AVR disposent d'un module ADC (Analog to Digital Converter), l'inverse de ce que l'on veut. On prend en entrée une valeur analogique, que l'on convertie par la suite au format numérique. Mais aucun ne contient de DAC. Il existe cependant un moyen d'obtenir cette fonctionnalité, vous l'aurez deviné: le PWM.&lt;br /&gt;&lt;br /&gt;En mettant de façon répétitive une broche de l'AVR à une sortie haute, puis basse, le résultat produit est la moyenne du temps que la sortie est haute.&lt;br /&gt;&lt;br /&gt;Pour une LED si nous prenons une échelle de temps très petite, on observe que le courant qui la traverse, possède un délai non nul. Lorsque l'on met une sortie haute sur une LED, puis que nous la mettons basse, il y a un temps de latence avant que la LED ne s'éteigne. Ainsi en mettant ON/OFF de façon répétitive, on obtient une puissance d'éclairage différente. Plus le temps la LED est à ON, plus l'éclairage paraîtra puissant.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Le FAST PWM chez les AVR&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Le PWM dans les micro-contrôleurs d'Atmel repose sur l'utilisation des TIMERS. Pour se familiariser avec, voici un &lt;a href="http://extremeelectronics.co.in/avr-tutorials/avr-timers-an-introduction/"&gt;tuto&lt;/a&gt;, et &lt;a href="http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;t=50106"&gt;un autre&lt;/a&gt; sur AVRFreaks. Pour résumer, sur AVR un timer est un composant hardware configurable qui va compter de 0 jusqu'à une valeur configurable, à une certaine fréquence elle aussi configurable. Ensuite on peut utiliser ce compteur de plusieurs façon:&lt;br /&gt;* Déclencher une interruption lorsque la valeur max du compteur est atteinte.&lt;br /&gt;* Comparer la valeur du compteur à une valeur que l'on désire, et déclencher une interruption lorsqu'elles sont égales (Match), ou "setter" un flag.&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Plein d'utilisation sont possibles avec les timers, dont le PWM. Il existe aussi plusieurs mode de PWM, ici je ne presente que le FAST PWM.&lt;br /&gt;&lt;br /&gt;Le FAST PWM utilise un modèle en dents de scie:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wN4_ANGd9Gk/Suww2Xto7qI/AAAAAAAAAEs/Dr08VpGOnJI/s1600-h/sawtooth"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_wN4_ANGd9Gk/Suww2Xto7qI/AAAAAAAAAEs/Dr08VpGOnJI/s400/sawtooth" alt="" id="BLOGGER_PHOTO_ID_5398743763946892962" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La courbe représente la valeur du compteur qui monte de BOTTOM à TOP. Subitement elle recommence à BOTTOM pour remonter à TOP etc ... Le seuil ("compare" sur le graphique) est une valeur qui lorsqu'elle est dépassée par le compteur change la valeur de la sortie. Le compteur part de BOTTOM, la sortie est basse, il dépasse le seuil, la valeur sortie et passe à haut, le compteur déborde et retombe à 0, la sortie redevient basse. En jouant sur le seuil, on joue sur le temps pendant lequel la sortie reste HAUTE. Un seuil à la moitié du compteur, représente une sortie haute 50% du temps. Un seuil égal à BOTTOM représente une sortie haute 100% du temps. Et inversement un seuil égal à TOP représente une sortie tout le temps basse.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Le montage&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Le schéma du montage ressemble à celui de cet &lt;a href="http://pichonjulien.blogspot.com/2009/10/hello-world-avr.html"&gt;article&lt;/a&gt;, sauf que la LED est sur la broche OC0A:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wN4_ANGd9Gk/SuwKY7BegiI/AAAAAAAAAEc/ZpNJqaVM5eg/s1600-h/montage.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 305px;" src="http://4.bp.blogspot.com/_wN4_ANGd9Gk/SuwKY7BegiI/AAAAAAAAAEc/ZpNJqaVM5eg/s400/montage.gif" alt="" id="BLOGGER_PHOTO_ID_5398701476587405858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Je me suis permis le même genre de folie que la dernière fois: un bouton pour laisser le montage branché sans qu'il soit tout le temps alimenté.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wN4_ANGd9Gk/Suwg8SSVXwI/AAAAAAAAAEk/2hsmlIoNM3E/s1600-h/img_0003.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_wN4_ANGd9Gk/Suwg8SSVXwI/AAAAAAAAAEk/2hsmlIoNM3E/s400/img_0003.jpg" alt="" id="BLOGGER_PHOTO_ID_5398726273383358210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Le code:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#define    F_CPU    1000000UL&lt;br /&gt;#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;&lt;br /&gt;void init_timer()&lt;br /&gt;{&lt;br /&gt;/* Set Fast PWM mode. */&lt;br /&gt;TCCR0A |= (1&amp;lt;&amp;lt;WGM00) | (1&amp;lt;&amp;lt;WGM01);&lt;br /&gt;&lt;br /&gt;/* Clear 0C0A on compare. */&lt;br /&gt;TCCR0A |= (1&amp;lt;&amp;lt;COM0A1);&lt;br /&gt;&lt;br /&gt;/* Start timer, no prescaling. */&lt;br /&gt;TCCR0B |= (1&amp;lt;&amp;lt;CS00);&lt;br /&gt;&lt;br /&gt;/* Duty cycle 0% */&lt;br /&gt;OCR0A = 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void init_led()&lt;br /&gt;{&lt;br /&gt;DDRB |= (1&amp;lt;&amp;lt;PB2);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[])&lt;br /&gt;{&lt;br /&gt;int i;&lt;br /&gt;&lt;br /&gt;init_led();&lt;br /&gt;init_timer();&lt;br /&gt;&lt;br /&gt;while(1) {&lt;br /&gt;  for(i=0; i &amp;lt; 255; i++) {&lt;br /&gt;      OCR0A = i;&lt;br /&gt;      _delay_ms(10);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  for(i=255; i &amp;gt; 0; i--) {&lt;br /&gt;      OCR0A = i;&lt;br /&gt;      _delay_ms(10);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Ci-dessus on commence par configurer la broche OC0A (PB2) en sortie. Ensuite le Timer0 de 8bits est mis en mode Fast PWM, et sort le résultat sur la broche OC0A.&lt;br /&gt;Ensuite dans la boucle infinie, le premier for se charge de modifier le "duty cycle" (% de temps pendant lequel la LED est allumée, autrement dit la puissance d'éclairage) en l'incrémentant. On modifie le duty cycle tout simplement en changeant la valeur dans OCR0A, i=0 représente 0% et i=255 (car nous sommes sur un timer 8bits) représente 100% de la puissance de la LED. Ensuite la deuxième boucle for diminue la puissance de la LED, en décrémentant le duty cycle.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Le code est flashé de la même façon que dans l'article "Hello World AVR":&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;avr-gcc -Os -g -Wall -mmcu=attiny2313 -o main.elf main.c&lt;br /&gt;avr-objcopy -j .text -j .data -O ihex main.elf main.hex&lt;br /&gt;sudo avrdude -c usbtiny -p t2313 -i 8 -U flash:w:main.hex&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Enfin finissons par une vidéo réalisée sans trucage :)&lt;br /&gt;&lt;br /&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-b820d2113aeea9e7" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v23.nonxt4.googlevideo.com/videoplayback?id%3Db820d2113aeea9e7%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331692864%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D30C56C0FA376E4F9237E747A1E527E050B32ABB8.E3405BD2931ACA58054C659F1832361B2E56543%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Db820d2113aeea9e7%26offsetms%3D5000%26itag%3Dw160%26sigh%3DlRq8nokOAClERd8ug2Om3m9oFzs&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v23.nonxt4.googlevideo.com/videoplayback?id%3Db820d2113aeea9e7%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331692864%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D30C56C0FA376E4F9237E747A1E527E050B32ABB8.E3405BD2931ACA58054C659F1832361B2E56543%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Db820d2113aeea9e7%26offsetms%3D5000%26itag%3Dw160%26sigh%3DlRq8nokOAClERd8ug2Om3m9oFzs&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2735257926618761763-8211073453973245373?l=pichonjulien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichonjulien.blogspot.com/feeds/8211073453973245373/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://pichonjulien.blogspot.com/2009/10/pwm-avec-un-attiny2313.html#comment-form' title='5 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default/8211073453973245373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default/8211073453973245373'/><link rel='alternate' type='text/html' href='http://pichonjulien.blogspot.com/2009/10/pwm-avec-un-attiny2313.html' title='PWM avec un ATTiny2313'/><author><name>Julien Pichon</name><uri>http://www.blogger.com/profile/02749623446343456914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wN4_ANGd9Gk/Suww2Xto7qI/AAAAAAAAAEs/Dr08VpGOnJI/s72-c/sawtooth' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2735257926618761763.post-5834733497255391660</id><published>2009-10-29T12:25:00.006+01:00</published><updated>2009-10-31T00:05:30.126+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='libre'/><category scheme='http://www.blogger.com/atom/ns#' term='livre'/><title type='text'>Livres de chevet</title><content type='html'>Bonjour,&lt;br /&gt;&lt;br /&gt;Aujourd'hui petite parenthèse entre deux articles sur les AVR. Je vais vous présenter mes livres de chevet actuels. Le premier s'intitule "Beautiful Code" et a été écrit par Andy Oram et Greg Wilson.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wN4_ANGd9Gk/Sul8Vlf7ygI/AAAAAAAAAEM/cxajPQtDhCk/s1600-h/beautiful_code.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 180px; height: 236px;" src="http://1.bp.blogspot.com/_wN4_ANGd9Gk/Sul8Vlf7ygI/AAAAAAAAAEM/cxajPQtDhCk/s400/beautiful_code.gif" alt="" id="BLOGGER_PHOTO_ID_5397982338665400834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;C'est en fait une compilation de plusieurs morceaux de code, de descriptoin d'architecture de systèmes, avec des commentaires de leur auteur respectif, mais aussi des auteurs du livre. On découvre au fil des différents cas que la notion de beauté du code est subjective, et varie d'une personne à l'autre. Par exemple au Chapitre 1, pour Brian Kernighan (qui au passage a énormément participé au développement d'UNIX dans les laboratoires Bells, et est considéré comme un demi-dieu par beaucoup d'adorateurs), avec son "Regular Expression Matcher", nous explique que la beauté du code réside dans le fait que celui-ci doit être compact et puissant. Tandis que pour Kargel Fogel, qui nous parle de l'architecture du moteur de comparaison de code de Subversion, la beauté du code réside dans une architecture bien pensée et évolutive.&lt;br /&gt;&lt;br /&gt;Ensuite le deuxième livre que je lis c'est "Code Reading The Open Source Perspective", écrit par Diomidis Spinellis.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wN4_ANGd9Gk/SumAGJnTEQI/AAAAAAAAAEU/q-nPB_LF4JE/s1600-h/code_reading.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 240px; height: 240px;" src="http://3.bp.blogspot.com/_wN4_ANGd9Gk/SumAGJnTEQI/AAAAAAAAAEU/q-nPB_LF4JE/s400/code_reading.jpg" alt="" id="BLOGGER_PHOTO_ID_5397986471528567042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Dans ce livre l'auteur nous explique que dans le monde de la programmation, nous éprouvons des difficultés à produire du code de bonne qualité. Ceci est dû en partie au fait que le programmeur ne lit pas le code d'autrui pour s'inspirer et s'améliorer. Pour lui la solution réside dans la lecture de code open source. Il nous apprend donc à naviguer dans le code d'autres personnes, de comprendre son architecture, de se focaliser sur l'utile et faire abstraction du reste, et aussi de faire la différence entre du code de mauvaise qualité, et du code de bonne qualité.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2735257926618761763-5834733497255391660?l=pichonjulien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichonjulien.blogspot.com/feeds/5834733497255391660/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://pichonjulien.blogspot.com/2009/10/livre.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default/5834733497255391660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default/5834733497255391660'/><link rel='alternate' type='text/html' href='http://pichonjulien.blogspot.com/2009/10/livre.html' title='Livres de chevet'/><author><name>Julien Pichon</name><uri>http://www.blogger.com/profile/02749623446343456914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wN4_ANGd9Gk/Sul8Vlf7ygI/AAAAAAAAAEM/cxajPQtDhCk/s72-c/beautiful_code.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2735257926618761763.post-1389342425441374872</id><published>2009-10-28T16:16:00.015+01:00</published><updated>2010-03-27T11:41:17.741+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Electronique'/><category scheme='http://www.blogger.com/atom/ns#' term='Embarqué'/><category scheme='http://www.blogger.com/atom/ns#' term='AVR'/><title type='text'>Hello world AVR</title><content type='html'>J'enchaîne avec ce deuxième article sur l'électronique et l'embarqué pour présenter le montage de base qui permet de programmer la mémoire flash de l'ATTiny2313. Une LED a été ajouté au montage pour pouvoir attester de son bon foncionnment : un Hello World sans printf autrement dit ;).&lt;br /&gt;&lt;br /&gt;Un AVR se programme d'une façon particulière: la programmation ICSP (In-Circuit Serial Programming). Comme son nom l'indique ce type de programmation permet de flasher un firmware dans un AVR déjà monté dans son circuit final. Il faut cependant prévoir la connectique adéquate (4 pins supplémentaires). Un des avantages de cette solution est le fait de pouvoir faire un upgrade du firmware de la puce, sans avoir à la dessouder, la placer sur un circuit pour la flasher et la ressouder.&lt;br /&gt;&lt;br /&gt;L'ICSP utilise un bus série &lt;a href="http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus"&gt;SPI&lt;/a&gt; (Serial Peripheral Interface). Concrètement c'est un bus (ensemble de lignes) série, synchrone (qui utilise une horloge) multi-esclaves. Il se présente sous la forme de 4 câbles (MISO/MOSI/SCK/SS). La signal Slave Select (SS) n'est pas utilisé ici, car dans notre cas il y a un maître (le programmeur), et un esclave (l'ATTiny). SS devient utilse lorsque plusieurs esclaves sont reliés sur le même bus SPI.&lt;br /&gt;&lt;br /&gt;Voici le schéma de mise en oeuvre:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_wN4_ANGd9Gk/S63gmYlY9OI/AAAAAAAAAHM/-xdiQL4kzWE/s1600/montage.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="305" src="http://1.bp.blogspot.com/_wN4_ANGd9Gk/S63gmYlY9OI/AAAAAAAAAHM/-xdiQL4kzWE/s400/montage.gif" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;La résistance de 10k sur RESET permet de maintenir le signal au niveau haut (donc inactif car la barre au dessus du mot RESET indique que le signal n'est actif qu'au niveau bas), on évite ainsi une entrée flottante, grâce à cette &lt;span style="font-weight: bold;"&gt;résistance de rappel&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;L'alimentation est fournie par le programmeur (AVR Pocket Programmer de chez Sparkfun). Attention, je ne sais pour quelle raison, pour que le sparkfun puisse fournir le courant au montage, il faut que celui-ci soit bien entendu branché en usb sur la PC, mais via un HUB usb:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_wN4_ANGd9Gk/Suic0pbTQWI/AAAAAAAAAD8/NaKIdQpGnw0/s1600-h/img_0001.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5397736581691031906" src="http://4.bp.blogspot.com/_wN4_ANGd9Gk/Suic0pbTQWI/AAAAAAAAAD8/NaKIdQpGnw0/s400/img_0001.jpg" style="cursor: pointer; display: block; height: 300px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Voici un schéma qui montre la disposition des pins du "6-pin female ICSP header":&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_wN4_ANGd9Gk/SuiatpL3-yI/AAAAAAAAADs/H4NS8Rji8Eg/s1600-h/avrisp_pinout.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5397734262343990050" src="http://4.bp.blogspot.com/_wN4_ANGd9Gk/SuiatpL3-yI/AAAAAAAAADs/H4NS8Rji8Eg/s400/avrisp_pinout.png" style="cursor: pointer; display: block; height: 267px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Et une photo du montage:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_wN4_ANGd9Gk/SuibO1fOL0I/AAAAAAAAAD0/a2N6lKxE23o/s1600-h/img_0025.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5397734832582045506" src="http://4.bp.blogspot.com/_wN4_ANGd9Gk/SuibO1fOL0I/AAAAAAAAAD0/a2N6lKxE23o/s400/img_0025.jpg" style="cursor: pointer; display: block; height: 300px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;Sur le montage je me suis permis une petite folie: l'ajout d'un bouton poussoir pour couper l'alimentation du circuit lorsque je ne m'en sert pas. Notez que lors de la phase de programmation de l'avr il faut pousser le bouton !&lt;br /&gt;&lt;br /&gt;Pour faire clignoter la LED il faut jouer avec les ports de la puce. Je vous envoie vers ce &lt;a href="http://iamsuhasm.wordpress.com/tutsproj/avr-gcc-tutorial/"&gt;tuto&lt;/a&gt; bien fait.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_wN4_ANGd9Gk/SuixpT1IoCI/AAAAAAAAAEE/SYFow7IEZOs/s1600-h/code.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5397759476659429410" src="http://4.bp.blogspot.com/_wN4_ANGd9Gk/SuixpT1IoCI/AAAAAAAAAEE/SYFow7IEZOs/s400/code.png" style="cursor: pointer; display: block; height: 300px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;Après avoir lu le tutoriel, le code est assez explicite. La ligne 11 met la pin PB0 en sortie. La ligne 14 place au niveau haut PB0, la ligne 17 la place au niveau bas. La fonction _delay_ms provient de la bibliothèqe avr-libc ainsi que les macro tel que PORTB, PB0 etc ... Qui facilite grandemment le développement.&lt;br /&gt;&lt;br /&gt;Pour compiler ce programme et flasher ce programme il faut disposer d'AVRDude, et de gcc pour avr (paquets gcc-avr &amp;amp; avrdude sous debian).&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;avr-gcc -Os -g -Wall -mmcu=attiny2313 -o main.elf main.c&lt;br /&gt;avr-objcopy -j .text -j .data -O ihex main.elf main.hex&lt;br /&gt;sudo avrdude -c usbtiny -p t2313 -i 8 -U flash:w:main.hex&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;La première ligne cross compile au format ELF le programme. La deuxième convertit le format ELF en HEX, compréhensible par avrdude. La dernière demande à AVRDude de flasher l'exécutable (fichier HEX) dans l'ATTiny2313.&lt;br /&gt;&lt;br /&gt;Je finis sur une vidéo du montage en action (par contre la fréquence du clignotement ne correspond pas à 500ms, je l'avais changé):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-856871adc68223a7" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v9.nonxt3.googlevideo.com/videoplayback?id%3D856871adc68223a7%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331692864%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D379BC95FF680F964F49FDCCB707AE3B4B67DF92.2D56200CD561E823B4234DCDFFBC9D1ABDC30FEE%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D856871adc68223a7%26offsetms%3D5000%26itag%3Dw160%26sigh%3DdR3nAFa6pfX0wsQtX9vLBcY1yNw&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v9.nonxt3.googlevideo.com/videoplayback?id%3D856871adc68223a7%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331692864%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D379BC95FF680F964F49FDCCB707AE3B4B67DF92.2D56200CD561E823B4234DCDFFBC9D1ABDC30FEE%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D856871adc68223a7%26offsetms%3D5000%26itag%3Dw160%26sigh%3DdR3nAFa6pfX0wsQtX9vLBcY1yNw&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Sur la vidéo j'ai laissé les fils pour l'ICSP, mais on peut les retirer, et juste mettre sous tension le montage ATTiny2313 + résistance 320 Ohms + LED, et cela fonctionne parfaitement.&lt;br /&gt;&lt;br /&gt;A bientôt pour le prochain article qui portera sur le Pulse Width Modulation (PWM), qui permet entre autres de jouer sur la luminosité de la LED.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2735257926618761763-1389342425441374872?l=pichonjulien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichonjulien.blogspot.com/feeds/1389342425441374872/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://pichonjulien.blogspot.com/2009/10/hello-world-avr.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default/1389342425441374872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default/1389342425441374872'/><link rel='alternate' type='text/html' href='http://pichonjulien.blogspot.com/2009/10/hello-world-avr.html' title='Hello world AVR'/><author><name>Julien Pichon</name><uri>http://www.blogger.com/profile/02749623446343456914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wN4_ANGd9Gk/S63gmYlY9OI/AAAAAAAAAHM/-xdiQL4kzWE/s72-c/montage.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2735257926618761763.post-8318559531122020516</id><published>2009-10-28T11:31:00.015+01:00</published><updated>2009-10-28T22:22:35.874+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Electronique'/><category scheme='http://www.blogger.com/atom/ns#' term='Embarqué'/><category scheme='http://www.blogger.com/atom/ns#' term='AVR'/><title type='text'>Electronique et AVR</title><content type='html'>Bonjour, ajourd'hui je vais vous parler d'une chose à laquelle je m'intéresse de plus en plus: l'Electronique. Sans pour autant aller jusqu'à la compréhension chimique et physique des composants, je me penche sur les microcontroleurs et leur programmation. C'est sûrement une des conséquences de mon envie de comprendre le fonctionnement d'un système dans son ensemble.&lt;br /&gt;Au début j'ai commencé l'informatique sur un système windows à coder des applications en userland diverses et variées, pour ensuite passer sur un Linux, qui m'attirait parce que le fait qu'il soit Open Source, et donc décorticable pour le comprendre m'intéressait. Je me suis donc intéressé au fonctionnement des systèmes d'exploitations de type UNIX. Pour enfin m'intéresser ajourd'hui à l'électronique et aux microprocesseurs, éléments qui sont au plus bas niveau.&lt;br /&gt;&lt;br /&gt;Je ne suis pas le seul dans ce cas là, le constat suivant est souvent fait: certaines personnes de formation informatique "haut-niveau", qui descendent vers le "bas niveau". Et on observe que l'inverse se produit aussi souvent: les personnes de formation "bas niveau" montent vers le "haut niveau".&lt;br /&gt;&lt;br /&gt;Voilà pour l'histoire de ma vie et le soupçon de philosophie ethnologique. A présent je vais vous présenter le matos que j'ai commandé pour m'introduire au monde des microcontroleurs.&lt;br /&gt;&lt;br /&gt;J'ai tout d'abord commandé une platine d'essai, qui permet de poser les composants sans les souder. Elément très pratique pour le prototypage des circuits.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wN4_ANGd9Gk/SuggKQ886kI/AAAAAAAAACc/NlAj1h1eIl4/s1600-h/breadboard.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 252px; height: 391px;" src="http://4.bp.blogspot.com/_wN4_ANGd9Gk/SuggKQ886kI/AAAAAAAAACc/NlAj1h1eIl4/s400/breadboard.jpg" alt="" id="BLOGGER_PHOTO_ID_5397599514124937794" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En même temps j'ai commandé un package contenant des fils conducteurs facilement enfichables dans cette platine d'essai:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wN4_ANGd9Gk/SuggvZ_vJ6I/AAAAAAAAACk/-YUz_SMgB30/s1600-h/jumper-wire-kit.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 250px; height: 250px;" src="http://3.bp.blogspot.com/_wN4_ANGd9Gk/SuggvZ_vJ6I/AAAAAAAAACk/-YUz_SMgB30/s400/jumper-wire-kit.jpg" alt="" id="BLOGGER_PHOTO_ID_5397600152207697826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ensuite vint la reception des microcontroleurs ATTiny2313. J'ai choisit la marque atmel, car d'abord on peut coder en C (très légèrement modifié) ces petites bêtes. De plus il existe une toolchain très performante sous UNIX pour pouvoir développer sur microcontroleur AVR d'Atmel. Deux choses qui m'ont plus et m'ont fait choisir ces microcontroleurs.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Mes pupuces en séance de shooting:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wN4_ANGd9Gk/Sug11jhvMII/AAAAAAAAACs/B7IPhPDlulI/s1600-h/img_0011.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_wN4_ANGd9Gk/Sug11jhvMII/AAAAAAAAACs/B7IPhPDlulI/s400/img_0011.jpg" alt="" id="BLOGGER_PHOTO_ID_5397623347589623938" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wN4_ANGd9Gk/Sug2AcJAvII/AAAAAAAAAC0/EAengpiLTvQ/s1600-h/img_0014.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_wN4_ANGd9Gk/Sug2AcJAvII/AAAAAAAAAC0/EAengpiLTvQ/s400/img_0014.jpg" alt="" id="BLOGGER_PHOTO_ID_5397623534585429122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Après j'ai commandé un programmeur, qui permet de flasher les programmes&lt;br /&gt;dans à peu près tous les AVR (ATMega, ATTiny). J'ai ce modèle commandé sur sparkfun:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wN4_ANGd9Gk/Sug2qXx9fdI/AAAAAAAAAC8/nshiccbsXEU/s1600-h/avr_pocket_programmer.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 254px;" src="http://1.bp.blogspot.com/_wN4_ANGd9Gk/Sug2qXx9fdI/AAAAAAAAAC8/nshiccbsXEU/s400/avr_pocket_programmer.jpg" alt="" id="BLOGGER_PHOTO_ID_5397624254969511378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;C'est en fait un clone du kit de programmation officiel distribué par ATMEL: le STK500. Celui que j'ai commandé est compatible et implémente le protocole de programmation du kit STK500. La raison de ce choix c'est qu'il est moins cher.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Et enfin pour tous les consommables tels que résistances, condensateurs, boutons, led ... J'ai récupéré cela dans le grenier de mes parents, car mon père faisait quelques petits montages il y a longtemps. J'ai tout confiné dans ce que j'appel la boîte à gouter:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wN4_ANGd9Gk/Sug3rhwhrHI/AAAAAAAAADE/edXorUAUjps/s1600-h/img_0017.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_wN4_ANGd9Gk/Sug3rhwhrHI/AAAAAAAAADE/edXorUAUjps/s400/img_0017.jpg" alt="" id="BLOGGER_PHOTO_ID_5397625374339345522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wN4_ANGd9Gk/Sug4MKb_1sI/AAAAAAAAADM/tvlCMhrXHa8/s1600-h/img_0019.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_wN4_ANGd9Gk/Sug4MKb_1sI/AAAAAAAAADM/tvlCMhrXHa8/s400/img_0019.jpg" alt="" id="BLOGGER_PHOTO_ID_5397625935014909634" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Pour conclure, voici des photos de mon environnement de travail:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wN4_ANGd9Gk/Sug54eKLMsI/AAAAAAAAADU/mNDpz4F1r8Y/s1600-h/img_0020.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_wN4_ANGd9Gk/Sug54eKLMsI/AAAAAAAAADU/mNDpz4F1r8Y/s400/img_0020.jpg" alt="" id="BLOGGER_PHOTO_ID_5397627795734737602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wN4_ANGd9Gk/Sug59chIqkI/AAAAAAAAADc/6fQ6nE5YLeo/s1600-h/img_0023.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_wN4_ANGd9Gk/Sug59chIqkI/AAAAAAAAADc/6fQ6nE5YLeo/s400/img_0023.jpg" alt="" id="BLOGGER_PHOTO_ID_5397627881193515586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Dans un prochain article je ferai un how to sur le montage de base pour flasher l'ATTiny2313 avec un code qui fait clignoter une LED, le fameux Hello World en électronique.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2735257926618761763-8318559531122020516?l=pichonjulien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichonjulien.blogspot.com/feeds/8318559531122020516/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://pichonjulien.blogspot.com/2009/10/electronique-et-avr.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default/8318559531122020516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default/8318559531122020516'/><link rel='alternate' type='text/html' href='http://pichonjulien.blogspot.com/2009/10/electronique-et-avr.html' title='Electronique et AVR'/><author><name>Julien Pichon</name><uri>http://www.blogger.com/profile/02749623446343456914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wN4_ANGd9Gk/SuggKQ886kI/AAAAAAAAACc/NlAj1h1eIl4/s72-c/breadboard.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2735257926618761763.post-8253449873066386763</id><published>2009-07-26T19:28:00.004+02:00</published><updated>2009-10-29T14:31:08.565+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Operating System'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><category scheme='http://www.blogger.com/atom/ns#' term='Pmbsd'/><title type='text'>pmBSD</title><content type='html'>Bonjour à tous ceux qui me lisent (si il y en a :/),&lt;br /&gt;&lt;br /&gt;J'ai rejoint un projet Open Source il y a quelques temps, mais j'ai attendu ma première contribution à celui-ci pour en parler.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pmbsd.org/"&gt;pmBSD&lt;/a&gt;, c'est son nom. C'est un OS de type Unix qui est développé ex nihilo et comme l'indique le BSD dans le nom, il aura une philosophie et une façon de fonctionner similaire à la famille BSD.&lt;br /&gt;&lt;br /&gt;pmBSD est pour l'instant embryonnaire, le kernel a un système de gestion de mémoire virtuelle, initialise la gdt, l'idt ... Mais ne fait pas encore du multitâche, ni ne possède un VFS.&lt;br /&gt;Mais pmBSD n'est pas qu'un kernel en effet comme tous les BSD il vient avec son bootloader; et c'est dessus que j'ai effectué ma première contribution. Je décrit ce que j'y aie fait dans cet &lt;a href="http://pmbsd.blogspot.com/2009/06/pmbsd-booting-process.html"&gt;article&lt;/a&gt; (en Anglais).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2735257926618761763-8253449873066386763?l=pichonjulien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichonjulien.blogspot.com/feeds/8253449873066386763/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://pichonjulien.blogspot.com/2009/07/pmbsd.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default/8253449873066386763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default/8253449873066386763'/><link rel='alternate' type='text/html' href='http://pichonjulien.blogspot.com/2009/07/pmbsd.html' title='pmBSD'/><author><name>Julien Pichon</name><uri>http://www.blogger.com/profile/02749623446343456914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2735257926618761763.post-1678099703418149163</id><published>2009-07-14T13:23:00.024+02:00</published><updated>2009-10-29T14:29:07.369+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='Stage'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmation'/><title type='text'>L'Octree: une structure de données pour accélérer les calculs</title><content type='html'>Ca faisait un bout de temps que je n'avais pas posté. Pour quelqu'un qui commence à rediger un blog c'est pô terrible. Donc je m'y remet en vous parlant des octrees, et plus précisemment d'une bibliothèque qui permet de les mettre en oeuvre: Etree library.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C'est quoi d'abord un octree ? (&lt;a href="http://en.wikipedia.org/wiki/Octree"&gt;Wikipedia&lt;/a&gt;, vous n'y échapperez pas !). Je vous la fait court quand même: c'est une technique de partitionnement spatiale. On prend un cube qui représente un bout d'espace (à l'échelle que vous voulez, le cube peut représenter 1cm3 comme 1000km3, tout dépend de l'usage), découpez le en 4 (suivant deux axes perpendiculaires donc :p), pour obtenir 8 sous-cubes égaux. Ces sous-cubes sont appelés octants. Ensuite vous découpez à nouveau ces sous-cubes en 8 ... Voilà en très gros le principe de l'algo. A savoir que pour leur représentation interne la structure de donnée utilisée est un arbre. Il faut aussi savoir que lorsque l'on edécoupe, on fait ce que l'on veut: on peut ne redécouper q'un seul octant sur les 8, ou 2, ou 3 encore une fois c'est en fonction des besoins. L'octree ne signifie juste qu'un noeud de l'arbre a au maximum 8 fils.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wN4_ANGd9Gk/SlyvchPj8II/AAAAAAAAABY/3WF6CEj7tnU/s1600-h/Octree.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 230px;" src="http://4.bp.blogspot.com/_wN4_ANGd9Gk/SlyvchPj8II/AAAAAAAAABY/3WF6CEj7tnU/s400/Octree.png" alt="" id="BLOGGER_PHOTO_ID_5358350561158885506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Humm, mokay, mais à quoi ça sert ? On utilise ce genre de chose pour réduire les temps de calcul. Par exemple dans les jeux vidéos, et tout ce qui touche à la 3D en général, on représente une scène avec des objets contenus à l'intérieur de celle-ci, par un octree. Le découpage de celui-ci se fait de façon régulière, en ne subdivisant que la où c'est nécessaire (on a un niveau de profondeur élevé que là où il y a beaucoup d'objets). Avec la scène représentée de cette façon lorsque l'on doit calculer son rendu, il est facile de déterminer quelle est la partie visible de la scène, qui nécessite des calculs pour son affichage, et quelle partie est invisible et donc ne nécessite aucun calcul.&lt;br /&gt;L'algorithme est aussi utilisé lors des calculs de collision, chaque objet est contenu dans un cube les plus petit possible. Ainsi dans un espace pour calculer les collisions, on ne test pas chaque objet pour savoir si il entre en collision avec un autre (LONG!), on ne test que ceux qui sont dans un même octants, ou dans des octants adjacents.&lt;br /&gt;&lt;br /&gt;On voit alors que quelque soit l'application faite le plus important c'est de dimensionner correctement les octants, et jouer habilement avec la profondeur de certains.&lt;br /&gt;&lt;br /&gt;Exemple d'octree sur un modèle 3D pour optimiser le rendu des textures:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wN4_ANGd9Gk/SlyvyeqibjI/AAAAAAAAABg/IopCLZXQigQ/s1600-h/37_octree_03.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 350px; height: 379px;" src="http://2.bp.blogspot.com/_wN4_ANGd9Gk/SlyvyeqibjI/AAAAAAAAABg/IopCLZXQigQ/s400/37_octree_03.jpg" alt="" id="BLOGGER_PHOTO_ID_5358350938423848498" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Mais pourquoi j'ai dû les utiliser ces octrees !?&lt;br /&gt;Actuellement en stage, une partie de l'application que je dois faire, doit stocker la position de certains satellites qui tournent autour de la terre. Parmis les différentes utilisations de cette base de données de satellites, une est de fournir en entrée les coordonnées d'un cube représentant une partie de l'espace, une date, et de récupérer tous les satellites qui se trouvent dans ce&lt;br /&gt;cube à la date donnée.&lt;br /&gt;L'une des premières approche a été de prendre tous les satellites présents dans la base, et pour chacun d'entre eux calculer leur orbite (à l'aide d'une fonction qui m'est fourni), et de regarder si à la date donnée ils sont dans le cube ou pas. A part disposer d'un super calculateur, les temps de réponse seraient extrêmement longs, car en effet la base de données des satellites contient des millions de corps. C'est à ce niveau là qu'entre en jeu les octree. Un octree représente une période de temps, et contient les orbites des différents satellites.&lt;br /&gt;Ce qui fait que lorsque l'utilisateur soumet une date et un cube, je sélectionne l'octree adéquat, je regarde l'octant qui se rapproche le plus du cube soumis en paramètre. J'obtiens ainsi la liste des corps qui se situe dans la zone désirée.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cs.cmu.edu/%7Eeuclid/"&gt;ETREE&lt;/a&gt;&lt;br /&gt;C'est une bibliothèque écrit en C, créée à la base pour faire des simulations de &lt;a href="http://www.cs.cmu.edu/%7Eeuclid/cmu-quake-sc2003.mpg"&gt;tremblement de terre&lt;/a&gt;. En plus de créer les octree et les stocker en mémoire, elle a la particularité de rendre les octree persistants sur disque. De plus elle accélère les accès aux octrees grâce à un cache. Autant de critères qui font que je l'ai choisi pour implémenter la solution que j'ai décrit dans le paragraphe précédent.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Je finis sur quelques exemples d'utilisation de l'Etree library:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;etree_t *ep = NULL;&lt;br /&gt;ep = etree_open("filename", O_CREAT | O_RDWR, 0, sizeof(payload_t), 3);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ce que j'ai fait au dessus c'est créer un octree qui sera stocké dans le fichier "filename". Chaque octant de l'octree contient une instance de structure payload_t nous aurons défini plus tôt:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;struct payload_t {&lt;br /&gt; int32_t data;&lt;br /&gt;};&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Avant de pouvoir utiliser cet octree il va falloir lui associer un schema.&lt;br /&gt;Le schéma permet d'assurer la portabilité de la structure payload_t entre les plateformes, en effet un entier n'a pas la même taille sur un x86 et un Sparc.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;const char *schema = "int32_t data";&lt;br /&gt;etree_registerschema(ep, schema);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ensuite la bibliothèque permet de faire des trucs bien sympas comme la recherche d'octant en fonction de son niveau, récupérer un voisin etc ... Pour cela je vous laisse creuser la &lt;a href="http://www.blogger.com/reports-archive.adm.cs.cmu.edu/anon/2003/CMU-CS-03-174.pdf"&gt;documentation&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2735257926618761763-1678099703418149163?l=pichonjulien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichonjulien.blogspot.com/feeds/1678099703418149163/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://pichonjulien.blogspot.com/2009/07/les-octree-cest-le-bien.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default/1678099703418149163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default/1678099703418149163'/><link rel='alternate' type='text/html' href='http://pichonjulien.blogspot.com/2009/07/les-octree-cest-le-bien.html' title='L&apos;Octree: une structure de données pour accélérer les calculs'/><author><name>Julien Pichon</name><uri>http://www.blogger.com/profile/02749623446343456914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wN4_ANGd9Gk/SlyvchPj8II/AAAAAAAAABY/3WF6CEj7tnU/s72-c/Octree.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2735257926618761763.post-7502779141519033890</id><published>2009-04-23T14:57:00.010+02:00</published><updated>2009-07-14T15:24:23.800+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='Virtualisation'/><title type='text'>NetBSD et Virtualisation</title><content type='html'>Comme je l'avais dit dans l'&lt;a href="http://pichonjulien.blogspot.com/2009/04/solution-linux-2009.html"&gt;article précédent&lt;/a&gt;, j'ai décidé de me mettre à NetBSD. Ici je vais détailler le périlleux chemin que j'ai parcouru pour arriver à installer l'OS par dessus mon Ubuntu sur un vaio VGN-CR11S (le fait que ce soit un vaio est important pour la suite ... oopa :)).&lt;br /&gt;&lt;br /&gt;Tout d'abord je sors mon VirtualBox et le lance, avec dans le lecteur virtuel le CDROM de NetBSD que l'on m'a donné sur le salon. Je configure l'installation, et l'écriture sur le disque dur virtuel commence, pour se vautrer lamentablement avec un "Bad Address ...". Bon, je recommence encore une fois et j'obtiens la même erreur. Après un tour sur les forums, je m'aperçois que l'on est plusieurs dans ce cas, et qu'il faut configurer VirtualBox ainsi:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Disable "Enable ACPI"&lt;/li&gt;&lt;li&gt;Disable "Enable IO APIC"&lt;/li&gt;&lt;li&gt;Enable "Enable VT-x/AMD-V"&lt;/li&gt;&lt;li&gt;Set "IDE controller type" to "PIIX4" &lt;/li&gt;&lt;/ul&gt;Je le fais, mais je me demande si la VT (Virtualization Techonlogies), un jeu d'instruction intel qui améliore la prise en charge de la virtualisation, de mon processeur (Intel Core 2 Duo T7100) est présent et/ou activée sur mon pc. Je retourne faire un tour sur les forums de sony et j'apprends que Sony a bloqué cette feature du processeur pour des raisons de sécurité. Hum mokay, cool. Pas grave je tente quand même l'installation avec les configurations citées au dessus, mais sans la VT activée au niveau hardware, et bim toujours la même erreur.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tanpis je passe donc sur qemu, me crée un disque dur virtuel:&lt;br /&gt;&lt;pre class="screen"&gt;&lt;strong&gt;&lt;strong class="userinput"&gt;&lt;code&gt;qemu-img create -f qcow netbsd.img 4G&lt;br /&gt;&lt;/code&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/pre&gt;et lance l'émulateur ensuite:&lt;br /&gt;&lt;pre class="screen"&gt;&lt;strong&gt;&lt;strong class="userinput"&gt;&lt;code&gt;qemu -hda netbsd.img -cdrom netbsd-iso.img -boot d&lt;br /&gt;&lt;/code&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/pre&gt;L'installation se passe correctement, ouf. Mais au reboot ensuite j'ai un soucis, car l'OS freeze. Je cherche un peu et me rend compte qu'il faut lancer avec l'acpi désactivée:&lt;br /&gt;&lt;pre class="screen"&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong class="userinput"&gt;&lt;code&gt;qemu -hda netbsd.img -no-acpi -localtime&lt;/code&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/pre&gt;  Tout se passe bien, il démarre correctment et je me log en root. Tiens j'ai oublié quelque chose ... mais qu'est ce que c'est ? Ah oui ! La connexion. Je suis en wifi sur mon interface eth1, je créé donc un bridge:&lt;br /&gt;&lt;pre class="screen"&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong class="userinput"&gt;&lt;code&gt;brctl &lt;span style="font-family:Georgia,serif;"&gt;addbr br0&lt;/span&gt;&lt;/code&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/pre&gt; Auquel j'ajoute mes interfaces eth1 et  tap0 comme expliqué &lt;a href="http://compsoc.dur.ac.uk/%7Edjw/qemu.html"&gt;ici&lt;/a&gt;. Ainsi je lance qemu avec une nic et la tap0:&lt;br /&gt;&lt;pre class="screen"&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong class="userinput"&gt;&lt;code&gt;qemu -hda netbsd.img&lt;span style="font-family:Georgia,serif;"&gt; -net nic,macaddr=00:56:01:02:03:04 -net  tap,ifname=tap0,script=/etc/qemu-ifup -no-acpi -localtime&lt;/span&gt;&lt;/code&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/pre&gt; On note ici qu'au démarrage le script qemu-ifup est utilisé pour automatiser l'ajout de tap0 dans le bridge.&lt;br /&gt;&lt;br /&gt;Tout ça a l'air cool, mais ça ne marche pas. Après quelques recherches (bien longues à vrai dire), d'autres personnes ont déjà essayé, et ont eut des problèmes. Il faut utiliser une astuce pour pouvoir faire fonctionner un&lt;br /&gt;bridge avec une interface wifi, celle-ci s'appelle l'interface &lt;a href="http://ghantoos.org/2007/10/24/kvmqemu-bridging-with-dummy-network-card/"&gt;DUMMY&lt;/a&gt;. Et avec c'est bon, ça fonctionne.&lt;br /&gt;&lt;br /&gt;Je ne suis quand même qu'à moitié satisfait car j'aimerais pouvoir utiliser kvm, qui nécessite l'activation de VT. Il existe des opérations plutôt &lt;a href="http://communities.vmware.com/thread/93922?start=15&amp;amp;tstart=0"&gt;périlleuses&lt;/a&gt; pour y parvenir, et je me tâte à les essayer pour l'instant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2735257926618761763-7502779141519033890?l=pichonjulien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichonjulien.blogspot.com/feeds/7502779141519033890/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://pichonjulien.blogspot.com/2009/04/netbsd-et-virtualisation.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default/7502779141519033890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default/7502779141519033890'/><link rel='alternate' type='text/html' href='http://pichonjulien.blogspot.com/2009/04/netbsd-et-virtualisation.html' title='NetBSD et Virtualisation'/><author><name>Julien Pichon</name><uri>http://www.blogger.com/profile/02749623446343456914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2735257926618761763.post-1263021593731083692</id><published>2009-04-02T08:01:00.004+02:00</published><updated>2009-10-29T14:22:54.371+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='libre'/><title type='text'>Solution Linux 2009</title><content type='html'>Je vais vous parler aujourd'hui de la journée du Mercredi 1 avril 2009 du &lt;a href="http://www.solutionslinux.fr/"&gt;salon SL 2009&lt;/a&gt;, où j'étais présent en tant qu'exposant. Arrivé le matin j'en ai profité pour commencer par faire un petit tour du salon par curiosité. Celui-ci se divise en deux parties, les professionnels et le village association. Chez les pros il y avait du monde (Zend, Talend, Symphony, l'OW2 consortium, Oracle, Mozilla ...), et on a bien remarqué dans le village associatif la présence du GCU-squad et des *BSD. Ensuite le reste de la journée je suis allé m'installer sur le stand d'&lt;a href="http://epsinux.org/"&gt;epsinux&lt;/a&gt; pour exposer et présenter l'asso.&lt;br /&gt;&lt;br /&gt;Cette journée a été assez riche, j'ai découvert le projet Globull (de Bull),  qui est un petit device dont le contenu est crypté à l'aide d'un processeur dédié (on peut rapporcher cela aux TPM). Le projet n'en n'est qu'à ses débuts, mais apparemment les possibilités en matière d'utilisation seraient importantes (SSO ...). On a aussi tenté de me convertir à NetBSD (promis je m'y mets).&lt;br /&gt;&lt;br /&gt;L'après midi j'ai été surpris de voir un terroriste poursuivi par des bouchers pendant le salon :). On devait cette animation au GCU-squad (leurs banderoles et slogans que j'avais aperçu le matin sur leur stand, aurait dû me mettre la puce à l'oreille), qui protestait contre la loi Hadopi. Le terroriste représentait un téléchargeur anonyme, et les bouchers armés de couteaux sanguinolent la loi Hadopi.&lt;br /&gt;&lt;br /&gt;Bien sûr on avait les deux réactions: "Ouais, puérilité, honte de l'open source toussa ..." et "Trop fort, ces mecs gèrent". Je pense qu'ils ont raison de faire du bruit comme ils le font, en effet j'étais passé sur leur stand pour connaître l'asso et leurs convictions. Le but de l'asso est de proumovoir les Unices libres, mais aussi de rappeler que si des SSII, des Entreprises qui vivent du libre existent, c'est en premier grâce aux développeurs, et contributeurs volontaires qui ont créés ces projets (Linux, *BSD, etc ...) et les font évoluer. Chose à laquelle j'adhère complètement.&lt;br /&gt;&lt;br /&gt;edit: hop &lt;a href="http://wiki.gcu.info/doku.php?id=boucherie2009"&gt;un lien avec les 'tofs et vidz &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2735257926618761763-1263021593731083692?l=pichonjulien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichonjulien.blogspot.com/feeds/1263021593731083692/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://pichonjulien.blogspot.com/2009/04/solution-linux-2009.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default/1263021593731083692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default/1263021593731083692'/><link rel='alternate' type='text/html' href='http://pichonjulien.blogspot.com/2009/04/solution-linux-2009.html' title='Solution Linux 2009'/><author><name>Julien Pichon</name><uri>http://www.blogger.com/profile/02749623446343456914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2735257926618761763.post-7034708910119988995</id><published>2009-02-20T16:31:00.001+01:00</published><updated>2009-04-21T11:57:01.467+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Operating System'/><title type='text'>Minimal OS</title><content type='html'>&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Bonjour à tous,&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;J'inaugure mon blog en vous parlant un peu du kernel que je développe.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Bien entendu je le fais à titre purement éducatif et je n'ai en aucun cas l'intention de concurrencer les OS du marché&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Son petit nom c'est MinimalOS (il ne fait vraiment pas grand chose en effet&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;)&lt;/span&gt; &lt;span style="font-family:trebuchet ms;"&gt;et il possèdera les caractéristiques principales finales:&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul  style="font-family:trebuchet ms;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Kernel monolithique (je ne pense pas le faire modulaire, car la flemme de développer&lt;br /&gt;tout le système de résolution de dépendance (link) dynamique)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Boot avec Grub (je n'ai pas codé de bootloader)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;C'est un clone UNIX (tout est fichier, et supporte donc les opérations POSIX (open, close, read, write, ioctl ...))&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;L'architecture cible est x86&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Allocateur de mémoire très simple (kernel et userland), je verrais pour porter SLAB plus tard&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Gestion des IRQ (avec le 8254) et des Exceptions (Notamment le swap).&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Une mini pile IP (UDP)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Ce qui est fait actuellement:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Le boot, j'utilise donc GRUB pour m'éviter de faire un bootloader et de batailler avec le mode réel de notre &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;processeur intel préféré (je verrais quand même plus tard pour en faire un). Ainsi pour que Grub puisse &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;reconnaître le kernel, il faut que celui-ci contienne dans ses tout premiers octets une structure spéciale (mboot dans &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;mon code). L'image binaire du kernel doit être dans un format spécial (ELF qui est du binaire produit par GCC de base), &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;je dispose les sections code bss data comme je veux (au niveau des adresses) grâce à un script que je fournis &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;à linker ld (link.ld dans mes sources).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;J'ai mis en place la gdt et l'idt. La segmentation (gdt) est de type flat segment comme indiqué dans les manuels intel &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;c'est à dire que je mets deux segments en ring 0 (1 Data, 1 Code) deux autres en ring 3 (1 Data, 1 Code). L'idt a été faite d'une façon qui nous permet de changer &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;et d'ajouter facilement des handlers.&lt;/span&gt; &lt;span style="font-family:trebuchet ms;"&gt;De plus j'ai "programmé" le contrôleur d'interruption l'i8254 pour qu'il me fournisse des interrupt vectors correct.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;J'attaque prochainement la pagination et je la ferais fonctionner comme dans linux je pense (je mappe le kernel juste au dessus des 3G, et je fais un identity &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;mapping des zones comme le BIOS, VGA display ...)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Je m'inspire fortement de deux tutos franchement bien fait:&lt;br /&gt;&lt;/span&gt;&lt;a style="font-family: trebuchet ms;" class="postlink" href="http://sos.enix.org/"&gt;http://sos.enix.org&lt;/a&gt;&lt;br /&gt;&lt;a style="font-family: trebuchet ms;" class="postlink" href="http://jamesmolloy.co.uk/tutorial_html/index.html"&gt;http://jamesmolloy.co.uk/tutorial_html/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Lien temporaire (j'utilise le sourceforge d'un autre projet perso, j'updaterai quand j'aurai une&lt;br /&gt;nouvelle forge): https://sourceforge.net/projects/epsinuxtl/&lt;br /&gt;&lt;/span&gt;&lt;!-- m --&gt;&lt;!-- m --&gt;&lt;!-- m --&gt;&lt;!-- m --&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2735257926618761763-7034708910119988995?l=pichonjulien.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pichonjulien.blogspot.com/feeds/7034708910119988995/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://pichonjulien.blogspot.com/2009/02/minimal-os.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default/7034708910119988995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2735257926618761763/posts/default/7034708910119988995'/><link rel='alternate' type='text/html' href='http://pichonjulien.blogspot.com/2009/02/minimal-os.html' title='Minimal OS'/><author><name>Julien Pichon</name><uri>http://www.blogger.com/profile/02749623446343456914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
