TP2 Asp GBM3-LMD

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 4

TP2 : Gestion des fonctions d’entrées sorties

PIC 16F84 sous PIC C

Objectifs pédagogiques :
Maîtriser les notions élémentaires de la programmation C des PIC :
o Opérations sur les Entrées/Sorties,
o Utilisation des fonctions (appel et déclaration).
Saisir la différence entre le passage de paramètres par
valeurs et par variables

Préalables :
Notions élémentaires sur la programmation C, maitrise
des outils ISIS et PICC.

Durée : 1 séance de 3H
TP Architecture des systèmes à processeurs GBM3

1. Description du travail
Il s’agit de réaliser une chenille lumineuse à 8 voies. Plusieurs séquences d’animation seront
programmées. L’utilisateur pourra changer de séquence d’animation ainsi que la vitesse
de défilement grâce aux interrupteurs et boutons poussoirs (fig.1).

SW1
R1 R2 R3
4k7 4k7 4k7 R4
4K7 SW2

C1 U1
16 17
BTP+
OSC1/CLKIN RA0
15 18
OSC2/CLKOUT RA1
18pF 1
RA2 BTP-
X1 4
MCLR RA3
2
4Mhz 3
C2 RA4/T0CKI
6
RB0/INT
7
RB1
18pF 8
RB2
9
RB3
10
RB4
11
RB5
12
RB6
13
RB7
PIC16F84A

17 16 15 14 13 R12 R11 R10


330 330 330 330 330 330 330 330

L7 L6 L5 L4 L3 L2 L1 L0

Figure 1

2. Manipulation 1 : Défilement lumineux simple sur 4 leds


Soit le programme C suivant :

#include <16f84a.h> //Programme principal


#use delay (clock=4000000) void main ( )
void cycle_forward (int speed_ms) {
{ set_tris_b (0x00); // port b en sortie
output_low (PIN_B3); set_tris_a (0xFF); //port a en entrée
output_high (PIN_B0); output_b(0b00000000);
delay_ms (speed_ms);
output_low (PIN_B0); While (true)
output_high(PIN_B1); { If (input (PIN_A0))
delay_ms (speed_ms); cycle_forward (100);
output_low (PIN_B1); else
output_high (PIN_B2); output_b(0x00);
delay_ms (speed_ms); }
output_low (PIN_B2); }
output_high (PIN_B3);
delay_ms (speed_ms);
}

ISTMT TP2 10
TP Architecture des systèmes à processeurs GBM3

1- Compiler le programme du fichier d:\GBM3\TPASP\TP2.C.


2- Ouvrir le fichier l’arborescence suivante d:\GBM3\TPASP\TP2.DSN et simuler le
fonctionnement du circuit.
3- Quelle est la fonction réalisée par ce programme ?
4- Ecrire la fonction cycle_forward2 suivante :
void cycle_forward2 (int speed_ms)
{
int leds; leds = 0x01;
while (leds <= 0x08)
{ output_b(leds);
delay_ms (speed_ms);
leds = leds << 1;
}
}
5- Modifier le programme pour faire appel uniquement à cette fonction. Compiler le
programme et simuler son fonctionnement sous ISIS.
6- Quelle différence constatez-vous entre les deux versions de la fonction cycle_forward ?
7- La vitesse de défilement des LED dans ce programme est assurée par la fonction
delay_ms(time), et est fixée à 100ms. La fonction qui suit peut être utilisée pour permettre à
l’utilisateur de régler (via les boutons poussoir BTP+ et BTP-) la vitesse de défilement entre
50 et 255 ms.

void impulse_delay(int *dly)


{
while (!input(PIN_A2) & (*dly < 255))
{*dly = *dly + 1;
delay_ms(50);
}
while (!input(PIN_A3) & (*dly > 50))
{*dly = *dly - 1;
delay_ms(50);
}
}

En utilisant cette fonction, modifier votre programme afin de pouvoir régler la vitesse de
défilement des LEDs à partir de BTP+ et BTP-.
8- Ecrire une nouvelle fonction void cycle_backward(int speed_ms) qui commande un défilement
des LEDs L7..L4 de gauche à droite (utiliser l’opérateur de décalage à droite).
9- Tester cette fonction.

ISTMT TP2 11
TP Architecture des systèmes à processeurs GBM3

3. Manipulation2 : Défilement personnalisé sur 8 leds


1. On veut maintenant réaliser plusieurs animations sur les LEDs commandées par les
interrupteur SW1 et SW2 selon le tableau suivant :
Tableau 1

N° séquence SW1 SW2 Séquence


0 1 1 L0-L1-..-L7
1 1 0 L7-L6-..-L0
2 0 1 L7/L0-L6/L1-L5/L2-L4/L3
3 0 0 L0/L1-L2/L3-L4/L5-L6/L7

En se basant sur le modèle du programme principal suivant, modifier votre programme afin
d’exécuter une fonction pour chaque combinaisons listée dans le tableau 1.

void main ( )
{ int cmd
int speed=100 ;
set_tris_b (0x00); // port b en sortie
set_tris_a (0xFF); //port a en entrée
output_b(0x00);

while (TRUE)
{
cmd = input_a() & 0x03; //cmd=0b000000RA1 RA0
switch (cmd)
{
case 0: sequence0 (speed);
break;
case 1: sequence1 (speed);
break;
case 2: sequence2 (speed);
break;
case 3: sequence3 (speed);
break;
}
}
}

ISTMT TP2 12

Vous aimerez peut-être aussi