cours d'info2 : microcontrôleur « mid-range » pic16fxxx

15
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 écran clavier, souris stockage de masse usb série parallèle ethernet Bus de données Bus d’adresse Bus de contrôle ->uC pic

Upload: dangthuan

Post on 05-Jan-2017

239 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: Cours d'info2 : microcontrôleur « mid-range » pic16fxxx

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

écran

clavier, souris

stockage de masse

usb

série

parallèleethernet

Bus de données Bus d’adresse Bus de contrôle

->uC pic

Page 2: Cours d'info2 : microcontrôleur « mid-range » pic16fxxx

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.

Page 3: Cours d'info2 : microcontrôleur « mid-range » pic16fxxx

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

Page 4: Cours d'info2 : microcontrôleur « mid-range » pic16fxxx

Microcontrôleur / Microprocesseur• Microcontrôleur = processeur + mémoires

+ périphériques (module d’interface)

Microcontrôleur : pic16f877

Page 5: Cours d'info2 : microcontrôleur « mid-range » pic16fxxx

Microcontrôleur : pic16f877

structure pic16f877

Page 6: Cours d'info2 : microcontrôleur « mid-range » pic16fxxx

Structure interne : pic16f877

Périphériques

CPU

Mémoires

Horloge = Cœur

Structure interne : pic16f877 (suite)

Page 7: Cours d'info2 : microcontrôleur « mid-range » pic16fxxx

ALU :Unité Arithmétique et Logique

Format des instructions

Page 8: Cours d'info2 : microcontrôleur « mid-range » pic16fxxx

Organisation mémoireArchitecture 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)

Page 9: Cours d'info2 : microcontrôleur « mid-range » pic16fxxx

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 0

Broche 1

Broche 2

Broche 3

Broche 4

Broche 5

Broche 6

Broche 70 1 0 1 0 1 0 1TRISB

➔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; …

Page 10: Cours d'info2 : microcontrôleur « mid-range » pic16fxxx

Les entrées sorties tout ou rienRegistres 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

Led

sortie

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

Page 11: Cours d'info2 : microcontrôleur « mid-range » pic16fxxx

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écialesBits de configuration hors zone mémoire (0x2007)

Page 12: Cours d'info2 : microcontrôleur « mid-range » pic16fxxx

// 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

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 « & »

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 : décodage d’instruction ou instruction NOP Q2 : Lire les données de l’instruction ou NOP Q3 : calcul Q4 : écriture des données ou NOP

Ex : Fclock= 4 MHz ! 1 Tcy = 1 µs

Page 13: Cours d'info2 : microcontrôleur « mid-range » pic16fxxx

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 à comptage de 0 à 255

• Timer 1 : TMR1L et TMR1H = 2 registres de 8 bits ! comptage de 0 à 65535

• 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

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

Page 14: Cours d'info2 : microcontrôleur « mid-range » pic16fxxx

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

Page 15: Cours d'info2 : microcontrôleur « mid-range » pic16fxxx

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

void main (void) { OPTION_REG=0x01; TRISA=0x00; while(1) { TMR0=0; PORTA=0xFF;

while(TMR0<125); TMR0=0; PORTA=0x00; while(TMR0<125); } }

#include <htc.h> #define _XTAL_FREQ 4000000

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; } }