16
www.elektor.fr/debutPIC les microcontrôleurs PIC pour les débutants qui veulent programmer sans patauger avec mikroPascal Sommaire - Copyright © 2013 - Elektor International Media 1. Organisation du livre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2. Présentation des PIC 2.1 Au début était... la logique câblée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.2 Arrivée du microprocesseur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.3 Arrivée du microcontrôleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.4 Différentes familles de PIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.4.1 PIC « de base » 8 bits (PIC10, PIC12, PIC16, PIC18) . . . . . . . . . . . . . . . . . . 12 2.4.2 PIC « évolués » 16 bits (PIC24, dsPIC30, dsPIC33) . . . . . . . . . . . . . . . . . . . 15 2.4.3 PIC « haut de gamme » 32 bits (PIC32) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.4.4 Différentes versions d’un « même » PIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 les microcontrôleurs PIC pour les débutants qui veulent programmer sans patauger avec mikroPascal : intermédiaire idéal entre BASIC (trop facile) et C (trop difficile) Auteur : Rémy MALLARD Éditeur : Elektor ISBN : 978-2-86661-193-4 Format : 17 × 23,5 cm Nbre de pages : 448 Prix : 48,50 Ce fichier contient le sommaire suivi de dix pages extraites de l’ensemble du livre qui en compte 448. Sommaire elektor 0,01 0,1 0 1 2 3 4 5 6 7 8 9 qui veulent programmer sans patauger les microcontrôleurs PIC pour les débutants Rémy Mallard présente avec mikroPascal : intermédiaire idéal entre BASIC (trop facile) et C (trop difficile)

978-2-86661-193-4 - microcontrôleurs PIC pour les débutants de

  • Upload
    lenhan

  • View
    224

  • Download
    3

Embed Size (px)

Citation preview

Page 1: 978-2-86661-193-4 - microcontrôleurs PIC pour les débutants de

www.elektor.fr/debutPIC

les microcontrôleurs PIC pour les débutantsqui veulent programmer sans patauger avec mikroPascal

Sommaire - Copyright © 2013 - Elektor International Media

1. Organisation du livre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2. Présentation des PIC

2.1 Au début était... la logique câblée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.2 Arrivée du microprocesseur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.3 Arrivée du microcontrôleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

2.4 Différentes familles de PIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112.4.1 PIC « de base » 8 bits (PIC10, PIC12, PIC16, PIC18) . . . . . . . . . . . . . . . . . . 122.4.2 PIC « évolués » 16 bits (PIC24, dsPIC30, dsPIC33) . . . . . . . . . . . . . . . . . . . 152.4.3 PIC « haut de gamme » 32 bits (PIC32) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.4.4 Différentes versions d’un « même » PIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

les microcontrôleurs PIC pour les débutantsqui veulent programmer sans patauger

avec mikroPascal : intermédiaire idéalentre BASIC (trop facile) et C (trop difficile)

Auteur : Rémy MALLARD

Éditeur : ElektorISBN : 978-2-86661-193-4Format : 17 × 23,5 cmNbre de pages : 448Prix : 48,50 €

Ce fichier contient le sommaire suivi de dix pages extraites de l’ensemble du livre qui en compte 448.

Sommaire

elektor

0,01

0,1

0

1

2

3

4

5

6

7

8

9

qui veulent programmer sans patauger

les microcontrôleurs PICpour les débutants

Rémy Mallard présente

avec mikroPascal : intermédiaire idéal entre BASIC (trop facile) et C (trop difficile)

Page 2: 978-2-86661-193-4 - microcontrôleurs PIC pour les débutants de

www.elektor.fr/debutPIC

les microcontrôleurs PIC pour les débutantsqui veulent programmer sans patauger avec mikroPascal

Sommaire - Copyright © 2013 - Elektor International Media

2.5 Les mots qui fâchent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202.5.1 Bit, octet, mot, entier… (bit, byte, word, integer…) . . . . . . . . . . . . . . . . . . . . 212.5.2 Registres (registers) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.5.3 Entrées/sorties (inputs/outputs) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.5.4 Mémoire (memory) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.5.5 Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242.5.6 I2C / SPI / OneWire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

3. Assembleur et langage machine

3.1 Exécution de commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

3.2 Langage machine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

3.3 Langage assembleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

3.4 Compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

3.5 Utilisation d’un langage plus « parlant » . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

3.6 Correspondance entre Pascal et assembleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

4. Présentation de mikroPascal

4.1 Constitution d’un programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314.1.1 Structure d’un programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324.1.2 Les variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344.1.3 Quelques règles simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354.1.4 Les opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364.1.5 Les fonctions spéciales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

4.2 Introduction à mikroPascal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

4.3 Principes de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

4.4 Principes avancés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434.4.1 Simulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434.4.2 Débogage ICD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

4.5 mikroPascal et programmateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

5. Configuration d’un PIC

5.1 Mot de configuration (Config Word) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

5.2 FOSC (Oscillator) – horloge/oscillateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515.2.1 Vitesse d’exécution des instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525.2.2 Localisation des broches affectées à horloge . . . . . . . . . . . . . . . . . . . . . . . . . . 525.2.3 Différents modes d’horloge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535.2.4 PLL et multiplication de fréquence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645.2.5 Blocage de l’oscillateur (fonction SLEEP / Power Down). . . . . . . . . . . . . . . 645.2.6 Timers et compteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

Page 3: 978-2-86661-193-4 - microcontrôleurs PIC pour les débutants de

www.elektor.fr/debutPIC

les microcontrôleurs PIC pour les débutantsqui veulent programmer sans patauger avec mikroPascal

Sommaire - Copyright © 2013 - Elektor International Media

5.2.7 Fréquence et tension d’alimentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715.2.8 Overclocking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715.2.9 Remarques diverses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

5.3 MCLR (Master Clear Reset) – Reset général . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725.3.1 Reset manuel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735.3.2 Reset automatique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

5.4 WDT (WatchDog Timer) – Chien de garde . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

5.5 BOR (Brown-Out Reset) – Détection de chute de tension . . . . . . . . . . . . . . . . . . . . . . 80

5.6 POR (Power-On Reset) – Reset à la mise sous tension . . . . . . . . . . . . . . . . . . . . . . . . . 85

5.7 PWRT (Power-up Timer) – Temporisateur de démarrage . . . . . . . . . . . . . . . . . . . . . . 86

5.8 LVP (Low Voltage Programming) – Programmation en basse tension . . . . . . . . . . . . 87

5.9 CP (Code Protection) – Protections de la mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

5.10 Configuration des broches d’entrée/sortie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915.10.1 Des broches à tout faire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915.10.2 L’heure du choix... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

6. Programmation d’un PIC

6.1 Cinq fils suffisent pour programmer un PIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

6.2 Modes de programmation HVP ou LVP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

6.3 VPP-First ou VDD-First ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

6.4 Programmation sur support (off-board) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1056.4.1 Programmateurs simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1076.4.2 Programmateurs évolués (platines de développement) . . . . . . . . . . . . . . . . . 109

6.5 Programmation sur circuit final (ICSP) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1116.5.1 Câblage d’un connecteur ICSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

6.6 Programmation avec bootloader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1186.6.1 Utilisation d’un bootloader COM/RS232 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1216.6.2 Utilisation d’un bootloader USB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1236.6.3 Autres types de bootloader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1246.6.4 Plus besoin de programmateur ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

6.7 Alors, ICSP ou bootloader ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

6.8 Choix du programmateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1256.8.1 Programmateur à faire soi-même . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1266.8.2 Programmateurs universels ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1326.8.3 Durée de programmation d’un PIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

Page 4: 978-2-86661-193-4 - microcontrôleurs PIC pour les débutants de

www.elektor.fr/debutPIC

les microcontrôleurs PIC pour les débutantsqui veulent programmer sans patauger avec mikroPascal

Sommaire - Copyright © 2013 - Elektor International Media

7. Interruptions

7.1 Interruption de Timer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

7.2 Interruption via les ports d’entrée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

7.3 Autres types d’interruption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156

8. Utilisation des entrées/sorties

8.1 Activation d’une sortie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1628.1.1 Des sorties... mais aussi des entrées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1628.1.2 Clignotant à LED simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1678.1.3 Gradateur de lumière à LED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1688.1.4 Pilotage d’un relais ou d’un moteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172

8.2 Production d’un signal sonore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1748.2.1 Signal sonore continu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1758.2.2 Signal sonore bref (bip) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1768.2.3 Signal modulé (sirène) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1788.2.4 Mélodie (suite de notes) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1798.2.5 Boîte à rythmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1808.2.6 Lecture de fichiers WAV/RAW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1868.2.7 Lecture de fichiers MP3 (approche) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188

8.3 Capture de signaux logiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1908.3.1 Capture de signaux lents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1918.3.2 Capture de signaux rapides . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1978.3.3 Encodeur optique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202

8.4 Utilisation des comparateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2068.4.1 Comparaison de deux tensions externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2108.4.2 Comparaison d’une tension externe avec la tension de référence interne . . . 210

8.5 Mesure d’une tension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2128.5.1 Mesure de tension(s) avec CAN interne . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2138.5.2 Mesure de tension(s) sans CAN interne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218

8.6 Mesure d’un rapport cyclique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2188.6.1 Mesure du rapport cyclique après intégration (analogique) . . . . . . . . . . . . . 2188.6.2 Mesure directe du rapport cyclique (numérique) . . . . . . . . . . . . . . . . . . . . . . 220

8.7 Mesure d’une fréquence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2228.7.1 Mesure d’une fréquence après conversion N/A simple . . . . . . . . . . . . . . . . . 2228.7.2 Mesure directe d’une fréquence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225

8.8 Production d’une tension analogique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2278.8.1 Production d’une tension analogique avec un réseau R-2R . . . . . . . . . . . . . . 2288.8.2 Production d’une tension analogique avec un DAC intégré . . . . . . . . . . . . . 2308.8.3 Production d’une tension analogique avec un signal PWM . . . . . . . . . . . . . 2328.8.4 Production d’une tension analogique par moyen détourné . . . . . . . . . . . . . . 236

Page 5: 978-2-86661-193-4 - microcontrôleurs PIC pour les débutants de

www.elektor.fr/debutPIC

les microcontrôleurs PIC pour les débutantsqui veulent programmer sans patauger avec mikroPascal

Sommaire - Copyright © 2013 - Elektor International Media

8.9 Usage de capteurs et détecteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2378.9.1 Capteur de contact en tout ou rien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2378.9.2 Capteur de lumière en tout ou rien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2408.9.3 Capteur de lumière de type proportionnel . . . . . . . . . . . . . . . . . . . . . . . . . . . 2418.9.4 Capteur de température analogique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2428.9.5 Capteur de température numérique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2518.9.6 Capteur d’humidité analogique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2538.9.7 Capteur d’humidité numérique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2578.9.8 Capteur de pression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2578.9.9 Capteur capacitif et touche sensitive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2618.9.10 Capteur de position (accéléromètre) à 3 axes . . . . . . . . . . . . . . . . . . . . . . . . 270

8.10 Multiplexages des entrées/sorties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2728.10.1 Multiplexage de sorties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2738.10.2 Multiplexage d’un clavier et d’un afficheur à LED . . . . . . . . . . . . . . . . . . . 279

8.11 Affichage sur écran LCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2838.11.1 Principe général de fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2838.11.2 Affichage LCD de type texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2848.11.3 Affichage LCD de type graphique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287

9. Gestion des données

9.1 Lecture/écriture en EEPROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2939.1.1 Quel type de données peut-on sauver en EEPROM ? . . . . . . . . . . . . . . . . . . 2949.1.2 Écriture/lecture d’une donnée de 8 bits (octet/byte) . . . . . . . . . . . . . . . . . . . 2949.1.3 Écriture/lecture d’une donnée de 16 bits (mot/word) . . . . . . . . . . . . . . . . . . 2979.1.4 Écriture/lecture d’une donnée de 32 bits (mot long/longword) . . . . . . . . . . 3019.1.5 Écriture d’une donnée de 7 bits ou moins . . . . . . . . . . . . . . . . . . . . . . . . . . . 303

9.2 Données RS232 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3059.2.1 Émission et réception de données RS232 . . . . . . . . . . . . . . . . . . . . . . . . . . . 3079.2.2 Utilisation d’un buffer circulaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3109.2.3 Différences entre RS232 et RS485 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3149.2.4 Interface UART/USB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316

9.3 Données MIDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3179.3.1 Émission de données MIDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3189.3.2 Réception de données MIDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321

9.4 Données RC5/RC6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3249.4.1 Émission de données RC5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3249.4.2 Réception de données RC5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327

9.5 Données DMX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3319.5.1 Émission de données DMX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3349.5.2 Réception de données DMX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336

9.6 Liaisons SPI et I2C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3409.6.1 Présentation du bus I2C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3409.6.2 Présentation du bus SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347

Page 6: 978-2-86661-193-4 - microcontrôleurs PIC pour les débutants de

www.elektor.fr/debutPIC

les microcontrôleurs PIC pour les débutantsqui veulent programmer sans patauger avec mikroPascal

Sommaire - Copyright © 2013 - Elektor International Media

9.6.3 Lecture/écriture de valeurs logiques avec PCF8574 (I2C) . . . . . . . . . . . . . . 3509.6.4 Lecture/écriture de valeurs analogiques avec PCF8591 (I2C) . . . . . . . . . . . 3539.6.5 Lecture/écriture avec mémoire EEPROM externe (I2C) . . . . . . . . . . . . . . . . 3589.6.6 Convertisseur A/N à 8 voies avec MCP3208 (SPI) . . . . . . . . . . . . . . . . . . . . 3619.6.7 Lecture/écriture de valeurs logiques avec MCP23S08 (SPI) . . . . . . . . . . . . . 3649.6.8 Utilisation simultanée de composants I2C et SPI . . . . . . . . . . . . . . . . . . . . . 368

9.7 Liaison USB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3689.7.1 Concepts de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3709.7.2 PIC 18F2550 et liaison USB fonctionnelle . . . . . . . . . . . . . . . . . . . . . . . . . . 3789.7.3 PIC 18F2550 et utilisation pratique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3899.7.4 PIC 18F4550 et utilisation pratique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395

9.8 Liaison Ethernet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4019.8.1 Concept de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4019.8.2 18F45K22, ENC28J60 et liaison Ethernet fonctionnelle . . . . . . . . . . . . . . . . 403

9.9 Liaison OneWire (1-Wire) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4139.9.1 Mode d’alimentation parasite (parasitic power) . . . . . . . . . . . . . . . . . . . . . . 4139.9.2 Protocole de communication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416

Annexe 1 – Binaire, décimal et hexadécimal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419

Annexe 2 – Convertisseurs analogiques/numériques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435

Annexe 3 – Choix du « bon » microcontrôleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439

Annexe 4 – Logiciels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441

Annexe 5 – Ressources. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443

Page 7: 978-2-86661-193-4 - microcontrôleurs PIC pour les débutants de

2.4 Différentes familles de PIC 11

La partie la plus « noble » du microcontrôleur est ce qu’on appelle la CPU (Central ProcessingUnit, unité centrale de traitement). C’est dans cette unité que se trouvent plusieurs éléments telsque l’ALU (Arithmetic and Logical Unit, unité arithmétique et logique) qui exécute une par unel’ensemble des instructions écrites dans le programme principal. Nous n’allons pas entrer plus loindans le fonctionnement du microprocesseur car il existe moult ouvrages sur le sujet. Faisons main-tenant un rapide tour des différentes familles de PIC.

2.4 Différentes familles de PICIl existe une grande quantité de références de PIC, du plus simple à huit broches au plus évolué àplusieurs dizaines de broches avec lequel on peut « presque tout faire ». Il est bien évident qu’onne va pas choisir la bête à tout faire sous prétexte que qui peut le plus peut le moins. Un PICmodeste suffit pour réaliser un chenillard à LED ou remettre sur pied une cafetière dont le cœur aprématurément cessé de battre. Et puis quand on débute, une manœuvre malheureuse sur uncomposant très coûteux laisse un arrière-goût autrement plus désagréable. Ce seul point n’est-ilpas une raison suffisante pour regarder ce qui se fait en bas de l’échelle ?

Voici un classement général des divers PIC proposés par Microchip (Microchip est le fabricant deces circuits intégrés) :

Il est facile de faire la confusion entre le nombre qui préfixe la référence du PIC (situé avant lalettre C, F ou L), l’architecture de son bus et le type de son cœur (là où sont exécutées lesinstructions) :

Il existe une famille de PIC un peu à part appelée DSC (Digital Signal Controller, contrôleur designal numérique) dans laquelle on trouve les dsPIC (dsPIC30 et dsPIC33) qui sont des circuitsarchitecturés sur 16 bits. Ces circuits sont dédiés à des applications de traitement du signal etcomportent à cet effet un DSP (Digital Signal Processing, processeur de signal numérique).

La règle d’or, quand on s’implique dans un nouveau domaine, est de ne pas avoir les yeuxplus gros que le ventre. Il est recommandé de commencer avec des projets simples, qui ontplus de chances de fonctionner rapidement. Il n’est pas très motivant de s’attaquer à ungros projet qu’on a toutes les peines du monde à terminer... dans l’hypothèse où on y

parvient ! S’il vous plaît, ne foncez pas tête baissée dans l’USB ou l’Ethernet avant d’avoirassimilé les principes élémentaires. Faire clignoter une LED n’est pas une maladie honteuse.

Microcontrôleurs (MCU)8 bits 16 bits 32 bits

PIC10, PIC12, PIC16, PIC18 PIC24 PIC32

Type de coeur12 bits 14 bits 16 bits

PIC10F2xx, PIC12F5xx, PIC16F5x PIC12F6xx, PIC16Fxxx, PIC16F6x, PIC16F7x

PIC17Cxx, PIC18Fxxx

PIC_02_1xcol.fm Page 11 Mercredi, 20. novembre 2013 3:11 15

Page 8: 978-2-86661-193-4 - microcontrôleurs PIC pour les débutants de

32 4. Présentation de mikroPascal

4.1.1 Structure d’un programme

Rappelons brièvement qu’un algorithme (programme complet) est composé de trois partiesdistinctes :✦ Entête – Il s’agit d’une simple ligne de code qui indique le nom du programme (de

l’algorithme) et qui commence par le mot réservé PROGRAM.✦ Déclarations – C’est l’endroit où l’on indique le nom des variables (emplacements mémoire

dont le contenu peut être amené à changer au cours de l’exécution du programme) et desconstantes (emplacements mémoire dont le contenu est fixé au démarrage et qui ne peuventpas être modifiés durant l’exécution du programme). C’est là aussi que l’on écrit lesprocédures et fonctions qui seront utilisées dans le corps du programme. Cette partie peut êtrelaissée vide, mais dans la pratique c’est plutôt rare.

✦ Corps du programme – C’est l’endroit où on utilise (met en application) les variables,procédures et fonctions précédemment déclarées. Cette section commence par le mot réservéBEGIN et finit par le mot réservé END. Entre ces deux mots, il y a forcément du code carsinon le programme ne fera rien du tout.

Par exemple, le code suivant est un programme complet appelé « je_ne_fais_rien », qui effective-ment ne fait absolument rien mais qu’on a tout à fait le droit d’écrire et qui d’ailleurs peut êtrecompilé sans erreur. La ligne qui commence par deux barres obliques est une ligne de commentaireet ne sera pas prise en compte par le compilateur.

Program je_ne_fais_rien;begin

// aucun code utile entre les mots réservés begin et end, // donc il ne se passera rien

end;

Une routine (procédure ou fonction) peut aussi être appelée un sous-programme, car il s’agit d’unbloc de code qui peut être utilisé une ou plusieurs fois depuis n’importe quel emplacement du pro-gramme principal (code situé entre begin et end). L’exemple précédent pourrait être étendu aucode suivant, qui n’en fait pas plus pour autant.

Program je_ne_fais_rien_2;

procedure Rien_de_rien;begin

// aucun code utile, procédure videend;

beginRien_de_rien; // appel d’une routine qui ne fait rien

end;

L’ordre des déclarations est important. Le code suivant ne peut pas être compilé car la procédureRien_de_rien_1 n’arrivera pas à localiser la procédure Rien_de_rien_2 qui est déclarée à sa suite :chaque ligne de code ne voit que ce qui est écrit avant elle (c’est le cas dans mikroPascal, mais pasdans Delphi, un autre logiciel qui permet d’écrire des programmes en Pascal).

PIC_04_1xcol.fm Page 32 Mercredi, 20. novembre 2013 3:13 15

Page 9: 978-2-86661-193-4 - microcontrôleurs PIC pour les débutants de

5.2 FOSC (Oscillator) – horloge/oscillateur 53

12F629 ne comporte pas de convertisseur analogique/numérique, sa broche OSC ne pourra pasêtre utilisée pour cet usage. Pour les autres PIC, le repérage est tout aussi rapide : broches 16 et 15pour le 16F628A (idem pour le bon vieux 16F84), broches 13 et 14 pour les 16F877 et 18F4550.En analysant un PIC 18F2420, on découvrirait que les broches OSC sont situées en broches 9 et 10.Maintenant que nous avons repéré nos broches attribuées à l’horloge, voyons comment lesutiliser... ou pas.

5.2.3 Différents modes d’horloge

Nous savons maintenant que le PIC propose plusieurs modes de fonctionnement de l’horloge quidépendent du type de l’oscillateur (interne ou externe, avec quartz ou réseau RC, etc.), reste à voircomment sélectionner celui qu’on veut utiliser. Le choix du mode d’horloge se fait en configurantles bits FOSCx (FOSC0, FOSC1, etc) dans le registre Config Word.

Exemples pour :

Figure 5.2.2.a – Le repérage des broches « oscillateur » ne pose généralement pas de problème, il suffit de chercher celles qui portent le terme OSC. Notez que selon le type de PIC, les broches « OSC » peuvent aussi servir de broche d’entrée/sortie. Quand cela est possible et si on le désire, on peut les libérer de leur fonction « oscillateur » en faisant fonctionner l’oscillateur interne.

PIC 16F628A PIC 18F2420bit 0 = FOSC0 (registre CONFIG) bit 0 = FOSC0 (registre CONFIG1H)

bit 1 = FOSC1 (registre CONFIG) bit 1 = FOSC1 (registre CONFIG1H)

bit 4* = FOSC2 (registre CONFIG) bit 2 = FOSC2 (registre CONFIG1H)

bit 3 = FOSC3 (registre CONFIG1H)

* oui, c’est bien le bit 4 et non pas le bit 2

PIC_05_1xcol.fm Page 53 Mercredi, 20. novembre 2013 4:15 16

Page 10: 978-2-86661-193-4 - microcontrôleurs PIC pour les débutants de

5.3 MCLR (Master Clear Reset) – Reset général 75

Tant que le bouton-poussoir SW1 est au repos (relâché), la tension sur la broche de reset corres-pond à l’état logique haut, grâce à la résistance de rappel (pull-up) R1. Quand on appuie sur lebouton-poussoir, la broche de reset est amenée à la masse (état logique bas) et le microcontrôleurredémarre (pour être plus précis, le redémarrage a lieu quand le bouton-poussoir est relâché).

Remarque : un reset effectué de façon automatique à la (re)mise sous tension est appelé POR(Power-On Reset). Certains PIC disposent d’un bit d’état précisément appelé POR qui indique siun reset a été provoqué par une (re)mise sous tension. Par exemple avec le 16F628A, il s’agit dubit #1 du registre PCON. Ce bit est à 0 si un reset a eu lieu suite à une remise sous tension, il està 1 dans le cas contraire (pas de reset, ou alors reset provoqué par un événement de nature diffé-rente). Pour pouvoir profiter à nouveau de ce bit d’information après qu’il soit passé à 0, il faut leremettre à 1 au moment de la réinitialisation qui suit la remise sous tension. Petite parenthèse :nous avons là un moyen très simple de réaliser un indicateur d’absence d’alimentation, avec unPIC et sans aucun autre composant externe (réfléchissez à ce qu’il faut mettre en œuvre pour faireun tel indicateur avec des composants traditionnels et vous verrez que l’idée n’est pas si farfelueque ça).

Lorsque la broche MCLR est affectée à la fonction d’entrée logique, la lecture de son état logiquese fait comme pour les autres broches d’entrée/sortie.

Figure 5.3.1.b – Ce type de câblage permet au PIC d’être réinitialisé à la mise sous tension ou sur action manuelle de l’utilisateur (pression sur le bouton-poussoir SW1). Pour que la broche MCLR puisse être utilisée en mode reset, le bit de configuration qui lui correspond doit avoir la bonne valeur. La diode D1 permet au condensateur C1 de se décharger rapidement quand l’alimentation disparaît, et la résistance R2 limite le courant de décharge de C1 dans la broche MCLR. Avec les valeurs données à R1 et C1, le temps de reset est de quelques ms, il peut être augmenté au besoin en donnant à C1 une valeur plus élevée (par exemple 1 µF ou 10 µF). Ce schéma peut être simplifié en supprimant C1 et D1, et en remplaçant R2 par un strap.

PIC_05_1xcol.fm Page 75 Mercredi, 20. novembre 2013 4:51 16

Page 11: 978-2-86661-193-4 - microcontrôleurs PIC pour les débutants de

116 6. Programmation d’un PIC

et RB7 (PGD) pour recueillir l’état d’un bouton-poussoir ou pour piloter une LED. Mais tous lescomposants reliés sur ces deux broches risquent fort de perturber le programmateur, aussi faut-ilpouvoir les isoler temporairement. Nous ajoutons donc une petite « mécanique d’isolementtemporaire » qui permet de « détacher » du PIC les composants qui pourraient semer le trouble, etce de façon très simple. Car voyez-vous, de simples cavaliers (jumpers) suffisent, voirfigure 6.5.1.b.

Dans la figure 6.5.1.b, la diode D1 évite que l’alimentation externe VDD fournie par le connecteurICSP ne remonte dans la totalité du circuit où se trouve le PIC, ce qui pourrait être dommageablepour le circuit lui-même ou pour le programmateur (problème possible de surintensité). Cettediode est de type Schottky et présente une chute de tension faible, elle ne perturbe pas le fonction-nement du PIC en régime normal (hors programmation). Les deux cavaliers JP1 et JP2 câblés surles lignes RB6 et RB7 permettent d’isoler le reste du circuit les lignes PGD et PGC du connecteurICSP, ce qui empêche tout conflit éventuel.

Remarque importante : la longueur du câble de liaison entre programmateur et circuit d’utilisa-tion finale (où est positionné le PIC à programmer) ne doit pas être excessive. Une grande longueurde câble peut conduire à des problèmes de programmation du composant. En mode HVP, la brocheMCLR doit passer rapidement de 0 V à 13 V, avant que le PIC ne commence à exécuter sa pre-mière instruction. S’il y a quelques années on pouvait se permettre d’utiliser un câble de longueurcomprise entre 30 cm et 1 m entre le programmateur et la carte cible, aujourd’hui mieux vaut serestreindre à une longueur de 10 ou 15 cm, surtout pour la programmation de PIC18, PIC24 oudsPIC. À ce propos, les câbles fournis par les fabricants avec leurs programmateurs sont devenusde plus en plus courts au fil des ans, ce n’est pas qu’une question d’économie...

6.5.1.1 Adaptateur ICSP vers support standard

Vous disposez d’un programmateur avec une connectique ICSP et sans support de circuit intégré,et vous aimeriez l’utiliser pour programmer un PIC prévu dans un montage où il n’y a pas deconnecteur ICSP ? Pour réaliser ce rêve, rien de plus simple. Il vous suffit de souder cinq fils entreun support classique de circuit intégré (DIL18 dans le cas qui nous concerne) et un connecteurà 5 points qui ira vers le programmateur. Voir schéma de la figure 6.5.1.1.a. Il vous faudra ensuiteenficher le PIC dans le support DIL18 et relier le connecteur ICSP sur le programmateur. Bien sûr,il faudra aussi lancer la procédure de programmation depuis votre logiciel préféré...

Envie de programmer un PIC autre que le 16F628A ? Notez l’emplacement des cinq brochesrequises pour la programmation et déplacez-les aux endroits adéquats, tout simplement !

Remarques :

✦ Plutôt qu’un fragile montage en l’air, préférez un petit bout de circuit imprimé, ça durera pluslongtemps.

✦ Si vous avez la chance de disposer d’une plaque d’expérimentation sans soudure, vous pouvezaussi la mettre à contribution pour programmer le PIC. Il suffit d’y réaliser les cinq liaisonsappropriées entre le programmateur et la plaque sans soudure.

PIC_06_1xcol.fm Page 116 Jeudi, 21. novembre 2013 7:43 07

Page 12: 978-2-86661-193-4 - microcontrôleurs PIC pour les débutants de

141

procedure Interrupt;begin

if PORTA.0 = 0 then // si LED éteinte, alors...PORTA.0 := 1 // allumage de la LED câblée sur la ligne #0 du port A

else // si LED allumée, alors...PORTA.0 := 0; // extinction de la LED

end;

Et là miracle... ça ne fonctionne toujours pas. Lors du premier changement d’état sur RB0,la LED s’allume bien, mais ensuite plus rien ne bouge. La raison ? L’interruption n’estdéclenchée qu’une seule fois parce qu’après le premier événement on a oublié de remettreà zéro le bit d’état correspondant. Cela est tellement important que c’est tout bonnement

indispensable ! Le code suivant fonctionne enfin comme attendu (la ligne de code qui man-quait est en gras).

procedure Interrupt;begin

if PORTA.0 = 0 thenPORTA.0 := 1 // allumage de la LED câblée sur la ligne #0 du port A

elsePORTA.0 := 0; // extinction de la LED

INTCON.INTF:= 0; // remise à zéro du bit d’état (Flag) INTF // (bit #1 du registre INTCON)

end;

Pour résumer, voici ce qu’il faut faire pour activer une interruption et la maintenir opérationnelle :✦ Activer le bit général des interruptions (GIE) ;✦ Activer le bit de l’interruption désirée (par exemple INTE ou RBIE) ;✦ Quand une interruption est déclenchée, effacer le bit d’état qui lui correspond (par exemple

INTF qui correspond à INTE, ou RBIF qui correspond à RBIE).

Remarque : dans l’exemple qui précède, nous sommes partis du principe qu’une interruption étaitdéclenchée lors d’un front montant sur la broche RB0 (passage de l’état logique bas à l’état logiquehaut). En fait, on peut spécifier si l’interruption RB0 survient lors d’un front montant ou d’un frontdescendant, grâce au bit de configuration INTEDG du registre OPTION (bit #6). Si ce bit est à 0,l’interruption sera déclenchée sur un front descendant (passage de l’état logique haut à l’étatlogique bas). Attention, ceci n’est valable que pour cette broche.

D’autres interruptions auxquelles on accède via d’autres registres nécessitent l’activation du bitPEIE présent dans le registre INTCON (bit #6). Il s’agit des interruptions déclenchées sur les évé-nements Timer1 (TMR1IE), Timer2 (TMR2IE), Capture/Compare/PWM (CCP1IE), comparateur(CMIE), émetteur et récepteur UART (TXIE et RCIE), écriture en EEPROM (EEIE). Cette listeest valable pour le 16F628A, d’autres PIC peuvent avoir plus ou moins de sources possiblesd’interruption, avec des conditions de mise en application un peu différentes.

Nous allons maintenant explorer quelques exemples pratiques, mais pas pour chaque sourced’interruption, ça ferait trop. Le principal est d’en comprendre le fonctionnement général, ce seraensuite pour vous une simple routine d’adapter ces exemples à d’autres cas.

PIC_07_1xcol.fm Page 141 Mercredi, 20. novembre 2013 3:23 15

Page 13: 978-2-86661-193-4 - microcontrôleurs PIC pour les débutants de

192 8. Utilisation des entrées/sorties

Le premier exemple de code associé au schéma de la figure 8.3.1.a a été écrit avec l’objectif d’allu-mer la LED au bout de cinq pressions distinctes sur le bouton-poussoir SW1. Pour cela, uncompteur (variable i de type octet) est incrémenté à chaque fois que l’entrée GP0 passe à 1 (ce quise produit quand on appuie sur SW1). Quand on appuie sur SW2, la LED s’éteint et le compteurest remis à zéro.

program PIC_MP_Capture_signaux_lents_001a;var

i: byte;begin

CMCON := 7;TRISIO := 00000011;GPIO := $00;i := 0;while true dobegin

if (GPIO.0 = 1) theninc(i);

if (i >= 5) then // allumage LED au bout de 5 pressions distinctesGPIO.2 := 1;

if GPIO.1 = 1 then // si SW2 enfoncé, on remet tout à zérobegin

i := 0; // reset compteurGPIO.2 := 0; // extinction LED

end;end;

end.

On exécute ce programme et on se rend compte que la LED s’allume à la première pression deSW1 et non au bout de la cinquième. Pourquoi ? Parce que l’analyse de l’état de la broche GP0 sefait en permanence dans la boucle while. Tant qu’on n’a pas appuyé sur SW1, la LED câblée surGP2 reste bien éteinte. Mais quand on presse SW1, la boucle while a le temps de s’exécuter un trèsgrand nombre de fois avant même qu’on ait relâché le bouton-poussoir. Le compteur i s’incré-mente à une vitesse telle qu’on n’a même pas le temps de s’en rendre compte : en fait, plus de30000 fois par seconde si le PIC est cadencé par son horloge interne à 4 MHz (ce qui est le casici) ! Autant dire qu’on peut toujours essayer de jouer à Lucky Luke, c’est perdu d’avance. Pourempêcher le compteur (variable i) de s’incrémenter de manière aussi sauvage, il faut bloquer lecomptage à partir du moment où le bouton est détecté comme étant enfoncé pour la première fois,attendre un certain temps (comme pour le fût du canon) pour s’affranchir de tout effet indésirablelié aux rebonds mécaniques, puis ensuite redonner l’autorisation de comptage dès que le boutonest relâché « pour de bon ». Le code suivant fait cela (modifications en gras).

program PIC_MP_Capture_signaux_lents_001b;var

i: byte;bOldState: boolean; // indicateur d’enfoncement du bouton-poussoir

beginCMCON := 7;TRISIO := 00000011;GPIO := $00;

PIC_08_1xcol.fm Page 192 Mercredi, 20. novembre 2013 3:33 15

Page 14: 978-2-86661-193-4 - microcontrôleurs PIC pour les débutants de

210 8. Utilisation des entrées/sorties

8.4.1 Comparaison de deux tensions externes

Si on veut comparer deux tensions externes, il faut commencer par faire un choix : lequel des deuxcomparateurs C1 ou C2 utiliser ? Eh bien cela dépend des broches dont vous avez besoin pour lesautres fonctions de votre montage. Si vous êtes un peu juste en nombre de broches, mieux vautlibérer les lignes RA0 et RA3 pour pouvoir les utiliser en entrées logiques, et donc utiliser lecomparateur C2. Le code qui suit fait usage du mode « CM2:CM0 = 101 » avec C2 comme seulcomparateur actif. L’état de la sortie du comparateur C2 est disponible via le bit C2OUT duregistre CMCON, il n’y a donc qu’à aller le lire et se servir de la valeur lue pour allumer ou éteindrela LED raccordée à la broche RA6.

program PIC_MP_Comparateurs_001a;

varOut_LED: sbit at RA6_bit;

beginCMCON := %00000101; // CMCON = 5TRISA := $0F;while true dobegin

Out_Led := CMCON.C2OUT; // C2OUT reflète l’état de la sortie du comparateur C2end;

end.

Eh bien oui, c’est tout. Oh, un petit détail... avant de parvenir au bit C2OUT du registre CMCON,l’état logique de la sortie du comparateur C2 peut être inversé. Dans ce cas :✦ elle se retrouve à l’état bas quand la tension appliquée sur son entrée non-inverseuse [+] est

supérieure à celle appliquée sur son entrée inverseuse [−], et ✦ elle se retrouve à l’état haut quand la tension appliquée sur son entrée non-inverseuse [+] est

inférieure à celle appliquée sur son entrée inverseuse [−]. Ce que j’ai dit avant n’est pas faux pour autant, il fallait juste compléter. Pour que l’inver-sion de l’état logique ait lieu, il faut mettre à 1 le bit C2INV du registre CMCON (la mêmesupercherie s’applique au comparateur C1 avec le bit C1INV). Comme ce petit truc meplaît, je le mettrai rapidement en application.

8.4.2 Comparaison d’une tension externe avec la tension de référence interne

Une tension de référence interne ? Ma foi, ça peut être bien pratique, oui. Quand on regarde lesdifférentes configurations que peuvent avoir les comparateurs, on constate avec effroi qu’une seuledonne accès à la tension de référence interne ; le choix, cette fois-ci, sera donc vite fait. Nous voicidonc contraints d’utiliser le mode « CM2:CM0 = 010 » pour lequel les entrées non-inverseuses [+]des deux comparateurs sont reliées en interne à la tension de référence Vref. Reste à trouver la pagede la feuille de caractéristiques qui explique comment configurer ce fameux module de référenceinterne Vref. Ah, ça y est, j’ai trouvé. Bigre, un chapitre rien que pour cette référence de tensioninterne ! C’est que la petite a droit à son propre registre VRCON, ça doit valoir le coup... Bon, il

PIC_08_1xcol.fm Page 210 Mercredi, 20. novembre 2013 3:34 15

Page 15: 978-2-86661-193-4 - microcontrôleurs PIC pour les débutants de

300 9. Gestion des données

beginiADC := ADC_Read(0); // lecture sur premier canal (#0) du convertisseur A/N// écriture bits de poids faible à l’adresse iAddrEEPROM_Write(iAddr, Lo(iADC));// écriture bits de poids fort à l’adresse iAddr+1EEPROM_Write(iAddr + 1, Hi(iADC));bSaved := true;

end;if PORTA.6 = 0 then

bSaved := false; // nouvelle autorisation écriture après relâchement du poussoirif Button(PORTA, 7, 100, 1) then // lecture depuis l’EEPROM et visu sur LED

beginLo(iADC) := EEPROM_Read(iAddr); // lecture EEPROM à l’adresse iAddrHi(iADC) := EEPROM_Read(iAddr + 1); // lecture EEPROM à l’adresse iAddr+1PORTB := Lo(iADC); // visualisation bits poids faible de iValue sur le port BPORTA.2 := iADC.8; // visualisation bit #0 de l’octet poids fort (bit #8 du mot)PORTA.3 := iADC.9; // visualisation bit #1 de l’octet poids fort (bit #9 du mot)end;

end;end.

Ce code de « mise au point progressive » n’aurait guère d’utilité dans un produit fini mais ilpermet de s’assurer que le module CAN et les accès en écriture et lecture dans l’EEPROMfonctionnent bien. Le code est donc succinct mais suffisant. Suffisant aussi pour se rendrecompte d’un beau gâchis de ressources : on monopolise deux octets (16 bits) pour 10 bitsutiles, et on perd 6 bits à chaque coup. Comme on peut le lire en bas des bulletins scolaires :

« Peut mieux faire ». Heureusement, vitaminé comme vous l’êtes, vous proposez déjà unesolution qui consiste à attendre d’avoir un paquet de quatre mesures successives avant de stoc-

ker le tout... dans 5 octets de mémoire et non dans 8, voir figure 9.1.3.b.

Bien entendu, toute liberté est donnée quant aux portions de bits à regrouper, ici on le fait avec lesbits de poids fort des mesures, on pourrait le faire avec les bits de poids faible. Le tout bien sûr estde procéder de la même façon à l’écriture et à la lecture dans l’EEPROM.

Figure 9.1.3.b – Une économie de ressource substantielle peut être obtenue en regroupant des bits « isolés » dans un seul octet. Quand on range bien ses affaires, on a plus de chances de les retrouver plus tard...

PIC_09_1xcol.fm Page 300 Mercredi, 20. novembre 2013 3:43 15

Page 16: 978-2-86661-193-4 - microcontrôleurs PIC pour les débutants de

9.6 Liaisons SPI et I2C 351

✦ Quand elles sont configurées en sortie, les lignes des PCF8574(A) peuvent débiter plus decourant à l’état bas qu’à l’état haut (25 mA à l’état bas et 300 µA à l’état haut). C’est pourquoiles LED sont câblées avec leur anode au +5 V.

Le code qui correspond à ce projet est le suivant.

program PIC_MP_Donnees_i2c_pcf8574_001a;

const//cPCF8574_W = $40; // adresse pour écriture PCF8574, non utilisée icicPCF8574_R = $41; // adresse pour lecture PCF8574cPCF8574A_W = $70; // adresse pour écriture PCF8574A//cPCF8574A_R = $71; // adresse pour lecture PCF8574A, non utilisée ici

varValues: byte;

function PCF8574_Read: byte;begin

I2C1_Start; // début de la communicationI2C1_Wr(cPCF8574_R); // envoi de l’adresse lecture PCF8574Result := I2C1_Rd(0); // lecture des états logiques des lignes du PCF8574I2C1_Stop; // fin de communication

end;

procedure PCF8574_Write(iVal: byte);begin

I2C1_Start; // début de la communicationI2C1_Wr(cPCF8574A_W); // envoi de l’adresse écriture PCF8574AI2C1_Wr(iVal); // écriture de l’état des lignes du PCF8574AI2C1_Stop; // fin de communication

end;

beginCMCON := $07; ADCON1 := ADCON1 or $0F; // désactivation des entrées analogiquesTRISA := $FF;TRISB := $00;I2C1_Init(100000); // initialisation du module MSSP pour I2Cdelay_ms(500);while true dobegin

Values := PCF8574_Read; // lecture des lignes du PCF8574 (entrées)Delay_us(250);PCF8574_Write(values); // écriture sur lignes PCF8574A (sorties)Delay_ms(100);

end;end.

Pour le PCF8574, l’adresse de base est $40 ; pour le PCF8574A, l’adresse de base est $70. Le PICeffectue en boucle deux actions : ✦ Lecture des états logiques sur les huit lignes du PCF8574 et mémorisation de ces états dans la

variable iValues (une variable de type octet suffit).

PIC_09_1xcol.fm Page 351 Mercredi, 20. novembre 2013 3:43 15