Outils libres pour développer des applications sur les micro-contrôleurs PIC sous GNU Linux.

P.Launay 2006
This program is free software; you can redistribute it and/or modify  it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or  (at your option) any later version.

  This program is distributed in the hope that it will be useful,  but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA


Table des matières

Les_Logiciels_Libres

Présentation du PIC   
Logiciel d'affichage sur PC 
Gestion graphique avec Liberlab 
Gestion avec GTKTerm et un moniteur Jack's monitor 
GTKTerm  et Gnuplot 
La programmation en C des PICS avec SDCC   
Gestion de la vitesse d'un ventilateur.   
Programme C : ventilo2.c   
Explication  du programme ventilo2.c   
Comment graver des PICS ? 
Logiciels utilisés  

Les logiciels libres

Présentation des sources en OpenOffice : Les_Logiciels_Libres.odp ou en pdf Les_Logiciels_Libres.pdf


Ce travail a pu être réalisé car les sources sont fournies et les modifications autorisées, ces logiciels sont libres GPL !

Avec des logiciels propriétaires ce travail n'existerait pas !

Présentation du PIC

Le pic est un microcontrôleur, c'est un composant électronique qui gère des entrées sorties avec un programme graver à l'intérieur.


Exemple simple: j'ai une thermistance sur une entrée qui mesure la température, si la température est inférieure à 18°C (seuil que je peux fixer) une sortie commande un chauffage.
Les entrées sorties peuvent être des sorties tout ou rien, en standard les ports d'E/S sont digitales.
Le PIC que nous utiliserons possèdent d'autres modules qui sont :
Modules avec 3 Timers avec 2 entrées de capture, 2 sorties de comparaison et aussi une sortie PWM ou MLI (rapport cyclique variable) mais aussi des compteurs que l'on peut gérer en interne.
Modules CAN, qui peut convertir 8 entrées analogiques
Module Liaison série synchrone, SPI ou I2C
Module liaison série asynchrone, USART pour la RS232
Module Port Parallèle esclave

La programmation du PIC peut se faire en assembleur mais assez difficile et spécifique au PIC ou en langage C , c'est celui que nous utiliserons , c'est un langage plus facile à écrire et on peut utiliser des bibliothèques avec des fonctions réutilisables.

Logiciel d'affichage sur PC

Pour travailler avec un PIC et afficher des résultats sur un PC, la liaison standard utilisé sur les PIC 16F87X est la liaison série qui possède un module USART
16f87xA_39582b.pdf page 6 et en détails, le module USART 16f87xA_39582b.pdf page 111

Il existe diverses solutions pour gérer la liaison série.

Gestion graphique avec Liberlab

Liberlab est laboratoire personnel de poche, le microcontrôleur effectue des mesures qui sont affichés sur le PC , ici je vous présente une démonstration simple :
PIC avec des potentiomètres et le logiciel Liberlab sur PC

Attention ceci n'est possible que si le PIC à le moniteur implanté

Ouvrir une console :

  1. Graver le programme pic_liberlab.hex avec GTKTerm
    Dans la console, lancer gtkterm -r '*'
    La fenêtre GTKTerm s'ouvre : appuyer sur le reset de la carte PIC et dans les 4 secondes taper 3 (load hex,graver un fichier exécutable dans la mémoire flash du PIC)

    Menu Fichier => Envoi de fichier brut
    Dans le répertoire sdcc choisir pik_liberlab.hex
    Une fois le programme chargé, il se lance automatiquement.
    Des caractères non visibles apparaissent, fermer la fenêtre GTKTerm
  2. Dans une console, lancer à partir du répertoire liberlab_pic : $ ./liberlab_pic.py

    Une fenêtre graphique Tk apparaît avec comme titre Liberlab Software pour le lancer cliquer sur mesurer .


Gestion avec GTKTerm et un moniteur Jack's monitor

Téléchargement d'un fichier exécutable par la liaison série

Avec le moniteur impanté dans le PIC, il est facile de changer de programme utilisateur en gravant un fichier exécutable par la liaison série

PIC avec un ventilateur PC qui possède un ILS et affichage de la vitesse et le logiciel Liberlab modifié

  1. Graver le programme pic_liberlab.hex avec GTKTerm
    Dans la console, lancer gtkterm -r '*'
    La fenêtre GTKTerm s'ouvre : pour nettoyer l'écran dans Menu Fichier => Effacer l'écran et aussitôt appuyer sur le reset de la carte PIC et dans les 4 secondes taper 3 (load hex,graver un fichier exécutable dans la mémoire flash du PIC)

    Menu Fichier => Envoi de fichier brut
    Dans le répertoire sdcc choisir ventilo2.hex
    Une fois le programme chargé, il se lance automatiquement.
    Des caractères visibles apparaissent, fermer la fenêtre GTKTerm
  2. Dans une console, lancer à partir du répertoire liberlab_pic : $ ./liberlab_pic_ventilo2.py

    Une fenêtre graphique Tk apparaît avec comme titre Liberlab Software pour le lancer cliquer sur mesurer .


GTKTerm  et Gnuplot

Fermer la fenêtre Liberlab liberlab_pic_ventilo.py

Ouvrir gtkterm et ouvrir le menu Fichier => Effacer l'écran, attendre quelques secondes puis dans ce même menu Fichier => Sauvegarde en fichier brut

Vous le sauvegardez ou vous souhaitez, vous trouverez un exemple dans le répertoire mesure : acquisition_ventilateur.txt

Dans une console lancer alors freq_ventilo.py (dans le répertoire mesure) on vous demande le nom du fichier de sortie. Dans ce même répertoire vous trouverez un exemple mesure _ventilateur.txt

freq_ventilo.py lancera alors Gnuplot, où vous pourrez visualiser une partie des mesures et faire des zooms.

Lisez la documentation de Gnuplot pour de plus amples informations.


La programmation en C des PICS avec SDCC

Pour écrire des programmes pour les PICs, nous avons l'assembleur avec GPASM mais celui-ci est assez difficile à utiliser et spécifique au PIC
Nous utiliserons donc un logiciel de programmation évolué le Langage C très utilisé pour tous les microcontrôleurs.
Il existe de nombreux cours sur le Web pour s'initier au langage C.

Il nous faut aussi un compilateur C pour PIC, nous utiliserons le compilateur libre GPL SDCC.
Plutôt que de voir tous les commandes possibles nous allons prendre un exemple simple

Gestion de la vitesse d'un ventilateur

Le ventilateur comporte 3 fils : 2 fils pour l'alimentation et un fil de retour pour l'ILS. (interrupteur à lames souples quand l'ILS passe devant un aimant il se ferme sinon il est ouvert.
Principe :
A chaque tour du ventilateur, nous passons 2 fois devant un aimant, l'interrupteur ILS se ferme et nous avons un niveau '0' (OV) en sortie ILS sinon quand l'interrupteur n'est pas devant un aimant il est ouvert et le +5V arrive à la sortie ILS à travers la résistance R (résistance de tirage vers le haut ou pull-up)
Bilan :nous avons 2 impulsions en sortie d'ILS à chaque tour du ventilateur.

Utilisation de l'entrée Capture du Timer 1 du PIC CCP1
Le timer 1 est un timer avec un compteur 16 bits qui s'incrémente tous les 4/Fquartz soit avec un quartz de 4MHz tous les 1 µs.
L'entrée Capture recopie la valeur du Timer1 dans CCPR1 à chaque front montant et un drapeau CCP1IF passe à 1.
Si on prend Tm = temps entre 3 fronts montants on aura le temps en µs d'un tour du ventilateur.
Nous aurons la vitesse en tours/minute en faisant 60*106 / Tm

La source : ventilo2.c

Explication  du programme ventilo2.c

Ce fichier est GPL vous pouvezle lire, le modifier, l'exécuter et le distribuer.
Les includes permettent d'utiliser :
1)Les noms des registres spéciaux et des différents bits (pic16f877.h)
2)Les sous-programmes définis dans les bibliothèques personnelles
e2o_t est un type défini par l'utilisateur, celui-ci permet de passer de 2 octets (8 bits) en entier (int 16 bits), ceci est utilisé pour le CCPR1 qui travaille en 16 bits mais qui se lit avec 2 registres CCPR1L et CCPR1H

int capture(void) : sous programme capture, lecture du CCPR1 après un front montant sur CCP1 void:pas de paramètre d'entrée, int : paramètre de sortie un entier (16 bits)
« {» début sous programme, « }» fin sous programme
On lit les poids fort et poids faible de CCPR1 et ne pas oublier de remettre CCP1IF à 0,
CCP1IF passe à 1 lors d'un front montant de CCP1 mais le logiciel doit le remettre à 0.

void init() : sous programme init :init Timer1 en mode Capture avec configuration des registres spéciaux du Timer 1 voir chapitre 6 Timer1 Module et chapitre 8 Capture/compare/PWM modules

void main (void) : programme principal (pas de paramètre d'entrée et de sortie )
int valm2,valanc,valnv,Tm; //variables de type entier 16 bits
init();     // appel sous programme  init Timer Capture
     // tant que (while) CCP1IF=0 ne rien faire « ; »
on sortira de la boucle while quand CCP1IF=1 (front montant sur CCP1)
la ligne   while (!CCP1IF) ; correspond à attente front montant sortie ILS ventilo
     valm2=capture();    //front 1, on met dans lavariable valm2 la valeur de CCPR1
     while (!CCP1IF) ; // attente front montant sortie ILS ventilo
     valanc=capture();    //front 2

     while (1) { //tant que 1 toujours vrai, boucle sans fin «{ » début du while
         if (CCP1IF) { // Si(If) CCP1IF=1, front montant sortie ILS ventilo
             valnv=capture(); //front 3
             Tm =valnv-valm2; //Tm = temps front3-front1(temps d'un tour)
             putint(Tm); // envoie en ascii sur liaison série du temps Tm, le sous programme putint est dans la bibliothèque projet.lib
             putchar(0x0a);// fin de ligne, putchar sous programme dans projet.lib
             valm2=valanc; //front 2 devient front 1
             valanc=valnv;  //front 3 devient front 2
Explication : comme on le voit sur le dessin, on attend 3 fronts puis on envoie Tm ensuite front2 devient front1 et front3 devient front2 et on attend indéfiniment (while 1) le front suivant avec le IF(si) pour de nouveau envoyer le temps Tm
    } Fin Si (IF)
     } Fin Tant que (While)
 } Fin Programme Main

Comment graver des PICS ?

Graver des PICs

Carte Liberlab pic
Voir http://www.liberlab.net/ rubrique Carte Liberlab.
Vous pouvez comme sur Liberlab réaliser une carte Liberlab pic sur une plaquette d'essai, ou bien réaliser un circuit imprimé sous Kicad (logiciel de CAO libre GPL).
Schéma minimal :


Vous trouverez le source carte_pic16f877_mini.sch dans le répertoire kicad_pic.

Logiciels utilisés

Installer sur la distribution Debian Etch, en octobre 2006.

Avec synaptic
Gestion de la liaison série : GTKTerm
Langage de programmation : Python et différents modules Tkinter..., serial python pour Liberlab
Tracé de courbes : Gnuplot
Assembleur et gestion de liens pour PIC : Gputils (contient Gpasm et Gplink)
Simulation des PIC : Gpsim
Compilateur C (dont le PIC) : SDCC 2.6.0
Anjunta, Scite, Gedit *
* Ces logiciels ne sont pas strictement nécessaires, ce sont des éditeurs de texte pour écrire des programmes en C, en Python et en Assembleur.

En option pour graver le premier PIC, utilisez Pikdev (environnement KDE) ou uniquement pkp pour Gnome sur le site de Pikdev menu Installation vous trouverez à la fin Installation of pkp ou en français : lire le fichier aide_pkp

A mettre manuellement dans /usr/local/

Logiciel compilés : Kicad est une suite open source (GPL) pour la réalisation de schémas électroniques et de circuits imprimés.KICAD

Pour l'installation sous linux, télécharger Kicad-(date).tgz lire l'install.txt

Nouveau : Kicad pour Debian Etch en paquets Debian, installation avec synaptic, préférer toujours les paquets de votre distributions quand ils existent.

Particuliers et modifiés
Skypic-down-02.tgz et librairies pour debian libstargate_1.0.1-1_i386.deb et libstargate-dev_1.0.1-1_i386.deb
Lire lisezmoi.txt dans le répertoire skypic
(A faire une version française avec .po, source en C)
jmonitor1.0.tar.gz le moniteur (bootloader) à installer sur le Pic
Pas de compilation pour le PC, il s'agit de fichier pour le pic on obtient l'exécutable (.hex) à partir du fichier assembleur (.asm) avec Gpasm
Lire le fichier readme.txt ou leeme.txt ou lisezmoi.txt
Liberlab_pic.py programme graphique pour faire un laboratoire de poche.

Pour ces 3 derniers, voici l'adresse des sources :

Le moniteur de Jack Dallhausen PIC16F877 Monitor and Bootloader

Skypic-down lib-stargate picp ... de Juan González IEARobotics

Liberlab Laboratoire de poche de François Schnell de L'ULP de Strasbourg Liberlab