TP Initiation à la programmation du µC PIC 16F84A
en Mikro C
I) Objectifs :
Le présent TP a pour but la programmation des ports d’entrée sortie A et B. En premier
lieux on verra allumage en séquence de 8 leds relie au port B, puis on introduira la
programmation des microcontrôleurs avec le langage C afin de permettre allumage en
séquence de 8 leds relie au port B de bas au haut et vice-versa à l’aide de boutons poursois.
On présentera aussi le logiciel Mikro C pour création de projet.
II) Manipulations
Premier partie : Allumage en séquence de 8 leds relie au port B
Ecrire dans MPLAB le programme suivant en langage assembleur
Avec Proteus, schématiser vos circuits et charger le fichier généré en *.hex dans le
PIC
Deuxième partie : Allumage en séquence de 8 leds relie au port B de bas au haut
ou vice-versa à l’aide de boutons poursois.
Ecrire dans mikroC le programme suivant en langage C
Avec Proteus, schématiser vos circuits et charger le fichier généré en *.hex
dans le PIC
III) Présentation le logiciel Mikro C.8-2 pour création de projet
Le mikroC PRO pour PIC organise des applications dans des projets, composé d'un seul
fichier de projet (extension. mcppi) avec un ou plusieurs fichiers sources (extension).
La meilleure façon de créer un projet c’est à l'aide de l'assistant nouveau projet,
(menu Project> New Project ) ou en cliquant sur l'icône nouveau projet à partir de la
barre d'outils du projet.
1
Commencez par donner un nom dans Project Name, dans notre cas TP 1.
2
Par la suite, spécifiez l'emplacement où votre projet sera enregistré.
Dans la fenêtre description vous pouvez ajouter une description du projet à
réaliser.
Dans la rubrique DEVICE sélectionné le type du microcontrôleur sur lequel
vous travaillez, faut saisir aussi la valeur de fréquence de l'oscillateur 4MHZ
(Oscilateur XT, et le WDT si nécessaire)
Dernière étape - Cliquez sur ok pour créer votre nouveau projet
A ce stade, une nouvelle fenêtre vide s’affiche afin que vous pussiez y
saisir votre programme
3
ALLUMAGE 8 LEDS EN SEQUENCE
RADIX DEC
INCLUDE "P16F84.INC"
ORG
COUNT_1 EQU 0C ;Counter
COUNT_2 EQU 0D ;Counter
SORTIE EQU 0E
CARRY EQU 00 ;Carry bit
4
ALLUMAGE 8 LEDS EN SEQUENCE AVEC 2 BOUTTONS
radix hex
INCLUDE"P16F84.INC"
COUNT_1 EQU 0C ;Compteur
COUNT_2 EQU 0D ;Compteur
PIC84 EQU 03FF ;
CARRY EQU 00
SORTIE EQU 0E
ORG PIC84
GOTO INIT ;aller à INIT
INIT ORG 0000H
MOVLW 00 ;En W, nombre 0
TRIS PORTB ;Port B configuré comme sortie
MOVLW 0FF
TRIS PORTA ;Port A configuré comme entrée
MOVLW 0FF ;En W, nombre 255
MOVWF COUNT_1 ;COUNT_1 en W
MOVLW 0FF
MOVWF COUNT_2
MOVLW 01
MOVWF SORTIE ;SORTIE = 1
;Programme principal
MOVF SORTIE,1 ;En W, sortie
MOVWF PORTB ;Sortie en PORT_B
CALL DELAY ;Routine de retard
MAIN BTFSS PORTA,3 ;Bouton P1 pressé?
CALL UP ;Si oui, la routine UP
BTFSS PORTA,5 ;Bouton P2 pressé?
CALL DOWN ;Si oui, la routine DOWN
CALL DELAY
clrwdt
GOTO MAIN
UP BCF 0PTION,CARRY ;La remise à zéro du bit carry C
RLF PORTB ;tourner à gauche
BTFSS STATUS,CARRY ;Est ce la dernière position?
RETURN ;Si non, returne
RRF PORTB ;Si oui,la condition initiale
RETURN ;Return
DOWN BCF STATUS,CARRY ;La remise à zéro du bit carry C
RRF PORTB ;tourner à droite
BTFSS STATUS,CARRY ;Est ce la dernière positione ?
RETURN ;Si non, returne
RLF PORTB ;Si oui,la condition initiale
RETURN ;Return
;Routine de retard
DELAY DECFSZ COUNT_1,1 ;Décrémente COUNT_1
GOTO DELAY ;Si on n'a pas 0, aller à DELAY
MOVLW 0FF
MOVWF COUNT_1 ;Recharge COUNT_1
DECFSZ COUNT_2,1 ;Décrémente COUNT_2
GOTO DELAY ;Si on n'a pas 0, aller à DELAY
MOVLW 0FF
MOVWF COUNT_1 ;Recharge COUNT_1
MOVLW 0FF
MOVWF COUNT_3 ;Recharge COUNT_2
RETURN ;aller au programme principal
End
void main() 5
{
unsigned char J = 1;
TRISB = 0; // PORTB est configure en
sortie
ALLUMAGE 8 LEDS EN SEQUENCE
a) lumage en séquence de 8 LED relie au port B
ALLUMAGE 8 LEDS EN SEQUENCE AVEC 2 BOUTTONS
void main()
unsigned char J = 1;
unsigned char a = 0x80;
TRISB = 0; // PORTB est configure en sortie
for(;;) // Boucle sans fin
while(PORTA.f0=1)
PORTB = J; // Envoyer J au PORTB
Delay_ms(100); // Pause 100 ms
J = J << 1; // Décalage à gauche J
if(J == 0) J = 1;
while(PORTA.f1=1)
PORTB = a; // Envoyer J au PORTB
Delay_ms(100); // Pause 100 ms
a = a >> 1; // Décalage à gauche J
if(a == 0x00 ) a = 0x80;
} // Si la dernière LED, allumer la 1èreLED
}
TP n° : 03