Sei sulla pagina 1di 42

Les Microcontrôleurs

Chapitre 2
 Environnement
 Instructions
 Programmation
 Simulations
Brahim Attia « Docteur en électronique et micro-électronique »
brahim.attia@yahoo.fr
Jaouher Ben Ali « Docteur en automatique et informatique industrielle »
benalijaouher@yahoo,fr 1
Variables, équivalences et
constantes

2
Opérateurs
Opérateurs arithmétiques Opérateurs relationnels

Opérateurs logiques Opérateurs sur les bits

Opérateurs d’incrémentation Opérateurs de décrémentation


a = a+1; a = a-1;
a++; a--;
++a; --a; 3
Opérateurs

4
Opérateurs

5
Instructions conditionnelles
IF IF else IF else if else

Exemple:

6
Instructions conditionnelles
Switch Case Exemple
Switch (la variable)
{
Les cas
}

7
Boucle while
Boucle Exemple

8
Boucle do while
Boucle Exemple

9
Boucle For
Boucle Exemple
for (condition de départ;
condition de fin; évolution
de la variable)
{
instructions
}

10
Break
L’instruction break termine l'exécution de l'instruction do,
for, switch ou while. Le contrôle est transmis à l’instruction
qui suit l'instruction terminée.

Dans les instructions imbriquées, l’instruction break met


un terme uniquement à l'instruction do, for, switch ou
while qui l’englobe immédiatement. Vous pouvez utiliser
une instruction return ou goto pour transférer le contrôle
hors de la structure imbriquée.
L’instruction continue permet de sauter directement à
l’instruction suivante (itération suivante d’une boucle).
11
Break
Exemple

Résultats

12
Registre TRISA (16F877)
TRISA (Adresse 85h) : Registre de configuration de direction
des pins du port PORTA

13
Registre PORTA (16F877)
PORTA (Adresse 05h) :Registre d’état du port PORTA.

14
Registre TRISB et PORTB
TRISB (Adresse 86h, 186h) : Registre de configuration de
direction des pins du port PORTB.

PORTB (Adresse 06h, 106h) : Registre d’état du port PORTB

15
Registre OPTION_REG
OPTION_REG (adresse : 81h ; 181h) : Registre de
sélection des options

16
Registre TRISC et PORTC
PORTC (Adresse 07h) :Registre d’état du port PORTC

TRISC (Adresse 87h):Registre de configuration de direction


des pins du port PORTC

17
Registre TRISD et PORTD
PORTD (Adresse 08h) :Registre d’état du port PORTD

TRISD (Adresse 88h): Registre de configuration de


direction des pins du port PORTD

18
Registre PORTE
PORTE (Adresse 09h) :Registre d’état du port PORTE

19
Registre TRISE
TRISE (adresse : 89h ):Registre de configuration de direction
des pins du port PORTE et de contrôle / statut du Port
Parallèle Esclave PSP.

20
Registre TRISE

21
Quelques syntaxes
Syntax: #device chip
Chip est le non spécifique du processeur(16f877 par exemple).
Exemple: #device PIC16f877

Syntax: Syntax:
#define id text #include <filename>
or or
#define id(x,y...) text #include "filename“
Examples: Examples:
#define BITS 8 #include <16F84A.H>
a=a+BITS; //same as a=a+8; #include "LCD.h "
#define falso 0 #include <C:\INCLUDES\
#define True 1 COMLIB\MYRS232.C>
#define hi(x) (x<<4)
a=hi(a); //same as a=(a<<4);
22
Quelques syntaxes
Syntax: #use delay (clock=speed(Hz))
Préciser au compilateur la vitesse du processeur et autoriser
l’utilisation des fonctions prédéfini: delay_ms() and delay_us().
Exemple: #use delay (clock=20000000)

Syntax: #fuses options


Les Options dépendent du type du PIC utilisé. Une liste de toutes les
options valides a été mis en haut de chaque fichier PICxxx.h dans un
commentaire pour référence. L'utilitaire d'édition de dispositif de
PCW peut modifier un des dispositifs particuliers fusibles. Le PCW
menu déroulant VIEW Config Bits montre tous les fusibles inclus
avec leurs descriptions. Exemples:
NOWDT: désactivé le chien de garde.
WDT: activé le chien de garde.
PROTECT: protection de lecture du programme. 23
Exemple 1: LED inverse
#include <16F877.h>
#fuses NOWDT,XT
#use delay (clock=4M)
#define open output_high
#define close output_low
#define led PIN_B0
void main()
{set_tris_a(0x3F);
set_tris_b(0xFE);
output_b(0x00);
while(TRUE)
{if (input(PIN_A0)==0)
open(led);
else
close(led);
}
}

24
Fonctions spécifiques au CCS
Syntax: delay_ms (time)
Syntax: delay_us (time)
time - a variable 0-65535(int16) or a constant 0-65535
Cette fonction permet de créer un code pour effectuer un retard bien spécifiée. Le
temps est spécifié en millisecondes. Ces fonctions n’utilise pas un timer.

Syntax: value = input (pin) Syntax: value = input_a()


Retours: 0 (or FALSE) if the pin value = input_b()
is low, and 1 (or TRUE) if the pin value = input_c()
is high. Retours: An 8 bit int representing the port
Exemple: y=input(PIN_A4) input data.

25
Fonctions spécifiques au CCS
Syntax: value = input_state(pin);
Cette fonction lit le niveau d'une broche sans modification de la direction de l'axe
en INPUTT(). Cette fonction retourne un bit égale à 1(la pin est à niveau haut) ou
0 (la pin est à niveau bas).
Examples: level = input_state(pin_A3);

Syntax: value = bit_test (var, bit)


var peut avoir 8,16 ou 32 bits.
bit est un nombre de 0 à 31 qui défini le numéro du bit, 0 est le bit le plus faible
(LSB),
Retours: 0 (ou faux) si le bit du registre spécifié est égale à 0 et 1 (or vrai) si le
bit du registre spécifié est égale à 1.
Exemple: y= bit_test (PORTB, 5) 26
Configuration des PINs
Syntax:
set_tris_a (value)
set_tris_b (value)
set_tris_c (value)
set_tris_d (value)
set_tris_e (value)

Paramètre: value est un entier 8 bits ou chaque bit représente la direction d’un port
I/O. Il doit être utilisé avec la directive FAST_IO et quand les ports I/O sont
accessibles en tant que mémoire avec l’utilisation du directive #BYTE est utilisé
pour accéder à un port E /S (pour les anciennes versions du CCS). Chaque bit de la
valeur représente une broche. Un 1 indique la broche est entrée et un 0 indique
qu‘elle est sortie.
Exemple:
SET_TRIS_B( 0x0F );
// B7,B6,B5,B4 sont des sorties
// B3,B2,B1,B0 sont des entrées
27
Exp 2: LED-inv (auto-configuration)
#include <16F877.h>
#fuses NOWDT,XT
#use delay (clock=4M)
#define open output_high
#define close output_low
#define led PIN_B0
void main()
{set_tris_a(0x3F);
output_b(0x00);
while(TRUE)
{if (input(PIN_A0)==0)
open(led);
else
close(led);
}
}

28
Exemple 3: LED inverse avec RBPU
#include <16F877A.h>
#fuses NOWDT,XT
#use delay (clock=4M)
#define open output_high
#define close output_low
#define led PIN_D0
#byte option_reg=0x81

void main()
{set_tris_b(0xFF);
option_reg=0x7F;
output_d(0x00);
while(TRUE)
{if (input(PIN_B0)==0)
open(led);
else
close(led);
}
} 29
Exemple 4: Clignotement LED
#include <16F877.h> #include <16F877.h>
#fuses NOWDT,XT #fuses NOWDT,XT
#use delay (clock=4M) #use delay (clock=4M)
#define open output_high
void main() #define close output_low
{output_b(0x00); #define led PIN_B0
while(TRUE) void main()
{ {output_b(0x00);
output_high(PIN_B0); while(TRUE)
delay_ms(500); {
output_low(PIN_B0); open(led);
delay_ms(500); delay_ms(500);
} close(led);
} delay_ms(500);
}
}

30
Configuration des PINs
Syntax: output_drive(pin)
Cette fonction permet de configurer la pin spécifiée en sortie.
Exemple:
output_drive(pin_A0); // configure la pin A0 en sortie
output_bit(pin_B0, input(pin_A0)) // makes B0 the same as A0

Syntax:
value = get_tris_A();
value = get_tris_B();
value = get_tris_C();
Retours: int16, la valeur du register TRIS.
Cette fonction permet de retourner la valeur du registre TRIS du port A, B, C, D, E.
Exemple:
tris_a = GET_TRIS_A();
31
Configuration des PINs
Syntax: output_float (pin)
Cette fonction permet de configurer la pin spécifiée comme entrée.
Exemples:
If ( (data & 0x80)==0 )
output_low(pin_A0);
else
output_float(pin_A0);

Syntax:
output_a (value)
output_b (value)
output_c (value)
Elle affecte la valeur de value (8 bits ) au port correspondant
Exemples:
OUTPUT_B(0xf0);
32
Configuration des PINs
Syntax: output_bit (pin, value)
Mise à 1 ou 0 du pin spécifié.
Exemples:
output_bit( PIN_B0, 0);
// Donne le même résultat que output_low(pin_B0);
output_bit( PIN_B0,input( PIN_B1 ) );
// Rendre le pin B0 de même valeur que le pin B1
output_bit( PIN_B0, shift_left(data,1,input(PIN_B1)));
// Affecter le MSB de data à B0 et aussi décaler B1 à LSB de data
// Shift_left (address, bytes, value)
// address est l’information à traiter
// bytes est le nombre de bits à décaler
// value est la valeur 0 ou 1 qui remplacera les bits manquants
int16 i=PIN_B0;
ouput_bit(i,shift_left(data,1,input(PIN_B1)));
//La même instruction précedente avec une constante au lieu d’une variable 33
Configuration des PINs

34
Exemple 5: Feux de carrefour
Un bouton de mise en marche permet de démarrer le programme en mode jour
(interrupteur lié au PORTA PIN0), un deuxième bouton permet de déclarer les feux en
mode clignotant durant la nuit (interrupteur lié au PORTA PIN1).
 On choisira un quartz de 4MHz pour cadencer le PIC 16F877.
 Il est préconisé de relier le quartz via le 0V avec deux condensateurs de 15 pF.
 Une résistance de 470 Ω doit être insérée avec les 6 LEDs pour limiter le courant.

35
Exemple 5: Feux de carrefour
Deux résistances de rappel imposent un 0 V sur les entrées reliées aux interrupteurs.
Un condensateur de 10 µF ou plus permet de filtrer l’alimentation de 5 V.
 Un circuit RC, composé de la résistance de 1KΩ avec un condensateur de 1µF,
permet une remise à zéro à la mise sous tension sur la broche MCLR du PIC.

36
Exemple 5: Feux de carrefour

37
Exemple 6: Succession des LEDs
for(;;)
{PORTB=0b00000001;
#include <16F877.h> delay_ms(500);
#fuses NOWDT,XT PORTB=0b00000010;
#use delay (clock=4M) delay_ms(500);
PORTB=0b00000100;
#byte TRISB=0x86
delay_ms(500);
#byte PORTB=0x06 PORTB=0b00001000;
void main() delay_ms(500);
{TRISB=0; PORTB=0b00010000;
PORTB=0; delay_ms(500);
PORTB=0b00100000;
delay_ms(500);
PORTB=0b01000000;
delay_ms(500);
PORTB=0b10000000;
delay_ms(500);
}
}

38
Exemple 6: Succession des LEDs
Une par une puis deux à deux
Deux à deux delay_ms(500);
#include <16F877.h>
#include <16F877.h> for(;;) PORTB=0b01000000;
#fuses NOWDT,XT
#fuses NOWDT,XT {PORTB=0b00000011; delay_ms(500);
#use delay (clock=4M)
#use delay (clock=4M) delay_ms(500); PORTB=0b10000000;
#byte TRISB=0x86
#byte TRISB=0x86 PORTB=0b00000110; delay_ms(500);
#byte PORTB=0x06
#byte PORTB=0x06 delay_ms(500); PORTB=0b00000011;
void main()
PORTB=0b00001100; delay_ms(500);
{TRISB=0;
void main() delay_ms(500); PORTB=0b00000110;
PORTB=0;
{TRISB=0; PORTB=0b00011000; delay_ms(500);
for(;;)
PORTB=0; delay_ms(500); PORTB=0b00001100;
{PORTB=0b00000001;
PORTB=0b00110000; delay_ms(500);
delay_ms(500);
delay_ms(500); PORTB=0b00011000;
PORTB=0b00000010;
PORTB=0b01100000; delay_ms(500);
delay_ms(500);
delay_ms(500); PORTB=0b00110000;
PORTB=0b00000100;
PORTB=0b11000000; delay_ms(500);
delay_ms(500);
delay_ms(500); } PORTB=0b01100000;
PORTB=0b00001000;
} delay_ms(500);
delay_ms(500);
PORTB=0b11000000;
PORTB=0b00010000;
delay_ms(500);
delay_ms(500);
}
PORTB=0b00100000; 39
}
Exemple 6: Succession des LEDs
Une par une puis deux à deux avec appel des fonctions

void function1(){ void function2(){


#include <16F877.h> PORTB=0b00000001; PORTB=0b00000011;
#fuses NOWDT,XT delay_ms(500); delay_ms(500);
#use delay PORTB=0b00000010; PORTB=0b00000110;
(clock=4M) delay_ms(500); delay_ms(500);
#byte TRISB=0x86 PORTB=0b00000100; PORTB=0b00001100;
#byte PORTB=0x06 delay_ms(500); delay_ms(500);
void function1(void); PORTB=0b00001000; PORTB=0b00011000;
void function2(void); delay_ms(500); delay_ms(500);
void main() PORTB=0b00010000; PORTB=0b00110000;
{TRISB=0; delay_ms(500); delay_ms(500);
PORTB=0; PORTB=0b00100000; PORTB=0b01100000;
for(;;) delay_ms(500); delay_ms(500);
{function1(); PORTB=0b01000000; PORTB=0b11000000;
function2(); delay_ms(500); delay_ms(500);
} PORTB=0b10000000; }
} delay_ms(500);
}
40
Exemple 6: Succession des LEDs
Une par une puis deux à deux avec appel des fonctions et avec un fichier driver

#include <16F877.h> /*fichier LED.c*/ void function2(){


#fuses NOWDT,XT void function1(){ PORTB=0b00000011;
#use delay (clock=4M) PORTB=0b00000001; delay_ms(500);
#byte TRISB=0x86 delay_ms(500); PORTB=0b00000110;
#byte PORTB=0x06 PORTB=0b00000010; delay_ms(500);
#include <LED.c> /*le fichier delay_ms(500); PORTB=0b00001100;
est PORTB=0b00000100; delay_ms(500);
enregistré dans le répertoire delay_ms(500); PORTB=0b00011000;
DRIVERs de PIC C*/ PORTB=0b00001000; delay_ms(500);
void function1(void); delay_ms(500); PORTB=0b00110000;
void function2(void); PORTB=0b00010000; delay_ms(500);
void main() delay_ms(500); PORTB=0b01100000;
{TRISB=0; PORTB=0b00100000; delay_ms(500);
PORTB=0; delay_ms(500); PORTB=0b11000000;
for(;;) PORTB=0b01000000; delay_ms(500);
{function1(); delay_ms(500); }
function2(); PORTB=0b10000000;
} delay_ms(500);
} } 41
42

Potrebbero piacerti anche