TD : PIC 16F84 (introduction)
Exercice 1 :
Dans un microcontrôleur PIC16F84A :
a) quel est l’élément qui sert à indiquer l’adresse de la prochaine instruction à exécuter ? b) où doit se situer le programme qui est exécuté à la mise sous tension?
c) quelle la durée d’un cycle (Tcy) pour exécuter une instruction si le PIC16F84A est piloté par un cristal de 4 MHz?
d) où doivent se situer les données utilisées par le programme?
e) quelle est la longueur d’une instruction en bits?
f) quelle est la longueur d’une donnée dans la mémoire programme?
Exercice 2 :
Expliquer le fonctionnement des instructions mov suivantes : 1. movlw k
2. movwf f 3. movf f,d
a. movf X,w b. movf X,f
Exercice 3 :
Expliquer le fonctionnement des instructions arithmétiques suivantes : 1. addlw k
2. addwf f,d
a. addwf X,w b. addwf X,f 3. sublw k 4. subwf f,d
a. subwf X,w b. subwf X,f 5. incf f,d
6. decf f,d
Exercice 4 :
1) Expliquer le fonctionnement des instructions de test sur bit suivantes : a) BTFSC f,b
b) BTFSS f,b c) DECFSZ f,d <
d) INCFSZ f,d
2) Expliquer le fonctionnement des instructions suivantes : a) GOTO k (GOTO étiquette)
b) CALL k et RETURN
3) Expliquer le fonctionnement des instructions suivantes : a) RLF f,d
b) RRF f,d c) SWAPF f,d
Exercice 5 :
1) Exécuter les instructions suivantes et donner les états successifs.
2) Exécuter les instructions suivantes et donner les états successifs.
Exercice 6 :
1) Le PORTA du schéma suivant est configuré en sortie, que doit être le contenu du registre TRISA ?
2) On désire réaliser à l’aide du PIC 16F84A un jeu de lumière qui permet de faire les séquences suivantes :
a) Donner le schéma électronique
b) comment doit-être configuré le port A ?et quel sera le contenu du registre TRISA ? c) donner la suite des données qu’il faut envoyer sur le port A pour réaliser le jeu de lumière désiré.
Exercice 7 :
Soit le montage suivant :
(visualiser les états des sorties avec des LED)
« :LED-Off :LED-ON »
On suppose que le montage réalise un compteur décimal de 0 à 9999 et que l’état du compteur est 1356.
a. comment doit-être configuré le port B ?et quel sera le contenu du registre TRISB ? b. pour afficher le 6 sur l’afficheur U, que doit-on avoir sur le port B ?
c. compléter le tableau suivant pour afficher le 5 sur l’afficheur D, le 3 sur l’afficheur C et le 1 sur l’afficheur M.
TD 2 : PIC 16F84
Exercice 1 :configuration des ports
Exercice 2 :génerateur d’un signal carré
Ecrivez un programme en assembleur pour génerrer un signal carré sur le portb0 (voir la figure ci-dessous).
Réaliser le sous programme de temporisation à base de deux boucle imbriquées et la duré de cette tempo est 250ms.
Exercice 3 : clignotement de deux leds
Titre du programme : PROG1
Ce programme fait clignoter un certain nombre de fois la LED branchée sur la sortie RB0 (bit 0 du PORTB), puis fait clignoter un certain autre nombre de fois la LED branchée sur la sortie RB1 (bit 1 du PORTB), et recommence le cycle indéfiniment.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DECLARATIONS DES VARIABLES +
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++
COMPT1 EQU 0X0C ; On met la variable COMPT1 à l’adresse RAM 0C.
COMPT2 EQU 0X0D ; On met la variable COMPT2 à l’adresse RAM 0D.
……… ………… ………… ; On met la variable N_FOIS à l’adresse RAM 0E.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Programme principale +
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ORG 0005
……… STATUS, RP0 ; Accès à la BANK1 ………..…. ……….. ; PORTB en SORTIE ………. ……….. ; Retour à la BANK0
Maine1 MOVLW 2 ; On définit le nombre de cycles de la ……… N_FOIS ; première phase (ici : 2 clignotements) LED1 ………... PORTB, 0 ; LED éteinte car l’instruction
……… ……… ; Appelle le sous-programme (TEMPO).
BSF ……… ; LED allumée, car l’instruction
……….. ……… ; On appelle le sous-programme TEMPO ……… N_FOIS, 1 ; Décrémente le nombre de cycles et tester GOTO LED1 ; affectés à LED1, et si le compteur GOTO Maine2 ; n’est pas arrivé à 0, effectue un Nouveau cycle. Si par contre N_FOIS Est à 0, l’instruction « GOTO LED1 » Le programme saute à«Maine2 ».
MAIN2 MOVLW 5 ; On définit le nombre de cycles de la MOVWF N_FOIS ;deuxième phase (ici : 5 clignotements) LED2 ……….. ……….. ; LED éteinte car l’instruction
CALL TEMPO ; Appelle le sous-programme (TEMPO).
………….. ……….. ; LED allumée, car l’instruction CALL TEMPO ; On appelle à nouveau le TEMPO DECFSZ N_FOIS, 1 ; Décrémente le nombre de cycles GOTO LED2 ; affectés à LED2, et si le compteur GOTO MAIN1
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; SOUS-PROGRAMME de TEMPORISATION
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TEMPO MOVLW 255 ; Charge COMPT2 (« grande boucle ») MOVWF ……… ;avec la valeur décimale 255.
DELAI2 MOVLW 255 ; Charge COMPT1 (« petite boucle ») MOVWF ……….. ;avec la valeur décimale 255.
DELAI1 ………….... COMPT1, 1 ; Décrémente COMPT1et - s’il n’est pas ……… DELAI1 ;à zéro - va à DELAI1
……… COMPT2, 1 ; Décrémente COMPT2, et s’il n’est pas ……… DELAI2 ;à zéro, va à DELAI2.
……… ; retour au programme principale.
END ; Fin du programme.
Exercice 4 :bac de dégraissage
Fonctionnement
:Un chariot se déplace sur un rail et permet, en se positionnant au-dessus d'une cuve, de nettoyer des pièces contenues dans un panier en les trempant dans un bac de dégraissage.
Cycle détaillé :
Quand le chariot est en haut à gauche et que l'on appuie sur le bouton de départ du cycle (dcy), le chariot va au-dessus du bac de dégraissage.
Le panier descend alors dans ce bac où on le laisse 10 secondes.
Après cette attente, le panier remonte.
Après cela, le chariot va jusqu'à l'extrême droite où il sera déchargé.
Quand le déchargement est terminé, le système revient dans sa position de départ.
Remarque :
Le chargement et le déchargement du panier s'effectuent manuellement. Le contrôle du fait que le panier est déchargé sera donc validé par un bouton poussoir d.
1) Donner l’organnigramme de fonctionnement de ce système.
2) Ecrire le programme en assembleur : a) Donner la configuration des ports
b) Donner la configuration de TMR0 (on va utilisé les résistance pull up de portb) c) Donner le sous programme de temporisation àl’aide de TMR0
Capteur Description entrées
S1 Chariot à gauche PORTB0
S2 Charito au centre PORTB1
S3 Chariot à droite PORTB2
S4 Chariot en haut PORTB3
S5 Chariot en bas PORTB4
S6 Chariot chargé PORTB5
S7 Chariot vide PORTB6
Pré Actionneur description Sortie
KM1A Aller vers la droite PORTA0
KM1B Aller vers la gauche PORTA1
KM2A Monter le chariot PORTA2
KM2B Descentre le chariot PORTA3
1
TD 3: PIC 16F84
Exercice 1 :
Titre du programme : PROG1
Ce programme fait clignoter un certain nombre de fois la LED branchée sur la sortie RB0 (bit 0 du PORT B), puis fait clignoter un certain autre nombre de fois la LED branchée sur la sortie RB1 (bit 1 du Port B), et recommence le cycle indéfiniment.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DECLARATIONS DES VARIABLES +
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++
COMPT1 EQU 0X0C ; On met la variable COMPT1 à l’adresse RAM 0C.
COMPT2 EQU 0X0D ; On met la variable COMPT2 à l’adresse RAM 0D.
……… ………… ……… ; On met la variable N_FOIS à l’adresse RAM 0E.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Programme principale +
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ORG 0005
……… STATUS, RP0 ; Accès à la BANK1 ………..…. ……….. ; PORTB en SORTIE ………. ……….. ; Retour à la BANK0
Maine1 MOVLW 2 ; On définit le nombre de cycles de la ……… N_FOIS ; première phase (ici : 2 clignotements) LED1 ………... PORTB, 0 ; LED éteinte car l’instruction
……… ……… ; Appelle le sous-programme (TEMPO).
BSF ……… ; LED allumée, car l’instruction
……….. ……… ; On appelle le sous-programme TEMPO ……… N_FOIS, 1 ; Décrémente le nombre de cycles et tester GOTO LED1 ; affectés à LED1, et si le compteur
GOTO Maine2 ; n’est pas arrivé à 0, effectue un Nouveau cycle. Si par contre N_FOIS Est à 0, l’instruction « GOTO LED1 »
2
Le programme saute à«Maine2 ».
MAIN2 MOVLW 5 ; On définit le nombre de cycles de la MOVWF N_FOIS ;deuxième phase (ici : 5 clignotements) LED2 ……….. ……….. ; LED éteinte car l’instruction
CALL TEMPO ; Appelle le sous-programme (TEMPO).
………….. ……….. ; LED allumée, car l’instruction CALL TEMPO ; On appelle à nouveau le TEMPO DECFSZ N_FOIS, 1 ; Décrémente le nombre de cycles GOTO LED2 ; affectés à LED2, et si le compteur GOTO MAIN1
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; SOUS-PROGRAMME de TEMPORISATION
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TEMPO MOVLW 255 ; Charge COMPT2 (« grande boucle ») MOVWF ……… ;avec la valeur décimale 255.
DELAI2 MOVLW 255 ; Charge COMPT1 (« petite boucle ») MOVWF ……….. ;avec la valeur décimale 255.
DELAI1 ……… COMPT1, 1 ; Décrémente COMPT1et - s’il n’est pas ……… DELAI1 ;à zéro - va à DELAI1
……….. COMPT2, 1 ; Décrémente COMPT2, et s’il n’est pas ……… DELAI2 ;à zéro, va à DELAI2.
……… ; retour au programme principale.
END ; Fin du programme.
3
Exercice 2 :
Titre du programme : PROG 2
Ce programme fait clignoter une LED en utilisant les interruptions générées par le timer interne (TMR0).
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DECLARATIONS +
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SAVE_W EQU 0X0C ;Déclaration de SAVE_STAT EQU 0X0D ;deux variables.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; VECTEURS +
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ORG 0000h ;Vecteur de Reset.
GOTO START
ORG ……… ;Vecteur d’interruption.
GOTO INT_VECT
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; INITIALISATIONS
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
START ORG 0005h
……….. ……… ; On passe en Page 1.
……… ………. ; PortB en sortie
MOVLW ………. ; On configure OPTION.
………. OPTION_REG .Le pré diviseur divise par 255.
…………... ……….. ;On revient en Page 0.
MOVLW ……… ;On configure INTCON.
……… INTCON ; - GIE (bit 7) à 1 ; - T0IE (bit 5) à 1
; - tous les autres bits à zéro.
CLRF TMR0 ; Timer à zéro.
CLRF PORTB ; Toutes LED éteintes.
LOOP GOTO LOOP ; Boucle introduite juste pour occuper
4
;le processeur, car le but du programme ;est d’attendre l’apparition du signal ;d’interruption.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; PROGRAMME d’INTERRUPTION
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
INT_VECT MOVWF SAVE_W ;Phase de PUSH (store).
MOVF STATUS, W ;On sauve le Registre W MOVWF SAVE_STAT ;ainsi que le Registre STATUS.
BCF ………., ……… ;On met à zéro le flag ;T0IF qui passe à 1 à chaque ;débordement du TMR0 (bit 2).
BTFSC PORTB,0 GOTO LED_OFF
…………. PORTB,0 ;On allume la LED RB0.
GOTO FIN
LED_OFF …………. PORTB, 0 ; On éteint la LED RB0.
FIN MOVF SAVE_STAT, W ;Phase de POP (restore).
MOVWF STATUS ;On remet en place le MOVF SAVE_W, W ; Registre STATUS, ainsi ;que le Registre W.
……… ;Lorsqu’une interruption est générée, END ;le PIC met automatiquement à zéro le ;bit GIE du Registre INTCON pendant ;toute la durée d’exécution du ;sous-programme d’interruption