Derghal Smail - Timer Pic 16F84
Derghal Smail - Timer Pic 16F84
Derghal Smail - Timer Pic 16F84
Département d’Electrotechnique
Master 1/ Electrotechnique
TPL N°1
Le Timer 0
PIC 16F84
Préparer par :
DERGHAL Smail
Prof : Kamel.Messoudi
2013 -2014
La dénomination PIC est sous copyright de Microchip. donc Un PIC est microcontrôleur
de marque Microchip.
Les PIC sont des composants dits RISC (Reduced Instructions Set Computer), ou
encore composant à jeu d’instructions réduit. Pourquoi ? Et bien, sachez que plus on réduit le
nombre d’instructions, plus facile et plus rapide en est le décodage, et plus vite le composant
fonctionne.
Tous les PIC Mid-Range ont un jeu de 35 instructions, et exécutent chaque instruction
(sauf les sauts) en 1 cycle.
L’horloge fournie au PIC® est prédivisée par 4 au niveau de celui-ci. C’est cette base de
temps qui donne la durée d’un cycle. Si on utilise par exemple un quartz de 4MHz , on
obtient donc 1000000 de cycles/seconde
B. Problème
For me, I want to make a digital clock by using PIC 16F84. my professor ‘k.Messaoudi’
teach us the principles of making a program for PIC 16F84, and let us to learn the other
HIDDEN SECRETS.
and here my problem was began!
When I start this project, I collide with a Big wall:
HOW CAN I DETERMINE THE ‘TIME’ IN THIS PIC ?
- En premier lieu, nous pouvons compter les impulsions reçues sur la pin RA4/TOKI.
Nous dirons dans ce cas que nous sommes en mode compteur .
- Nous pouvons aussi décider de compter les cycles d’horloge de la PIC elle-même.
Dans ce cas, nous compterons donc en réalité du temps. Donc, nous serons en
mode « timer ».
La sélection d’un ou l’autre de ces deux modes de fonctionnement s’effectue par le bit 5
du registre OPTION : T0CS
T0CS = 1 : Fonctionnement en mode compteur
T0CS = 0 : Fonctionnement en mode timer
Dans le cas où nous décidons de travailler en mode compteur, nous devons aussi
préciser lors de quelle transisition de niveau le comptage est effectué. Ceci est précisé grâce
au bit 4 du registre OPTION : T0SE pour Timer0 Source Edge select bit.
7 6 5 4 3 2 1 0
81h OPTION_REG RBPU INEDG T0CS T0SE PSA PS2 PS1 PS0
7 6 5 4 3 2 1 0
0Bh INTCON GIE EEIE T0IE INTE RBIE T0IF INTF RBIF
3) Le mode d’interruption
C’est évidemment le mode principal d’utilisation du timer0. En effet, lorsque T0IE est
positionné dans le registre INTCON, chaque fois que le flag T0IF passe à 1, une interruption
est généree.
Un prédiviseur indique le nombre de pulses qui devra être reçu pour provoquer une
incrémentation de la destination.
explication :
1°/ On calculer le nombre de débordement de tmr0 nécessaires.
Nous avons besoin d’une temporisation de 500 ms, soit 500.000µs.
Le timer0 génère, sans prédiviseur, une interruption toutes les 256µs . Nous allons donc
utiliser le prédivideur.
Si nous prenons la plus grande valeur disponible, une interruption géner toutes les 65536µs.
Nous devrons donc passer :
(500.000/65536) = 7,63 fois dans notre routine d’interruption.
nous choisirons 7 ou 8 fois (avec une erreur de temporisation).
On choisit 7 fois :
Le temps obtenu sera donc en réalité de (65536*7) = 458752 µs au lieu de nos 500.000µs
Donc, une déclaration d’une variable dans la zone 0X0C :
bit 7 6 5 4 3 2 1 0
OPTION_REG RBPU INEDG T0CS T0SE PSA PS2 PS1 PS0
1 0 0 0 0 1 1 1
bit 7 6 5 4 3 2 1 0
INTCON GIE EEIE T0IE INTE RBIE T0IF INTF RBIF
1 0 1 0 0 0 0 0
And Now we go to
Our Fichier ASM (.asm)
#include <p16F84.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
;ASSIGNATIONS
;-------------------------
;DEFINE
;--------------
#DEFINE LED PORTA,2 ; LED
;MACRO
;-------------
BANK0 macro
bcf STATUS , RP0 ; passer banque0
endm
BANK1 macro
bsf STATUS , RP0 ; passer banque1
endm
;DECLARATIONS DE VARIABLES
;----------------------------
; ROUTINE INTERRUPTION
;--------------------------------------------------------------
;sauvegarder registres
;---------------------
org 0x004 ; adresse d'interruption
movwf w_temp ; sauver registre W
swapf STATUS,w ; swap status avec résultat dans w
movwf status_temp ; sauver status swappé
;restaurer registres
;-------------------
restorereg
swapf status_temp,w ;swap ancien status, résultat dans w
movwf STATUS ; restaurer status
swapf w_temp,f ; Inversion L et H de l'ancien W
; sans modifier Z
swapf w_temp,w ; Réinversion de L et H dans W
; W restauré sans modifier status
retfie ; return from interrupt
; INTERRUPTION TIMER 0
;-----------------------------------------------------------
inttimer
decfsz cmpt,f ; décrémenter compteur de passages
return ; pas 0, on ne fait rien
BANK0 ; par précaution
movlw b'00000100' ; sélectionner bit à inverser
xorwf PORTA , f ; inverser LED
movlw TIMEBASE ; pour nouveaux passages
movwf cmpt ; dans compteur de passages
return ; fin d'interruption timer
; INITIALISATIONS
;**************************************************************
init
clrf PORTA ; Sorties portA à 0
clrf PORTB ; sorties portB à 0
BANK1 ; passer banque1
movlw OPTIONVAL ; charger masque
movwf OPTION_REG ; initialiser registre option
; initialisations variables
; -------------------------
movlw TIMEBASE ; charger base de temps
movwf cmpt ; initialiser compteur de passages
; PROGRAMME PRINCIPAL
;**************************************************************
start
C. Résultats et discussion
At last, The problem of timing (seconds, minuts,hours) is solve BUT i found many other
problems when I make this document; to become necessary knowing this:
les interruptions, les registres (OPTION, INTCON), les instructions (xorwf, swapf, retfie),
DECLARATIONS DE VARIABLES ,les MACRO and others.
D. Conclusion
À la fin Le PIC16F84 est un microcontrôleur possède 13 entrées/sorties (5 dans le port A
et 8 dans le port B). Chaque entrée/sortie est configurable individuellement (en entrée ou
bien en sortie).
Pour réaliser un projet qui a besoin un horloge ou bien un temporisation, Timer0
donner la solution, donc TMR0 (TiMeR zero) :
C’est le registre de contrôle de l’horloge interne (timer) du microcontrôleur. Ce
timer peut soit fonctionner seul, soit être précédé par un pré diviseur programmable à 8 bits
dont la programmation se fait par l’intermédiaire du registre OPTION. Ce registre peut être lu
et modifié à tout moment, soit pour connaître sa position courante, soit pour le déclencher à
partir d’une valeur déterminée.
Une quelconque opération d’écriture dans ce registre met automatiquement à zéro le
comptage en cours dans le pré diviseur. Se rappeler que le timer compte sur 8 bits, et
qu’une fois que le comptage est arrivé à FF, celui-ci revient à 00 (ce qui provoque le passage
à 1 du bit 2 du registre INTCON appelé T0IF).
E. Références
Les sites INTERNET ( 99 % from INTERNET )
Datasheet PIC16F84