← Retour

Micro-contrôleurs PIC

PIC16F84a PIC16F877a Assembleur C MPLAB X

Ce module (EEL6-NUMU2) se décomposait en deux parties : des TPs d'initiation sur PIC16F84a pour comprendre l'architecture et le jeu d'instructions, puis un projet de synthèse sur PIC16F877a — la réalisation d'une horloge à quartz avec affichage LCD.

TPs sur PIC16F84a

Le PIC16F84a est un microcontrôleur 8-bit d'entrée de gamme chez Microchip, idéal pour l'apprentissage : 2 ports (A et B), un timer, et un jeu d'instructions RISC de 35 instructions. La carte d'application reliait le PIC à un afficheur 7 segments, 5 LEDs, et un bouton poussoir sur RB0 (capable de déclencher une interruption matérielle). La programmation et le debug se faisaient via l'interface ICD 3 sous MPLAB X.

TP1 — Prise en main et assembleur

Découverte de la chaîne de développement MPLAB X (éditeur, assembleur mpasm, programmateur, simulateur/débugueur ICD). Premier programme : allumer une LED. Puis écriture d'un chenillard sur les 5 LEDs avec temporisation par boucle de comptage — l'occasion de comprendre comment chaque instruction consomme exactement un cycle d'horloge (sauf les sauts).

TP2 — Du C et des timers

Réécriture du chenillard en C (compilateur XC8), puis utilisation du TIMER0 pour gérer la temporisation proprement au lieu des boucles de comptage. Configuration du prédiviseur, calcul de la valeur de rechargement pour obtenir le délai voulu — le genre de calcul qu'on finit par faire dans sa tête à force de le répéter.

TP3 — Interruptions et watchdog

Passage du polling aux interruptions : le TIMER0 déclenche une IT à chaque débordement, et la routine d'interruption gère le séquencement du chenillard. Puis utilisation du chien de garde (WDT) comme source de temporisation alternative. Enfin, un programme d'affichage de message défilant sur le 7 segments.

Projet : horloge à quartz sur PICDEM2+

Le projet de synthèse consistait à réaliser une horloge à quartz avec affichage sur un LCD 2×16 caractères, sur la carte PICDEM2+ équipée d'un PIC16F877a — le « grand frère » du 16F84a, avec 5 ports, 3 timers, un CAN, un module USART, et un module de debug intégré.

Base de temps

La carte intègre un quartz de 32,768 kHz relié au TIMER1. En le laissant tourner librement, le timer déborde toutes les 2 secondes exactement (216 / 32768). Pour obtenir une interruption chaque seconde, le module de comparaison CCP1 est configuré pour déclencher une IT à mi-parcours du timer. On ne réinitialise jamais le TIMER1 — toute réinitialisation introduirait un décalage et dégraderait la précision (~10-5) du quartz. Une LED sur RB1 clignote à 2 Hz en guise de heartbeat.

Librairie LCD

Le cœur du projet : développer from scratch une bibliothèque de fonctions pour piloter l'afficheur LCD (contrôleur Sunplus), en respectant le protocole de communication 4-bit. Le bus de données est partagé avec le port D du PIC, et les signaux de contrôle (RS, RW, E) demandent une attention particulière — un front parasite sur E suffit à décaler d'un demi-mot toutes les acquisitions suivantes, et une commutation involontaire de RD7 réinitialise l'afficheur.

La procédure d'initialisation suit un protocole précis : 4 cycles en mode 4-bit (seul le quartet de poids fort est significatif), avec des temporisations spécifiques à respecter. Les transferts de données se font ensuite en deux paquets de 4 bits (poids fort puis poids faible), en ramenant systématiquement E à l'état de repos entre chaque paquet.

Réglage de l'heure

Le réglage utilise les deux poussoirs S2 et S3 de la carte (S1 étant réservé au RESET). Un appui prolongé (>2 s) sur S2 fait entrer en mode réglage avec clignotement des heures ; S3 les incrémente (appui bref) ou les fait défiler (appui maintenu >2 s, à ~5 Hz). Un nouvel appui sur S2 passe aux minutes, un troisième quitte le mode réglage. L'anti-rebond se fait par échantillonnage à intervalle supérieur à 20 ms.

En option, le potentiomètre de la carte (relié à RA0 et au CAN 10-bit du PIC) permet un réglage « analogique » : en mode réglage, la rotation du potentiomètre fait varier la valeur entre 0 et 23 (heures) ou 0 et 59 (minutes). Pour s'affranchir du bruit, une variation de plus de 10 unités du CAN (~1/100e de tour) est requise pour valider un changement.

Approche modulaire

Le projet imposait une structuration rigoureuse du code en C : main.c pour la logique applicative, timer.c / timer.h pour la configuration de la base de temps, lib_LCD.c / lib_LCD.h pour la librairie d'affichage. Le formatage de l'heure utilise sprintf pour écrire dans un buffer avant envoi au LCD.