Ce document est conçu comme un support pédagogique destiné aux étudiants universitaires abordant la programmation des microcontrôleurs PIC en assembleur.
Il présente les concepts fondamentaux de l'algorithmique et des organigrammes, essentiels à la conception de programmes. Ensuite, il explore les directives clés de l'assembleur PIC16F nécessaires à l'initialisation et à la configuration du microcontrôleur. Enfin, un exercice pratique détaillé guide l'étudiant dans la réalisation d'un programme complet pour gérer des entrées/sorties, consolidant ainsi les connaissances théoriques et pratiques.
Informatique Industrielle : Exercices PIC16F : 1 er programme en assembleur
Télécharger PDFIntroduction au Premier Programme en Assembleur PIC16F
La programmation en assembleur pour les microcontrôleurs PIC16F est essentielle pour comprendre leur fonctionnement interne et optimiser les performances. Avant de plonger dans le code, il est crucial de maîtriser les concepts fondamentaux de l'algorithmique et des organigrammes, ainsi que les directives spécifiques à l'assembleur.
Rappel : Qu'est-ce qu'un Algorithme ?
L'algorithme est une succession logique et structurée, décrite étape par étape, des opérations à effectuer pour résoudre un problème donné. C'est le plan détaillé avant la phase de codage. Un algorithme peut être représenté graphiquement par un organigramme pour une meilleure visualisation de son déroulement.
Comprendre l'Organigramme (ou Ordinogramme)
L'organigramme est une représentation graphique normalisée, largement utilisée pour analyser, concevoir ou décoder un problème algorithmique. Il emploie des symboles spécifiques qui représentent des traitements, des liaisons logiques, des données et des décisions. Un organigramme bien construit doit être fléché pour indiquer le sens du cheminement de l'information et délimité par un début et une fin clairs.
Symboles Courants dans un Organigramme
- Traitement : Représente une opération ou un calcul effectué sur des données, dont le résultat reste au sein du microcontrôleur.
- Sous-programme : Indique une portion de programme distincte, exécutant une tâche spécifique, et considérée comme une simple opération du point de vue de l'algorithme principal.
- Entrée-sortie : Symbolise une opération d'écriture sur un port de sortie du microcontrôleur (par exemple, allumer une LED) ou de lecture d'un port d'entrée (par exemple, lire l'état d'un bouton).
- Décision : Représente un test ou une condition logique qui, selon son résultat (vrai ou faux), oriente le flux du programme vers l'une des deux branches possibles.
- Début, fin, interruption : Marque le point de départ, le point d'arrêt normal ou un point d'interruption temporaire de l'exécution de l'organigramme.
- Renvoi : Utilisé pour simplifier la représentation graphique en diminuant le nombre de flèches ou en évitant qu'elles ne se croisent, en connectant des parties non adjacentes du diagramme.
- Renvoi de page : Spécifiquement utilisé pour connecter des parties d'un organigramme qui s'étendent sur plusieurs pages.
- Commentaires : Permet d'ajouter des remarques explicatives ou des annotations pour clarifier certaines étapes de l'organigramme.
- Flèche de Direction : Indique le sens du cheminement logique de l'information et de l'exécution dans l'ordinogramme.
Directives Essentielles en Assembleur PIC avec MPLAB
Lors de la programmation d'un microcontrôleur PIC en assembleur, plusieurs directives sont utilisées pour configurer le projet et le microcontrôleur lui-même dans l'environnement MPLAB. Voici les principales :
a. Directive de Sélection du Microcontrôleur
Pour indiquer à l'assembleur quel modèle de PIC est utilisé, la directive
LIST P=NOM_DU_PIC est employée, souvent accompagnée de INCLUDE <P_NOM_DU_PIC.INC> pour inclure le fichier d'en-tête contenant les définitions des registres.
Exemple pour un PIC16F84 :
LIST P=PIC16F84
INCLUDE <P16F84.INC>
b. Définition des Noms des Variables Réservées au PIC
Les noms des registres et variables réservées au PIC (comme STATUS, PORTA, TRISA, etc.) sont généralement définis dans les fichiers d'inclusion (.INC) spécifiques à chaque microcontrôleur. Ces fichiers sont inclus avec la directive
INCLUDE.
c. Configuration des Modes de Fonctionnement du PIC
La configuration du microcontrôleur (oscillateur, Watchdog Timer, protection de code, etc.) est gérée par la directive
__CONFIG. Ces options sont essentielles au bon démarrage et fonctionnement du PIC.
Exemple pour le PIC16F84 :
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
_CP_OFF: Désactive la protection du code._WDT_OFF: Désactive le Watchdog Timer._PWRTE_ON: Active le Power-up Timer._HS_OSC: Sélectionne l'oscillateur High-Speed (cristal).
d. Indication de l'Adresse de Début du Code
La directive
ORG (Origin) spécifie l'adresse de la mémoire programme (Flash) où l'assembleur doit placer le code suivant. L'adresse de réinitialisation du PIC est généralement 0x00.
Exemple :
ORG 0x00 ; Le programme commence à l'adresse 0x00
e. Définition des Variables Utilisateur
Les noms des variables définies par l'utilisateur sont déclarés à l'aide de la directive
CBLOCK suivie de ENDC pour allouer un bloc de mémoire, ou par la directive EQU (Equate) pour définir des constantes ou des alias.
Exemple :
CBLOCK 0x20 ; Début de la zone de données RAM (adresse 0x20)
COMPTEUR1
TEMP_VAR
ENDC
MON_CONSTANTE EQU 0x0A ; Définit une constante
f. Indication de la Fin d'un Programme
La directive
END indique la fin du fichier source assembleur. Tout texte après cette directive est ignoré par l'assembleur.
Exemple :
END
Mise en Pratique : Interfaçage d'Interrupteurs et de LEDs avec un PIC
Cet exemple illustre comment configurer et utiliser les ports d'entrée/sortie d'un microcontrôleur PIC pour interagir avec des composants externes comme des interrupteurs et des LEDs.
Contexte du Programme : Affichage d'Interrupteurs sur des LEDs
L'objectif est de réaliser un programme où l'état d'interrupteurs connectés au PORTA du PIC est lu, puis cet état est affiché sur des LEDs connectées au PORTB. En d'autres termes, si un interrupteur est fermé (état logique haut), la LED correspondante s'allume, et inversement (In Dn avec n=1,2,3,4).
1. Choix et Déclaration du PIC
Pour un tel projet, le PIC16F84A est un choix courant et bien adapté. Il doit être déclaré au début du fichier assembleur :
LIST P=PIC16F84A
INCLUDE <P16F84A.INC>
2. Définition des Variables Réservées au PIC
Comme mentionné précédemment, les noms des registres spéciaux du PIC (STATUS, PORTA, PORTB, TRISA, TRISB, etc.) sont définis automatiquement via le fichier
P16F84A.INC inclus.
3. Configuration des Modes de Fonctionnement du PIC
Il est crucial de configurer correctement le PIC au démarrage. Par exemple, pour utiliser un oscillateur à quartz, désactiver le Watchdog Timer et activer le Power-up Timer :
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
4. Localisation des Registres (PORTA, PORTB, TRISA, TRISB)
Les microcontrôleurs PIC organisent leur mémoire de données en banques. Les registres PORTA, PORTB, TRISA et TRISB sont des registres de contrôle des ports d'entrée/sortie (I/O) :
- PORTA et PORTB sont des registres de données I/O, situés dans la banque 0.
- TRISA et TRISB sont des registres de direction des ports I/O, situés dans la banque 1. Ils déterminent si une broche est configurée en entrée (bit à 1) ou en sortie (bit à 0).
5. Configuration des Registres TRISA et TRISB
Pour le fonctionnement désiré :
- Le PORTA est utilisé pour lire les interrupteurs, il doit donc être configuré en entrées. Pour cela, on écrit la valeur binaire
(ou11111111b
) dans le registre TRISA.0xFFh - Le PORTB est utilisé pour commander les LEDs, il doit donc être configuré en sorties. Pour cela, on écrit la valeur binaire
(ou00000000b
) dans le registre TRISB.0x00h
6. Accès aux Registres TRISA et TRISB (Banque 1) et PORTA/PORTB (Banque 0)
Pour accéder aux registres situés dans une banque différente de la banque courante, il faut manipuler le bit RP0 du registre STATUS :
- Pour passer à la banque 1 (où se trouvent TRISA et TRISB) :
BSF STATUS, RP0 ; Mettre le bit RP0 à 1 - Pour revenir à la banque 0 (où se trouvent PORTA et PORTB, ainsi que les registres de usage général) :
BCF STATUS, RP0 ; Mettre le bit RP0 à 0
7. Instructions de Configuration du PORTA et du PORTB
Voici les instructions assembleur pour configurer les ports :
BSF STATUS, RP0 ; Passer à la banque 1 (pour TRISA, TRISB)
MOVLW 0xFF ; Charger la valeur 0xFF (toutes en entrées)
MOVWF TRISA ; Configurer PORTA en entrées
MOVLW 0x00 ; Charger la valeur 0x00 (toutes en sorties)
MOVWF TRISB ; Configurer PORTB en sorties
BCF STATUS, RP0 ; Revenir à la banque 0
8. Algorithme et Organigramme du Programme Principal
L'algorithme du programme principal serait le suivant :
- Initialisation : Configurer le PIC (oscillateur, ports A et B).
- Boucle Infinie :
- Lire l'état des interrupteurs sur le PORTA.
- Écrire cette valeur sur le PORTB pour allumer les LEDs correspondantes.
- Recommencer à l'étape 2a.
9. Écriture du Programme Principal
Après l'initialisation, le cœur du programme consisterait en une boucle simple :
BOUCLE_PRINCIPALE:
MOVF PORTA, W ; Lire l'état du PORTA et le stocker dans W
MOVWF PORTB ; Écrire la valeur de W sur le PORTB
GOTO BOUCLE_PRINCIPALE ; Revenir au début de la boucle
10. Écriture du Programme Entier
Le programme complet intégrerait toutes les parties :
; Directives de configuration
LIST P=PIC16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
; Réinitialisation
ORG 0x00
GOTO INIT ; Aller à la routine d'initialisation
; Initialisation des ports
INIT:
BSF STATUS, RP0 ; Passer à la banque 1
MOVLW 0xFF ; PORTA en entrées
MOVWF TRISA
MOVLW 0x00 ; PORTB en sorties
MOVWF TRISB
BCF STATUS, RP0 ; Revenir à la banque 0
; Programme principal (boucle infinie)
BOUCLE_PRINCIPALE:
MOVF PORTA, W ; Lire le PORTA
MOVWF PORTB ; Afficher sur le PORTB
GOTO BOUCLE_PRINCIPALE
END ; Fin du fichier
Foire Aux Questions (FAQ)
Qu'est-ce qu'un microcontrôleur PIC ?
Un microcontrôleur PIC (Peripheral Interface Controller) est une petite puce électronique programmable qui intègre un processeur, de la mémoire (programme et données) et des périphériques d'entrée/sortie sur un seul circuit intégré. Il est conçu pour contrôler des systèmes embarqués et des applications spécifiques.
Pourquoi utiliser l'assembleur pour programmer un PIC ?
L'assembleur offre un contrôle direct et fin sur le matériel du microcontrôleur, permettant une optimisation maximale en termes de vitesse d'exécution et d'utilisation de la mémoire. Bien que plus complexe que les langages de haut niveau, il est indispensable pour des applications nécessitant des performances critiques ou une taille de code minimale.
Quelle est l'importance des organigrammes en programmation embarquée ?
Les organigrammes sont cruciaux en programmation embarquée car ils permettent de visualiser et de comprendre clairement la logique séquentielle d'un programme. Ils facilitent la conception, la détection d'erreurs logiques avant le codage, la documentation du programme et la collaboration au sein d'une équipe de développement, surtout pour des systèmes aux contraintes de temps et de ressources.