Cours d’info2 : microcontrôleur « mid-range » pic16fxxx Eric Nativel IUT Nîmes - GEII – S2 Année universitaire 2014 – 2015 processeur mémoire carte d’extension usb écran Bus de données Bus d’adresse Bus de contrôle série clavier, souris stockage de masse parallèle ethernet ->uC pic Processeur • CPU : Central Unit Processor == unité de traitement de données • == « cerveau » de tout système informatique • gère et contrôle les opérations arithmétiques et logiques des processus informatiques • Ne comprend que le langage binaire == suite de codes binaires uniques pour 1 type de processeur donné – Architecture CISC : jeu d’instructions puissantes non limités, temps d’exécution variable – Architecture RISC : jeu d’instructions réduits simple, temps d’exécution garanti et optimisé • Algorithme codé en assembleur premier langage informatique : – Assembleur correspondance mnémonique vers code binaire Ex: LD 0x12,w – bas niveau -> langage C, langage évolué Ex : printf(‘‘coucou‘‘); retour Contenu d’un CPU • Une UAL pour effectuer des opérations arithmétiques et logiques. • Un registre d'instruction associé à un décodeur permettant de décomposer et d'organiser l'exécution de l'instruction. • Un certain nombre de registres internes, pour stocker temporairement des données ou les bits de conditions. • Un système de gestion d'adresses, permettant la localisation des informations, qu'elles soient données ou instructions. • Un ensemble de Bus, permettant de véhiculer soit des données, Bus de données, soit des adresses, Bus d'adresse, soit des informations permettant de contrôler ces transferts, Bus de contrôle. Mémoires • Mémoire morte (Read Only Memory): garde le contenu en absence d’alimentation (non volatile), vitesse d’accès lente – ROM, PROM (vraiment « Read Only »), EPROM, EEPROM, UVPROM, flash • Mémoire vive (Random Access Memory) : perd le contenu de la mémoire en absence d’alimentation (volatile), vitesse d’accès rapide – RAM, DRAM, SRAM, MRAM (non volatile) retour Bus • Bus d’adresse : permet de sélectionner un composant selon son adresse sur le système • Bus de contrôle : permet de contrôler ces transferts • Bus de données : véhicule les données entre les différents composants du système retour Microcontrôleur / Microprocesseur • Microcontrôleur = processeur + mémoires + périphériques (module d’interface) Microcontrôleur : pic16f877 Microcontrôleur : pic16f877 structure pic16f877 Structure interne : pic16f877 Périphériques Mémoires CPU Horloge = Cœur Structure interne : pic16f877 (suite) ALU :Unité Arithmétique et Logique Format des instructions Organisation mémoire Architecture de Harvard != architecture de Von Neumann uC pic == Harvard modifié ! mémoire de programme et mémoire de données séparées •Mémoire de programme : stockage de programme, instruction codée sur 14 bits •Bus d’adresse sur 13 bits : 8192 adresses •PC : compteur de programme (13 bits) : « pointe » l’instruction suivante •Adresse de reset : 0000h •1 vecteur d’interruption @ adresse 0004h •Plage de stockage de programme découpée en zone de 2 ko •Stack == pile sur 8 niveaux : conserve les données du programme au moment d’un saut / appel à sous programme Mémoire de données contient les registres spécifiques de 8 bits + 368 octets de RAM Répartie sur 4 « banks » Registres permettent : • de configurer l’uC et les périphériques en positionnant des bits (écriture) • d’avoir une info sur l’état d’un périphérique ou le uC (lecture) Les entrées / sorties tout ou rien •Broches du pic sont multifonctions •Pic 16f877 : 33 I/Os TOR, réparties sur 5 ports A (6), B(8), C(8), D(8) et E(3) •Les broches sont bidirectionnelles, pas simultanément !! •Niveau logique – tension (niveau TTL) Niveau logique ou état « 1 » correspond à une tension en entrée ou en sortie de 5V Niveau logique ou état « 0 » correspond à une tension en entrée ou en sortie de 0V •2 registres (8 bits) par port gèrent les broches d’I/O individuellement : •TRISA, TRISB, TRISC, TRISD et TRISE : gèrent le sens des broches, configuration d’une broche en entrée ou en sortie •PORTA, PORTB, PORTC, PORTD et PORTE : écrit ou lit l’état d’une broche Mémoire de données Les entrées / sorties tout ou rien • registres TRISx : – registre sur 8 bits en mémoire de données – chaque bit du registre permet de configurer le sens de la broche correspondante • Niveau logique « 0 » positionné, la broche est configurée en sortie • Niveau logique « 1 » positionné, la broche est configurée en entrée Ex : broches 1,3, 5 et 7 en entrée les autres en sortie du port B Il faut configurer le registre TRISB Broche TRISB 0 0 Broche 1 1 Broche 2 0 Broche 3 1 Broche 4 0 Broche 5 1 Broche 6 0 Broche 7 1 ➔instructions en langage C : • Affectation globale du registre : TRISB = 0b10101010; ou TRISB=0xAA; ou TRISB=170; • Affectation bit à bit du registre : TRISBbits.RB0=0; TRISBbits.RB1=1; … Les entrées sorties tout ou rien Registres PORTx : •registre sur 8 bits en mémoire de données • chaque bit du registre permet de fixer (écriture) ou récupérer (lecture) l’état de la broche correspondante •Si la broche est configurée en sortie: Niveau logique « 0 » écrit, la broche a une sortie à 0V Niveau logique « 1 » écrit, la broche a une sortie à 5V •Si la broche est configurée en entrée: Si on applique 0V sur la broche, on lit l’état « 0 » Si on applique 5V sur la broche, on lit l’état « 1 » Ex : broche 1 du port B a été configurée en entrée (TRISB=0x01) et les autres en sortie ➔On ne peut donc pas écrire sur le bit représentant la broche 1 du port B, OK pour les autres sortie Led Programmation des entrées/sorties tout ou rien Instructions en C : • accès individuel des broches d’un port : • si on veut lire l’état d’une broche (broche1 du portB en entrée) : etat=PORTBbits.RB0; • si on veut écrire un état sur une broche (autres broches du portB en sortie) : PORTBbits.RB1=etat; • accès aux broches via le registre PORTx : PORTB= 0xFE; Techniques en C : • Masque : opération pour extraire un ou plusieurs bits dans un ensemble binaire Utilisation des opérateurs bit à bit « & » (ET) et « | » (OU) si var contient 13 ou 0b00001101 var & 4 équivaut à var & 0b00000100 : résultat vaut 0b0000100 (on ne garde que le bit 3) • Décalage : opérateur pour effectuer un décalage vers la droite « >> » ou la gauche « << » d’un certain nombre de rang si var contient 13 ou 0b00001101 var << 2 : résultat vaut 0b00110100, on décale le contenu de var de 2 bits vers la gauche Exemple de code #include <htc.h> #define _XTAL_FREQ 4000000 // déclaration horloge à 4 MHz __CONFIG(WDTE_OFF & LVP_OFF & FOSC_HS); // configuration des fusibles void main(void) { TRISA=0xF0; // configuration : broches RA5 entrée, RA0 à RA4 sortie while(1) // boucle infinie { PORTA=0x0D; // broche RA0, RA2, RA3 mis à 1 __delay_ms(500); if(PORTAbits.RA5==1) // si on impose un état « 1 » sur RA5 PORTAbits.RA0=0; // RA0 mis à 0 } } Fonctionnalités spéciales Bits de configuration hors zone mémoire (0x2007) Information fournie lors de la programmation de la cible seulement Directive à mettre dans le code source __CONFIG(); //macro avec mots clefs ci–dessous; composition possible avec opérateur « & » // selection de l’oscillateur // RC oscillator #define FOSC_EXTRC 0xFFFF // HS oscillator #define FOSC_HS 0xFFFE // XT oscillator #define FOSC_XT 0xFFFD // LP oscillator #define FOSC_LP 0xFFFC // autorisation du timer chien de garde « Watchdog » // WDT enabled #define WDTE_ON 0xFFFF // WDT disabled #define WDTE_OFF 0xFFFB // autorisation du timer d’allumage « Power-up » // PWRT disabled #define PWRTE_OFF 0xFFFF // PWRT enabled #define PWRTE_ON 0xFFF7 // autorisation reset Brown-out // BOR enabled #define BOREN_ON 0xFFFF // BOR disabled #define BOREN_OFF 0xFFBF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit // RB3/PGM pin has PGM function; low-voltage programming enabled #define LVP_ON 0xFFFF // RB3 is digital I/O, HV on MCLR must be used for programming #define LVP_OFF 0xFF7F // Data EEPROM Memory Code Protection bit // Data EEPROM code protection off #define CPD_OFF 0xFFFF // Data EEPROM code-protected #define CPD_ON 0xFEFF // Flash Program Memory Write Enable bits // Write protection off; all program memory may be written to by EECON control #define WRT_OFF 0xFFFF // 0000h to 00FFh write-protected; 0100h to 1FFFh may be written to by EECON control #define WRT_256 0xFDFF // 0000h to 07FFh write-protected; 0800h to 1FFFh may be written to by EECON control #define WRT_1FOURTH 0xFBFF // 0000h to 0FFFh write-protected; 1000h to 1FFFh may be written to by EECON control #define WRT_HALF 0xF9FF // In-Circuit Debugger Mode bit // In-Circuit Debugger disabled, RB6 and RB7 are general purpose I/O pins #define DEBUG_OFF 0xFFFF // In-Circuit Debugger enabled, RB6 and RB7 are dedicated to the debugger #define DEBUG_ON 0xF7FF // Flash Program Memory Code Protection bit // Code protection off #define CP_OFF 0xFFFF // All program memory code-protected #define CP_ON 0xDFFF Ex : __CONFIG(CP_OFF & BOREN_OFF & WDTE_OFF & PWRTE_ON & FOSC_HS ); Instructions • Horloge fixe traitement d’1 instruction • Fréquence d’horloge de DC à Fclock_max (20 MHz) • 1 instruction est décodée en 4 temps (4*Tosc) = 1 temps de cycle (1 Tcy) Q1 Q2 Q3 Q4 : : : : décodage d’instruction ou instruction NOP Lire les données de l’instruction ou NOP Ex : Fclock= 4 MHz ! 1 Tcy = 1 µs calcul écriture des données ou NOP Les timers • 3 timers / compteurs : registres qui s’incrémentent d’une unité chaque multiple d’1 Tcy • Registres accessibles en lecture ou écriture • Re-bouclage du comptage : …, 253, 254, 255, 0, 1, 2, … • Timer 0 : TMR0 = registre de 8 bits • Timer 1 : TMR1L et TMR1H = 2 registres de 8 bits • Timer 2 : fonctionne par comparaison entre TMR2 = registre de 8 bits et PR2 = registre de 8 bits ! comptage de 0 à 255 • Fonctionnement indépendant de l’UAL à comptage de 0 à 255 ! comptage de 0 à 65535 Timer0 •Configuration de OPTION_REG •Possibilité horloge externe sur RA4 •Pré-diviseur (pr): multiplication du Tcy •Pré-diviseur partagé avec le chien de garde (watchdog) •Calcul de valeur de TMR0 pour rebouclage tv=TMR0*Tcy*pr Timer0 : option register Ex : OPTION_REG = 0x01; horloge interne pré-diviseur associé à Timer0 pré-division à 4 Si Horloge fixée à 4 MHz Si temps de comptage Tv = 500 µs !TRM0 = 125 Timer1 TMR1 = TMR1L+TMR1H*256 Timer2 • Fonctionne par comparaison entre le registre TMR2 et PR2 Lors d’1 égalité ! remise à 0 du registre TRM2 • Présence d’un post-diviseur : activation du drapeau TMR2IF retardée (voir chapitre interruption) Ex : • horloge à 4 MHz • T2CON = 0x05; • PR2 = 125; La fréquence de remise à 0 de TMR2, Fraz= 2 kHz Exemples de code #include <htc.h> #define _XTAL_FREQ 4000000 #include <htc.h> #define _XTAL_FREQ 4000000 void main (void) { OPTION_REG=0x01; TRISA=0x00; while(1) { TMR0=0; PORTA=0xFF; while(TMR0<125); TMR0=0; PORTA=0x00; while(TMR0<125); } } void main(void) { OPTION_REG=0x01; TRISA=0x00; while(1) { TMR0=255-125; while(T0IF!=1); T0IF=0; PORTA=0xFF; TMR0=130; while(T0IF!=1); T0IF=0; PORTA=0; } }