10 Exercices – PIC 16F84
Sciences d’Ingénieur – 2ème BAC STE
Exercice 1 : Configuration des ports
Écrire un programme pour configurer :
a) RA0-RA2 en entrées et RA3-RA4 en sorties
b) RB0-RB3 en sorties et RB4-RB7 en entrées
Solution :
BSF STATUS, RP0 ; Aller en Bank1
MOVLW b’00000111′ ; RA0-RA2 inputs, RA3-RA4 outputs
MOVWF TRISA
MOVLW b’11110000′ ; RB0-RB3 outputs, RB4-RB7 inputs
MOVWF TRISB
BCF STATUS, RP0 ; Retour Bank0
Exercice 2 : Clignotement LED
Programmer un clignotement de la LED sur RB0 avec un délai de 500ms.
Utiliser une boucle pour le délai (1 cycle ≈ 1μs à 4MHz).
Solution :
LIST p=16F84
INCLUDE “P16F84.INC”
ORG 0x000
GOTO main
main
BSF STATUS, RP0
MOVLW b’00000000′
MOVWF TRISB
BCF STATUS, RP0
boucle
MOVLW 0x01
XORWF PORTB,F ; Inverser RB0
CALL delai500ms
GOTO boucle
delai500ms
MOVLW .200
MOVWF compteur1
boucle1
MOVLW .250
MOVWF compteur2
boucle2
NOP
DECFSZ compteur2,F
GOTO boucle2
DECFSZ compteur1,F
GOTO boucle1
RETURN
END
Exercice 3 : Lecture bouton
Écrire un programme qui allume RB7 quand RA0 est à 1.
Sinon, éteindre RB7.
Solution :
LIST p=16F84
INCLUDE “P16F84.INC”
ORG 0x000
GOTO main
main
BSF STATUS, RP0
MOVLW b’00000001′ ; RA0 input
MOVWF TRISA
MOVLW b’00000000′ ; RB output
MOVWF TRISB
BCF STATUS, RP0
boucle
BTFSC PORTA,0
GOTO allumer
BCF PORTB,7
GOTO boucle
allumer
BSF PORTB,7
GOTO boucle
END
Exercice 4 : Compteur binaire
Réaliser un compteur binaire de 0 à 15 sur RB0-RB3.
Incémenter toutes les secondes.
Solution :
CBLOCK 0x0C
compteur
ENDC
ORG 0x000
GOTO main
main
BSF STATUS, RP0
MOVLW b’00000000′
MOVWF TRISB
BCF STATUS, RP0
CLRF PORTB
boucle
INCF PORTB,F
CALL delai1s
GOTO boucle
Exercice 5 : Timer0
Configurer Timer0 pour générer une interruption toutes les 10ms.
Prédiviseur 1:256, horloge 4MHz.
Solution :
ORG 0x000
GOTO main
ORG 0x004
BCF INTCON, T0IF ; Effacer flag
MOVLW .100 ; Valeur initiale
MOVWF TMR0
RETFIE
main
BSF STATUS, RP0
MOVLW b’00000111′ ; Prédiviseur 1:256
MOVWF OPTION_REG
BCF STATUS, RP0
MOVLW .100
MOVWF TMR0
BSF INTCON, GIE
BSF INTCON, T0IE
Calcul : 4MHz → 1μs/cycle → 256μs/increment → 256*100 = 25,6ms
Exercice 6 : Séquence lumineuse
Créer une séquence sur RB0-RB3 : 0001 → 0010 → 0100 → 1000 → répéter.
Délai entre chaque étape : 250ms.
Solution :
ORG 0x000
GOTO main
main
BSF STATUS, RP0
MOVLW b’00000000′
MOVWF TRISB
BCF STATUS, RP0
MOVLW 0x01
MOVWF PORTB
boucle
RLF PORTB,F
BTFSS PORTB,4
GOTO suite
MOVLW 0x01
MOVWF PORTB
suite
CALL delai250ms
GOTO boucle
Exercice 7 : Interruption RB0
Configurer RB0 en interruption sur front descendant.
Inverser RB7 à chaque interruption.
Solution :
ORG 0x000
GOTO main
ORG 0x004
BTFSS INTCON, INTF
RETFIE
BCF INTCON, INTF
MOVLW b’10000000′
XORWF PORTB,F
RETFIE
main
BSF STATUS, RP0
MOVLW b’00000001′
MOVWF TRISB
BSF OPTION_REG, INTEDG ; Front descendant
BCF STATUS, RP0
BSF INTCON, GIE
BSF INTCON, INTE
GOTO $
Exercice 8 : Lecture EEPROM
Lire l’adresse 0x10 de l’EEPROM et afficher sur PORTB.
Solution :
ORG 0x000
GOTO main
main
BSF STATUS, RP0
MOVLW 0x10
MOVWF EEADR
BCF STATUS, RP0
BSF STATUS, RP1
BSF EECON1, RD
BCF STATUS, RP1
MOVF EEDATA,W
MOVWF PORTB
GOTO $
Exercice 9 : Sous-programmes
Créer un sous-programme “multiplication” qui multiplie deux nombres 8 bits.
Entrées : N1 (0x20), N2 (0x21) – Sortie : RES (0x22-0x23).
Solution :
CBLOCK 0x20
N1, N2, RESL, RESH
ENDC
multiplication
CLRF RESH
MOVF N1,W
MOVWF RESL
MOVLW .8
MOVWF compteur
boucle_mul
BTFSS N2,0
GOTO pas_add
MOVF N1,W
ADDWF RESH,F
pas_add
RRF N2,F
RLF N1,F
DECFSZ compteur,F
GOTO boucle_mul
RETURN
Exercice 10 : Système complet
Créer un système avec :
– Bouton sur RA0 (interruption)
– LED clignotante sur RB0 (Timer0)
– Affichage du nombre d’appuis sur RB1-RB4
Solution :
CBLOCK 0x0C
compteur_appuis
ENDC
ORG 0x000
GOTO main
ORG 0x004
BTFSC INTCON, INTF
CALL bouton_appuye
BTFSC INTCON, T0IF
CALL timer_interrupt
RETFIE
bouton_appuye
BCF INTCON, INTF
INCF compteur_appuis,F
MOVF compteur_appuis,W
MOVWF PORTB
RETURN
timer_interrupt
BCF INTCON, T0IF
MOVLW .100
MOVWF TMR0
MOVLW 0x01
XORWF PORTB,F
RETURN
main
BSF STATUS, RP0
MOVLW b’00000001′
MOVWF TRISA
MOVLW b’00000000′
MOVWF TRISB
BCF OPTION_REG, INTEDG
MOVLW b’10000111′
MOVWF OPTION_REG
BCF STATUS, RP0
MOVLW .100
MOVWF TMR0
BSF INTCON, GIE
BSF INTCON, T0IE
BSF INTCON, INTE
GOTO $