3643 KK 5766
3643 KK 5766
3643 KK 5766
TP ATR :
Introduction :
Nous avons étudié en cours l’architecture des microcontrôleurs PIC et leur mode de
programmation. L’objectif de ce TP est de mettre en pratique la partie théorique afin de
concrétiser les concepts étudiés. A cette fin, nous tenterons d’utiliser la carte PICmicro
Education Board II comme interface d’un programme que nous réaliserons pour le
microcontrôleur.
Présentation du matériel :
Le Microcontrôleur :
La carte d’interface :
C’est la fonction de l’Education Board II, celle ci permet en effet de communiquer avec
le PIC via un clavier de boutons, un ensemble de LEDS, un écran LCD, des potentiomètres et
des capteurs de température.
Dans ce TP, nous utiliserons les LEDS et les boutons.
Attention : l’alimentation doit être comprise entre 7 et 12 volts mais nous avons constaté
qu’en dessous de 10 ou si le courant n’est pas assez important, la carte a des difficultés à
fonctionner.
Le programmeur :
Les logiciels :
ICPROG sera utilisé pour charger les fichiers .hex générés par MPLAB.
Il est tout d’abord nécessaire de présenter la structure d’un programme assembleur pour
MPASM :
LIST P=16F877
#include "P16F877.INC"
__CONFIG _BODEN_ON&_CP_OFF&_WRT_ENABLE_ON&_PWRTE_ON&_WDT_OFF&_HS_OSC…
init BSF STATUS , RP0 ;Page d'Adresse 1 -> on a accès aux TRIS (CF M14)
.
.
.
int RETFIE
END
Comme vous pourrez le voir sur le schéma de la carte, les huit LEDS sont montées en
sortie des huit pattes du port :
Il suffit donc de mettre un bit sur le registre PORTC afin d’obtenir une tension de 5
volts sur la patte correspondante, mais pour cela, il faut tout d’abord le configurer en sortie
car les ports sont configurés comme entrées par défaut.
Le registre TRISC est utilisé pour définir les entrées sorties des ports. Le nième bit du
registre définit la qualité d’entrée ou sortie de la nième ligne du port correspondant, un 0
comme Output représentant une sortie et un 1 comme Input, une entrée (1 par défaut).
Le registre PORTC sera donc mis à 0 afin de pouvoir agir sur les LEDS.
Nous sommes maintenant assez balaises pour écrire le programme. Le premier groupe
qui me rend un truc nickel aura la chance de voir son programme exécuté sur la carte sur sa
propre paillasse. Ouaaaah.
LIST P=16F877
#include "P16F877.INC"
__CONFIG
_BODEN_ON&_CP_OFF&_WRT_ENABLE_ON&_PWRTE_ON&_WDT_OFF&_HS_OSC&_DEBUG_OFF&_CPD_OFF&_LVP_OFF
; Début du programme
init BSF STATUS , RP0 ;Page d'Adresse 1 -> on a accès aux TRIS (CF M14)
CLRF INTCON ;Mise à 0 du vecteur d'interruption -> pas d'interruptions (CF M20)
int RETFIE
END ;!!!Ne pas oublier
• Utiliser MPLAB :
Nous avons un IDE de professionnel, autant ne pas le négliger, voici la marche à suivre
pour éditer et compiler le programme :
• Utiliser ICPROG :
Une fois le PIC programmé remettez le sur la carte en prenant les précautions
susmentionnées.
Voilà, ça fonctionne. Nous allons maintenant tenter d’allumer cette LED en appuyant
sur un bouton.
Une question peut être ? Comment fonctionnent ces boutons ? C’est très simple :
Ils sont câblés en matrice de trois colonnes (seulement les trois colonnes de droite, les
autres ne sont pas câblés de la même façon) et de quatre lignes. Les sorties RA2 RA5 et RC2
sont multiplexées (0 = select) avec les entrées RB1 RB2 RB3 RB4 qui sont mises à 1 par un
pull up interne. Le fait de presser un bouton provoque une sortie multiplexée qui met le
courant à 0.
Heu un petit schéma et ça ira mieux vous verrez :
En gros, si RA2 est à 0 et S3 enfoncé alors RB4 est à 0 et c’est tout ce qu’on veut savoir
pour l’instant.
Nous sommes maintenant en mesure de comprendre le programme suivant :
Afin de détecter le bouton, nous utiliserons le polling : méthode qui consiste à tester en
boucle le registre correspondant.
LIST P=16F877
#include "P16F877.INC"
__CONFIG
_BODEN_ON&_CP_OFF&_WRT_ENABLE_ON&_PWRTE_ON&_WDT_OFF&_HS_OSC&_DEBUG_OFF&_CPD_OFF&_LVP_OFF
; Dédut du programme
init BSF STATUS , RP0 ;Page d'Adresse 1 -> on a accès aux TRIS (CF M14)
CLRF INTCON ;Mise à 0 du vecteur d'interruption -> pas d'interruptions (CF M20)
BCF OPTION_REG,7 ;Mise à 0 du bit 7 d'option (CF M19) (The big @#¤$ truc de fouine)
BSF PORTC,2 ;
BSF PORTA,5 ;
BCF PORTA,2 ;Teste la troisième colonne
int RETFIE
END
Le premier qui finit a encore une fois le droit d’exhiber, hum, son programme devant
tout le monde. Et gagne un BN.
Comme vous savez tout sur les interruptions, inutile de vous dire que dans notre cas
suffisent les bits 3 et 7 d’INTCON soit le bit associé au PORTB et le général.
LIST P=16F877
LIST r=dec,x=on,t=off
#include "P16F877.INC"
__CONFIG
_BODEN_ON&_CP_OFF&_WRT_ENABLE_ON&_PWRTE_ON&_WDT_OFF&_HS_OSC&_DEBUG_OFF&_CPD_OFF&_LVP_OFF
; Variables
cblock H'20'
W_TEMP ;Nous aurons besoin de variables afin de
STATUS_TEMP ;stocker les registres susceptibles d'être modifiés lors de l'interruption
endc
; Dédut du programme
org 0000h
goto init
ORG 0004h
goto int
init BSF STATUS , RP0 ;Page d'Adresse 1 -> on a accès aux TRIS
BCF TRISA,2
BCF TRISA,5
movlw B'00011110' ;Met les bits 1 à 4 du port B en entrée
movwf TRISB
MOVLW b'10001000'
MOVWF INTCON
boucle clrwdt
MOVLW b'10101010'
MOVWF PORTD ;On allume 4 des LEDS
BSF PORTC,2 ;
BSF PORTA,5 ;
BCF PORTA,2 ;Teste la troisième colonne
goto boucle
int clrwdt
BTFSS INTCON,0 ;On teste la provenance de l'interruption
CLRF INTCON ;on inhibe les IT
movwf W_TEMP
swapf STATUS,W ;On sauve tout dans la RAM
movwf STATUS_TEMP ;On peut le faire aussi ans la pile mais pas là :)
MOVLW b'01010101'
MOVWF PORTD
boucle2 clrwdt ;A vous de comprendre
BTFSS PORTB,4 ;vous êtes pas des moules
goto boucle2
END
Maintenant vous savez tout et il vous reste un peu de temps pour mettre vos
connaissances à profit :
Celui qui écrit le programme le plus original et le plus beau remporte le paquet de
BN !!!
Par exemple : un programme pourra afficher différentes séquences sur les LEDS selon
le bouton enfoncé.