Vous êtes sur la page 1sur 24

Exercices

Exercices 7 :

1) On veut réaliser un signal carré avec le PIC 16F887. Le signal va être sur le bit 0 du
PORTC. Proposer un programme en assembleur afin d’assurer ce signal.
2) Si on vous dit que le signal d’horloge externe du PIC est à une fréquence de 4Mhz.
Proposer le programme qui assure une fréquence de 100Khz pour le signal désiré.

Exercices 8 :
Nous désirons allumer la LED lorsque nous pressons le bouton, et l’éteindre lorsque nous le
relâchons. On considère un bouton poussoir sur le pin RA3 et la LED branchée sur le pin RC0. On
utilise ici le uC 16F887.

Donner le programme assembleur pour gérer ceci.


Configuration initiale :
+acceder au registres : choix de bank (Adressage directe) : RP1,RP0 (status)

BSF STATUS, RP0 ; choix de


BCF STATUS, RP1 ; bank1 pour pouvoir acceder aux TRISx
BCF TRISC, 0 ; mettre bit0 de trisc à 0 (utiliser RC0 comme sortie)
BCF STATUS, RP0 ; revenir au bank 0
BCF PORTC, 0 ; initialisation à 0 du bit0 du portC
; programme
Boucle BSF PORTC, 0 ; 1Tcy en mettant le RC0 à 1
NOP ; 1Tcy sans rien faire
NOP ; 1Tcy sans rien faire
NOP ; 1Tcy
NOP ; 1Tcy
BCF PORTC, 0 ; 1Tcy en mettant le RC0 à 0
NOP ; 1Tcy F=1/T
NOP ; 1Tcy
Goto Boucle ; 2Tcy

RC0

BSF
1
BSF 2xNOP
BCF Goto
0
Ts = 10 Tcy
Ts/2 = 5Tcy Ts/2=5Tcy
Fp=F/4=1Mhz

Tp = 1us = Tcy

F/4
Div uP
F uC

RC0
F=4Mhz

Fs = 100Khz

Ts = 1/Fs
= 10 us
Ts = 10 Tcy
Exemple de programme complet
Exemple 1 : sans interruptions

List p=16f887, r=dec ; Type de PIC et format de fichier (Hex) , radix


include p16f887.inc ; Bibliothèque des instructions pour le PIC16F887
__Config 2007h, 0x23E4 ; 14bits => mid range (ROM) 72ms
__Config 2008h, 0x3EFF ; 14bits seulement 3 bits
Constante1 Equ D'129' ; Définition des constantes
Var1 Equ H'0C' ; Définition des Variables
Org H'00' ; Début du programme (ligne non obligatoire)
; ICI ON MET
; LES INSTRUCTIONS
; A EXECUTER
MOVLW 7 ; comme si on a fait 07h ou H’7’ mnt on a 7 = D’7’ = .7
End ; Obligatoire pour indiquer la fin du programme
Exemple de programme complet
Exemple 2 : avec interruptions
Compilation
List p=16f887, r=dec ; Type de PIC 16F887 et format de fichier (Hex)
include p16f887.inc ; Bibliothèque des instructions pour le PIC16F887

Gestion de
Org H'00' ; Début du programme dans la ROM (ligne non obligatoire) mémoire
; qq instruction 6 != 6h programme

goto Debut ; On va au label "Debut"


Org H'04' ; Adresse d'interruption ← PC Routine
d’interruption
MOVF 0x40, w ; Ici on met le programme à exécuter en cas d’interruption
ADDLW 10 ;
RETFIE ; fin d’interruption, on revient à l’endroit où le programme s’est interrompu
Debut ; Label du début du programme principal
BSF STATUS, RP0 ; choix de
Réponse au
BCF STATUS, RP1 ; bank1 pour pouvoir acceder aux TRISx
exercice 7 -2
BCF TRISC, 0 ; mettre bit0 de trisc à 0 (utiliser RC0 comme sortie)
BCF STATUS, RP0 ; revenir au bank 0
; … la suite dans la page suiavnte
Exemple de programme complet
Exemple 2 : avec interruptions

; suite du programme :

BCF PORTC, 0 ; initialisation à 0 du bit0 du portC


; programme de signal carre
Boucle BSF PORTC, 0 ; 1Tcy en mettant le RC0 à 1
NOP ; 1Tcy sans rien faire Réponse au
NOP ; 1Tcy sans rien faire exercice 7 -2
NOP ; 1Tcy
NOP ; 1Tcy
BCF PORTC, 0 ; 1Tcy en mettant le RC0 à 0
NOP ; 1Tcy
NOP ; 1Tcy
Goto Boucle ; 2Tcy
End ; Obligatoire pour indiquer la fin du programme
Interruptions / Timers
La première chose que fait le microcontrôleur à l’arrivée d’une demande d’interruption
consiste à exécuter l’instruction en cours, puis à arrêter l’exécution normale du
programme. Immédiatement après, l'adresse actuelle de la mémoire du programme est
automatiquement insérée dans la pile et l'adresse par défaut du vecteur d’interruption
(prédéfinie par le fabricant) est écrite dans le compteur du programme.
Interruptions / Timers
Cet emplacement à partir duquel le programme continue l'exécution est appelé le vecteur
d'interruption. Pour le microcontrôleur PIC16F887, cette adresse est 0004h. Comme le
montre la figure précédente, l'emplacement contenant le vecteur d'interruption est
transmis lors de l'exécution normale du programme. Une partie du programme en cours
d'activation lorsqu'une demande d'interruption arrive s'appelle la routine d'interruption. Sa
première instruction est située sur le vecteur d'interruption à l’adresse 0004h.

La durée de ce sous-programme et son fonctionnement dépendent des compétences du


programmeur et de la source d’interruption elle-même. Certains microcontrôleurs ont plus
de vecteurs d'interruption (chaque demande d'interruption a son vecteur), mais dans ce
cas, il n'y en a qu'un. Par conséquent, la première partie de la routine d'interruption
consiste en une reconnaissance de source d'interruption. Enfin, lorsque la source
d’interruption est reconnue et que la routine d’interruption est exécutée, le microcontrôleur
atteint l’instruction RETFIE, extrait l’adresse de la pile et poursuit l’exécution du
programme là où elle s’est arrêtée.
Interruptions / Timers
GIE : Global interrupt Enable
Sources d’interruptions : IE : Interrupt Enable ; IF : Inter. Flag
Interruptions / Timers

Sur le 16F887, l'es interruptions sont classées en deux catégories, les interruptions
primaires et les interruptions périphériques. Elles sont gérées par les registres :


Toutes les interruptions peuvent être validées/interdites par le bit INTCON,GIE

Toutes les interruptions périphériques peuvent être validées/interdites par le bit
INTCON,PEIE

Chaque interruption peut être validée/interdite par son bit de validation individuel
→ En résumé, pour valider une interruption périphérique (par exemple), il faut
positionner 3 bits, GIE, PEIE et le bit individuel de l’interruption.
Interruptions / Timers
Validation TMR0 Vérifier le déclenchement de l’interruption

INTCON = b’ 1 0 1 0 0 0 0 0’


Toutes les interruptions peuvent être validées/interdites par le bit INTCON,GIE

Toutes les interruptions périphériques peuvent être validées/interdites par le bit
INTCON,PEIE

Chaque interruption peut être validée/interdite par son bit de validation individuel
→ En résumé, pour valider une interruption périphérique (par exemple), il faut
positionner 3 bits, GIE, PEIE et le bit individuel de l’interruption .
Interruptions / Timers
Timers :
Principe de fonctionnement

Rôle : Réaliser une temporisation


Élément essentiel : Compteur qui s'incrémente à chaque front montant du signal qui lui est appliqué :

Lorsque le compteur dépasse la valeur maximale qu'il peut contenir (par exemple : 256 pour un
compteur sur 8 bits), un drapeau (flag en anglais) se lève. TMR0 : taille de 8 bit => 0 - 255
Interruptions / Timers
Timers :
Méthodes de configuration

Un Timer doit pouvoir compter un temps défini par le programme (par exemple 1ms, 10ms, 50ms,
etc.). Pour cela, 2 paramètres peuvent être modifiés :


La fréquence du signal appliqué au compteur : Le compteur s'incrémentera ainsi plus ou moins vite.


Le nombre d'impulsions à compter : Le drapeau se lève toujours lorsqu'il y a débordement, on peut
donc faire partir le compteur d'une valeur non nulle pour réduire le temps de comptage.

=> Modification de la fréquence du signal appliqué au compteur : le pré-diviseur (prescaler en anglais)


Te Te Te Te

Ts

Exemple : pour compter 4 fois moins vite


Interruptions / Timers
Timers :
Méthodes de configuration

Modification du nombre d'impulsions à compter



Si le compteur démarre à 0, il mettra beaucoup de temps à atteindre sa valeur maximale.


Pour réduire le temps de comptage, on peut donc charger une valeur initiale non nulle dans le
compteur.

Exemple : Valeur initiale égale à TMR0 = 250 => Temps consommé ?


Interruptions / Timers
Timers : timers du PIC16F887
Composition générale d'un Timer sur un microcontrôleur PIC :

/2
8MHz 2Mhz 1MHz 1MHz / nbr_imp

Tq=1/8 us 4/8 us 1us T= 1us*nbr=nbr us


Calcul du temps « T » mis par le Timer pour faire lever son drapeau :
Tmax = Tq*4*256*256

Les Timers sont internes au microcontrôleur. Le 16F887 possède 3 timers:

– Timer0 et Timer2 sur 8 bits – Timer1 sur 16 bits


Interruptions / Timers
Timers : timers du PIC16F887
Chien de garde
Composition du Timer0

Pré-compteur
reglable

Registre du Drapeau du
timer0 (8bits) timer0 dans
INTCON
Interruptions / Timers
Timers : timers du PIC16F887
Composition du
Timer0
 Le pré-diviseur peut prendre une valeur parmi la liste suivante : 1, 2, 4, 8, 16, 32, 64, 128 ou
256.

 La valeur initiale peut prendre n'importe quelle valeur entière comprise entre 0 et 255.

Temps maximum :


Configurer le pré-diviseur le plus grand : 256


Démarrer le compteur avec la valeur la plus petite possible: 0
Interruptions / Timers
Timers : timers du PIC16F887
Exemple: Calcul d'un temps de 10ms
Interruptions / Timers
Timers : timers du PIC16F887
Registre de configuration du Timer0 : OPTION_REG

Source externe
d’oscillation via
RA4
Interruptions / Timers
Timers : timers du PIC16F887
Registre de configuration du Timer0 : OPTION_REG

Source externe
d’oscillation via
RA4
Interruptions / Timers
Timers : timers du PIC16F887
Registre de configuration du Timer0 : OPTION_REG

PSA - Bit d'affectation de pré-diviseur :


PS2 PS1 PS0 TMR0 WDT
1 - Le prédiviseur est affecté au WDT.
0 - Le prédiviseur est attribué au Timer0 0 0 0 1:2 1:1
0 0 1 1:4 1:2
Registres associés au Timer0 : 0 1 0 1:8 1:4
0 1 1 1:16 1:8
TMR0: c'est le registre de comptage. C'est donc 1 0 0 1:32 1:16
dans ce registre que nous allons rentrer la valeur 1 0 1 1:64 1:32
de départ de notre compteur. 1 1 0 1:128 1:64

INTCON : seuls les bits 7, 6, 5 et 2 sont utiles 1 1 1 1:256 1:128


pour le Timer0.
Interruptions / Timers
Timers : timer0 du PIC16F887
Exercice 0 : On prend Fquartz = 8MHz
On tenant compte de tout ce qui précède donner la temporisation maximale qu’on peut
réaliser avec le timer0.
Exercice 1 : Temporisation de 2 ms avec le timer 0.
1) Quels sont les registres nécessaires pour exploiter le compteur TIMER0
Rép→ INTCON=> activation ; TIMER0 : TMR0=> initialisation ; OPTION_REG=> définir
le prédiviseur ; IOCB : pas de PORTB !
2) Calculer les valeurs du prescaler et du compteur nécessaire pour obtenir une
temporisation de 1 ms.
3) Donner la configuration des registres du TIMER0.
4)Rép→ TMR0 = 6 ; OPTION_Reg = b’10000011’ ; INTCON = b’10100000’
Exercice 2 : Temporisation de 15 ms avec le timer 0.
1) Re-calculer les valeurs du prescaler et du compteur nécessaires pour obtenir cette fois
une temporisation de 15 ms.
2) Donner la configuration des registres du TIMER0.
Interruptions / Timers
Interruption externe : RB0 / PORTB
Interruptions / Timers
Interruption externe : RB0 / PORTB

Vous aimerez peut-être aussi