PIC 16f887 - Ivan FRANCOIS

Download Report

Transcript PIC 16f887 - Ivan FRANCOIS

TP microcontrôleurs PIC 16f887
TP
Manipulation des timers
Compteur sur 4*7 segments
1. Dans les cas suivants, faire clignoter la led (PORTB.3) sur une période T. Mesurer la période sur
l’oscilloscope à l’aide des curseurs ou en simulation avec le « stop watch »
Debugger/select tools/Mplab sim
Debugger/ setting/ oscillateur/ 3.2768 Mhz
Debugger/ stop watch
1.1. T=160 ms, utilisation du timer0
Programme T0_160.c
1.2. T=100 ms, utilisation du timer0
Programme T0_100.c
1.3. T=1 s, utilisation du timer0
Programme T0_1000.c
1.4. T=0,5 s, utilisation du timer1
Programme T1_500.c
1.5. T=100 ms, utilisation du timer1
Programme T1_100.c
2. Programme affiche_7_seg.c
Récupérer le programme permettant d’afficher un nombre (fixé dans le programme) entre 0000 et
9999 sur l’afficheur 4*7 segments. Etablir la partie affichage des 4 digits en sous-programme.
3. Programme compteur_7_seg.c
A partir des programmes T1_100.c et affiche_7_seg.c, établir, sur l’afficheur 4*7 segments, un
compteur de 0000 à 9999 au rythme de 1/10e de seconde (timer au choix).
Centaine
Dizaine
1
Unité
Dixième
TP microcontrôleurs PIC 16f887
TP
Voltmètre numérique
1 Objectif
Affichage d’une tension réglable entre 0 et 5V sur l’afficheur 4*7 segments.
Utilisation du convertisseur analogique numérique intégré au PIC (datasheet p.99).
PORTD
Envoi du code 7
segments
+5V
tri
m
2
AN2
Tension
continue
variant de
0 à 5V
Pic
16F887
.
RC4
.
RC2
.
RC1
.
RC0
PORTC
Sélection du digit
2 Principe de fonctionnement
Le pic 16f887 contient un convertisseur analogique numérique interne. Ce convertisseur permet de
transformer une tension analogique en une valeur numérique sur 8 ou 10 bits. Cette conversion prend
un certain temps qui dépend de l’horloge du pic.
Par défaut, la tension à convertir est comprise entre 0 et 5V (tension d’alimentation du pic) mais elle
peut aussi être choisie avec une alimentation externe.
3 Choix de l’entrée analogique
Le pic 16f887 dispose de 14 canaux d’entrée analogiques (AN0 à AN13). Sur la carte, c’est l’entrée
AN2 qui est choisie. Cette entrée est reliée à un potentiomètre permettant de faire varier la tension sur
AN2 entre 0 et 5V.
L’entrée analogique AN2 étant la même que PORTA2, elle peut lire des données analogiques ou
numérique (0 ou 5V). Il faut ici la régler pour lire des données analogiques grâce au registre ANSEL
(p.40). Le TRISA.2 doit être en entrée (lecture).
Donner la valeur du registre ANSEL
2
TP microcontrôleurs PIC 16f887
4 Réglage des registres ADCON0 et ADCON1 (p.104)
4.1 Registre ADCON0
Ce registre doit être réglé en début de programme afin de sélectionner le canal 2 (entrée AN2) et de
régler le temps de conversion adéquat pour un oscillateur de 4Mhz.(Fosc/8).
Donner la valeur du registre ADCON0
4.2 Registre ADCON1
Ce registre doit être réglé en début de programme afin de référencer la conversion sur l’alimentation
du pic (0 – 5V).
On souhaite utiliser la conversion sur 10 bits en allant chercher le résultat (en binaire) dans les
registres ADRESL et ADRESH (p.102). Le bit ADFM permet d’effectuer ce réglage.
Bit 9
Bit 8
ADRESH(1,0)
Bit 7
Bit 0
ADRESL
Donner la valeur du registre ADCON1
Ce résultat de conversion pourra être assemblé dans une variable 16 bits (unsigned long resultat ;)
resultat.high8 = ADRESH;
//les 8 bits de poids fort de resultat prennent ADRESH
resultat.low8 = ADRESL;
//les 8 bits de poids faible de resultat prennent ADRESL
5 Fréquence des conversions
On souhaite effectuer une conversion toutes les 100 ms. Ceci est réalisé grâce au timer 1.
Le lancement de la conversion s’effectue donc dans l’interruption due au timer 1 à l’aide du bit GO du
registre ADCON0. Cette conversion prenant un certain temps, il faut attendre que le bit GO repasse à
zéro pour récupérer le résultat.
6 Résolution du convertisseur et affichage du résultat
La conversion s’effectuant entre 0 et 5V sur 10 bits, la résolution est de :
=4,8875 mV
5V → 1023 → 3FFh => affichage 5000 sur le 4*7 segments
2,5V → 512 → 200h => affichage 2500 sur le 4*7 segments
5mV → 1 → 001h => affichage 0004 sur le 4*7 segments
Le sous-programme d’afficheur 4*7 segments permettra d’envoyer le résultat converti et transformé
sur l’afficheur 4*7 segments.
3
TP microcontrôleurs PIC 16f887
7 Etapes du TP
1) Régler le timer 1 à 100 ms. Visualiser ce temps sur l’oscilloscope ou le simulateur.
2) Récupérer le sous-programme d’afficheur 4*7 segments et afficher un nombre fixe entre 0 et
9999.
3) Effectuer une conversion sur 10 bits et afficher le résultat directement entre 0 et 1023 sur
l’afficheur. Programme conv_an.c
4) Transformer le résultat afin d’afficher une valeur entre 0000 mV et 5000 mV. Tester.
Programme voltmetre.c
4
TP microcontrôleurs PIC 16f887
TP
Modulation de largeur d’impulsion
1 Présentation de la MLI (PWM Pulse Wave Mode)
5V
0V
Un signal PWM est un signal carré dont la largeur du niveau haut Th et la période T sont réglables. Le
PWM est beaucoup utilisé en électronique de puissance pour commander les hacheurs ou les
onduleurs.
La sortie PORTC2 du pic 16f887 permet d’obtenir ce signal. Le TRISC.2 doit être réglé en sortie.
2 Étapes d’initialisation du PWM (datasheet p.128)
La période est réglée par le registre PR2 (8 bits):
T=(PR2+1)*4*Tosc*(TMR2 prescale value)
La durée du niveau haut est réglée sur 10 bits par les 8 bits du registre CCP1L et les bits 4 et 5 du
registre CCP1CON.
Bit 9
Bit 8
Bit 7
Bit 6
Bit 5
CCPR1L
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
CCP1CON.5
CCP1CON.4
Sa valeur est la suivante:
Th=(CCPR1L:CCP1CON<5:4>)*Tosc* (TMR2 prescale value)
Le rapport cyclique vaut alors
α
Th CCPR1L: CCP1CON 5: 4 T
PR2 1 ∗ 4
Le prescaler du timer 2 doit être réglé selon la valeur désiré de la période et doit être mis en marche.
Ces 2 actions sont effectuées en initialisant le registre T2CON (p.82).
Configurer le registre CCP1CON en PWM (p.124).
5
TP microcontrôleurs PIC 16f887
8 Etapes du TP
8.1 Etablir sur l’oscilloscope les signaux suivants :
T=5 ms α=0,5
Programme PWM1.c
T=1ms α=0,1
Programme PWM2.c
F=440 Hz, α=0,6
Programme PWM_la.c
8.2 Sous-programme PWM
A partir d’ici, PR2 est fixé à 255.
Ecrire un sous-programme :
PWM (unsigned long n)
qui prend en entrée un entier sur 16 bit. En pratique, cet entier ne dépassera pas 1023.
Ce sous-programme permet de générer un signal PWM de période 1,25 ms avec un rapport cyclique
variable entre 0 et 1023. Tester ce sous-programme avec plusieurs valeurs de n en entrée.
Exemple :
n=512 => α=0,5
n= 256 => α= 0,25
n= 1023 => α= 1
8.3 Signal MLI avec potentiomètre
Générer une conversion analogique numérique sur 10 bits (0 à 1023) à l’aide du potentiomètre sur
AN2.
T=1,25 ms (PR2 fixé à 255)
Faire varier la largeur de l’impulsion à l’aide du potentiomètre.
Programme MLI.c
8.4 Signal MLI avec rampe
Faire varier le rapport cyclique au rythme de 2s :
α augmente linéairement de 0 à 1 en 1s. α diminue linéairement de 1 à 0 en 1s. Visualiser sur
l’oscilloscope.
Programme MLI_rampe.c
6
TP microcontrôleurs PIC 16f887
TP
Afficheur LCD
1 Manipulation des bits de commande RS, RW, E
RS : manipulation d’une instruction ou d’une donnée
RS
Instruction
0
Donnée
1
Ecriture
0
Lecture
1
RW : lecture ou écriture
RW
L’opération d’écriture ou de lecture est effectuée après un front montant suivie d’un délay(1) suivie
d’un front descendant de E
Ces trois bits sont connectés au PORTE du pic.
Définir les constantes en début de programme :
#define LCD_E
#define LCD_RW
#define LCD_RS
PORTE.2
PORTE.1
PORTE.0
#define LCD_E_DIR
#define LCD_RW_DIR
#define LCD_RS_DIR
TRISE.2
TRISE.1
TRISE.0
// LCD E clock
// LCD read/write line
//LCD register select line
9 Sous-programmes à écrire
9.1 Temporisation
void Delay(long counter)
{
while (counter>0)
counter--;
}
9.2 Attente LCD libre
void Lcd_busy()
Ce sous-programme lit une instruction issue du PORTD sur un octet et test le bit 7 (bit « Busy ») de
cet octet. Dès que ce bit 7 est à zéro, le LCD est libre.
7
TP microcontrôleurs PIC 16f887
9.3 Lecture d’une instruction
Unsigned char Lcd_read()
Ce sous-programme renvoi une instruction issue du PORTD sur un octet.
Régler le PORTD en entrée au début de ce SP.
9.4 Ecriture d’une instruction
Void i_write(Unsigned char temp)
Ce sous-programme écrit une instruction d’un octet (temp) sur le PORTD.
Avant de commencer à écrire l’instruction :
•
Attendre le LCD libre (lcd_busy)
•
Régler le PORTD en sortie
9.5 Ecriture d’une donnée
Void d_write(Unsigned char temp)
Ce sous-programme écrit une donnée d’un octet (temp) sur le PORTD.
Avant de commencer à écrire l’instruction :
•
Attendre le LCD libre (lcd_busy)
•
Régler le PORTD en sortie
9.6 Initialisation du LCD
Void init_lcd()
1) Réglage des données sur 8 bits :
temp_wr=0x30;
TRISD=0;
LCD_RS=0;
LCD_RW=0;
PORTD=temp_wr;
LCD_E=1;
Delay(1);
LCD_E=0;
Delay(100);
//8 bits
//PORTD en sortie
//Instruction
//Ecriture
//Envoi sur PORTD
//Front montant sur E
// temporisation très courte
//Front descendant sur E => l’instruction arrive sur le LCD
//Temporisation avant de passer à l’instruction suivante
2) Utilisation de 2 lignes.
3) Curseur en position en haut à gauche. Effacement de la mémoire.
4) Affichage en fonction, curseur en fonction, pas de clignotements du curseur.
5) Déplacement du curseur vers la droite après apparition du caractère.
8
TP microcontrôleurs PIC 16f887
10 Travail à réaliser
1) Ecrire le caractère « A » en haut à gauche de l’afficheur. Programme LCD1.c
2) Programme LCD_bienvenue.c
Ecrire
Bienvenue au
CNAM
Pour gérer la position du mot à écrire, il faut envoyer l’adresse de position du curseur.
L’adresse à envoyer (paragraphe 10) doit être précédée du 1 sur le bit de poids fort.
On pourra créer un sous-programme LCD_print permettant d’envoyer un mot complet sur l’afficheur.
3) Programme LCD_cligno.c
Faire clignoter l’affichage au rythme de 1 seconde.
4) Programme LCD_temperature.c
A l’aide du Thermo Sensor présent sur la carte afficher la température.
Température :
23°C
Le Thermo Sensor est une résistance dont la valeur est fonction de la température. La tension à ses
bornes est envoyée sur PORTA0 (AN0).
•
Utiliser le convertisseur analogique numérique afin de récupérer sa valeur numérique
sur un octet.
•
Transformer cette valeur afin de récupérer les caractères et les envoyer sur le LCD.
9
TP microcontrôleurs PIC 16f887
TP
Serrure codée et
Synthèse musicale
1 Sous-programme d’acquisition d’une touche
Les 8 boutons poussoirs sont reliés au PORT D.
Ecrire un sous-programme qui renvoi 0 si on appuie sur D0, 1 si on appuie sur D1, …, 7 si on appuie
sur D7. Si aucune touche n’est pressée, ce sous-programme renvoi 8.
int get_key()
{
int touche ;
…
return touche ;
}
2 Validation d’un code
Le code est enregistré dans le programme sur 4 chiffres (exemple 1604). 0 correspond à la touche D0,
1 correspond à la touche D1,…, 7 correspond à la touche D7.
L’utilisateur presse les touches et le symbole ‘*’ s’affiche sur le LCD pour chaque touche pressée. A
la fin des 4 touches pressées, le message « code bon » ou « code faux » s’affiche sur le LCD.
Programme serrure_code.c
3 Jouer la gamme complète
Mettre le switch sur la position Buzzer. A l’aide de la sortie PWM (PORTC.2), on souhaite générer un
signal carré de fréquence correspondant à une note de musique.
Le signal généré pour chaque note sera de rapport cyclique ½, le préscaler sera fixe. Remplir le tableau
suivant permettant de fixer PR2 en fonction de la note.
10
TP microcontrôleurs PIC 16f887
Note
F(Hz)
Do
262
Ré
294
Mi
330
Fa
349
Sol
392
La
440
Si
494
do
524
T (s)
PR2
Le programme jouera la gamme complète. La durée de chaque note sera de 0,5 secondes à l’aide d’un
timer. Programme gamme.c
Si ce programme fonctionne, ne tester qu’une seule fois !
4 Jouer une note selon la touche pressée
Touche D0 → note do
Touche D1 → note ré
Touche D2 → note mi
…
Touche D7 → note do
Le temps de la note jouée est de ½ seconde
Programme musique.c
5 Enregistrer une mélodie
Ce programme consiste à jouer une mélodie, enregistrer les touches pressées et restituer complètement
la mélodie.
Programme melodie.c
6 Affichage sur le LCD
Les notes jouées doivent s’afficher sur l’afficheur LCD.
Programme musique_lcd.c
11