Vous êtes sur la page 1sur 136

Les Microcontrôleurs

Chapitre 1
 Définition
 Présentation
 Architecture

Jaouher Ben Ali « Docteur en automatique et informatique industrielle »


benalijaouher@yahoo,fr
1
Définition « Wiki »
Un microcontrôleur (en notation abrégée µc, ou uc ou
encore MCU en anglais) est un circuit intégré qui
rassemble les éléments essentiels d'un ordinateur :
processeur, mémoires (mémoire morte et mémoire vive),
unités périphériques et interfaces d'entrées-sorties. Les
microcontrôleurs se caractérisent par un plus haut degré
d'intégration, une plus faible consommation électrique,
une vitesse de fonctionnement plus faible (de quelques
mégahertz jusqu'à plus d'un Gigahertz) et un coût réduit
par rapport aux microprocesseurs polyvalents utilisés
dans les ordinateurs personnels.
2
Classification des circuits numériques

Circuits
numériques

circuits logiques circuits à circuits à circuits à temps de


standards fonctionnement architecture développement
programmable programmable et important
faible temps de
développement

74HC.. microprocesseurs PLD, CPLD, Asic pré-diffusés


... microcontroleurs FPGA Asic pré-caractérisés
Asic full custom
3
Différents fabricants des µc
 ATMEL
 INTEL
 ANALOG DEVICES
 RENESAS
 INFINEON
 FEDERAL SIGNAL
 MICROCHIP
 Etc…
4
Définition et abréviation d’un
PIC« Wiki »
Les microcontrôleurs PIC (ou PICmicro dans la terminologie
du fabricant) forment une famille de microcontrôleurs de la
société Microchip. Ces microcontrôleurs sont dérivés du
PIC1650 développé à l'origine par la division
microélectronique de General Instrument. Le nom PIC n'est
pas officiellement un acronyme, bien que la traduction en
« Peripheral Interface Controller » soit généralement
admise. Cependant, à l'époque du développement du
PIC1650 par General Instrument, PIC était un acronyme de
« Programmable Intelligent Computer » ou
« Programmable Integrated Circuit ».
5
Différentes gammes d’un PIC

6
Architecture d’un PIC

7
Architecture d’un PIC

8
Architecture d’un PIC

9
Identification d’un PIC

10
Identification d’un PIC
Plastic Dual In line Package (PDIP) Quad Flat Package (QFP)

Example: PIC 16 F 84a -04 I/P


16 F Sans L 84a 04 I P

11
Brochage d’un PIC 16F877
Diagramme des PIN Schéma ISIS

12
Brochage d’un PIC 16F84
Diagramme des PIN Schéma ISIS

13
Brochage d’un PIC

RAZ (Reset)

Alimentation

Horloge

14
Horloge d’un PIC
Le pic 16f877 peut fonctionner selon quatre modes
différents de l'oscillateur. L'utilisateur peut programmer
deux bits de configuration (FOSC 1 et FOSC 0) pour
sélectionner l'un de ces quatre modes:

 LP : Low Power Crystal


 XT : Crystal/Resonator
 HS : High Speed Crystal/Resonator
 RC : Resistor/Capacitor

15
Horloge d’un PIC

16
Horloge d’un PIC

17
Architecture d’un PIC 16F877
Horloge

PORTB
PORTA

PORTE
PORTC
Reset

PORTD

18
Architecture d’un PIC 16F877

19
Résistes à usages spécifiques 16F877

20
Architecture d’un PIC 16F877

21
Architecture d’un PIC 16F877

22
Architecture d’un PIC 16F877

23
24
Les Microcontrôleurs
Chapitre 2
 Environnement
 Instructions
 Programmation
 Simulations
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
Les Microcontrôleurs

Chapitre 3

 Applications à base des PICs

Jaouher Ben Ali « Docteur en automatique et informatique industrielle »


benalijaouher@yahoo.fr

1
Exemple 1: Aff 7 seg sans décodeur

2
Exemple 1: Aff 7 seg sans décodeur
#include <16F877.h>
#fuses NOWDT,XT
#use delay (clock=4M)
#byte TRISB=0x86
#byte PORTB=0x06
void main()
portb=0x66; /*4*/
{TRISB=0;
delay_ms(500);
PORTB=0;
portb=0x6D; /*5*/
for(;;)
delay_ms(500);
{portb=0x3F;/*0*/
portb=0x7C; /*6*/
delay_ms(500);
delay_ms(500);
portb=0x06; /*1*/
portb=0x07; /*7*/
delay_ms(500);
delay_ms(500);
portb=0x5B; /*2*/
portb=0x7F; /*8*/
delay_ms(500);
delay_ms(500);
portb=0x4F; /*3*/
portb=0x67; /*9*/
delay_ms(500);
delay_ms(500);
} masse
}

3
Exemple 1: Aff 7 seg sans décodeur
#include <16F877.h>
#fuses NOWDT,XT
#use delay (clock=4M)
#byte TRISB=0x86
#byte PORTB=0x06
int display[10]={0x3F,0x06,0x5B,
0x4F,0x66,0x6D,0x7C,0x07,
0x7F,0x67};
int i;
void main()
{TRISB=0;
PORTB=0;
for(;;)
{
for(i=0;i<10;i++)
{ PORTB=display[i];
delay_ms(500);
}
}
}
4
Exemple 2: Les fonctions logiques
 Les entrées A, B, C ont été utilisés comme des interrupteurs (voir figure).
 Les sorties seront affichés à base des diodes LED.
 Ces entrées/sorties sont commandées à travers un microcontrôleur PIC 16F877.

5
Exemple 2: Les fonctions logiques
Proposer un programme en C qui réalise ce système avec une fréquence d’horloge
de 4 MHZ, avec protection du code, et sans utilisation du watch dog.
 Afin de garantir une meilleure lisibilité et flexibilité au niveau du programme,
on pourrait utiliser la directive define pour simplifier l’écriture des ports d’entrée
sortie. Réécrire le même programme en utilisant cette directive

6
Exemple 2: Les fonctions logiques

7
Exemple 2: Les fonctions logiques
Ou bien

8
Exemple 3: Aff des nbs romains

9
Exemple 3: Aff des nbs romains

Ou bien

10
Exp 4: Comp M100 (aff multiplexé)
Cathodes
communes

Sans horloge!!

11
Exp 5: Comp M1000 (avec horloge)

12
Exp 5: Comp M10000 (avec horloge)

13
Exp 6: Comp M10000 (avec horloge)

14
Exp 6: Comp M10000 (avec horloge)

15
Rappel sur les transistors

16
Rappel sur les transistors

17
Exp 7: Afficheur LCD

18
Exp 7: Afficheur LCD

19
Exp 7: Afficheur LCD
#include <16F877.h>
#fuses NOWDT,XT
#use delay (clock=4M)
#byte TRISB=0x86
#byte PORTB=0x06

#define LCD_ENABLE_PIN PIN_D2


#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D0
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
#include "lcd.c"

void main()
{ lcd_init();
while(true){
lcd_gotoxy(1,1);
printf(lcd_putc,"Cours");
lcd_gotoxy(1,2);
printf(lcd_putc, "PICs");
}
} 20
Exp 8: Afficheur LCD

21
Exp 9: Gestion d’un clavier

22
Exp 9: Gestion d’un clavier

23
Exp 9: Gestion d’un clavier

24
Exp 9: Gestion d’un clavier

25
Exp 10: Gestion d’un clavier

26
Exp 10: Texte défilant sur un LCD

27
28
Les Microcontrôleurs

Chapitre 4
 Conversion analogique
numérique (CAN ou ADC)
Jaouher Ben Ali « Docteur en automatique et informatique industrielle »
benalijaouher@yahoo.fr

1
Ports et PINs utilisés pour le CAN

2
Registres Associés avec l’ADC
ADDR NAME BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0

0Bh INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF
0Ch PIR1 PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
8Ch PIE1 PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
1Eh ADRESH L’octet du plus fort poids du registre résultat du CAN
9Eh ADRESL L’octet du plus faible poids du registre résultat du CAN
1Fh ADCON0 ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/ - ADON
!DONE
9Fh ADCON1 ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0
85h TRISA - - Registre de direction de données du PORTA
05h PORTA PORTA pin en cas de lecture, Bascule asynchrone de données
du PORTA en cas d’écriture.
89h TRISE IBF OBF IBOV PSP - Bits de direction de données
MODE du PORTE
09h PORTE - - - - - RE2 RE1 RE0

3
Registres Associés avec l’ADC
Vérifier la fin de conversion Activé ou désactivé
Analogique numérique l’interruption du CAN.

PIR1 0C PIE1 8C

Résultat du conversion
sur 10 bits ADRESH 1E ADRESL 9E
Mise en service ADCON0 1F ADCON1 9F Configuration
du CAN du CAN
Registres à 20 Registres à A0
usage usage
générale générale EF
7F
Bank 0 Bank 1

4
Registre ADCON0
ADCON0 (adresse : 1Fh ) Registre de configuration du convertisseur Analogique / Digital

5
Registre ADCON0
Au reset : ADCON0 = 00000000
Bit 7 et bit 6 : ADSC1 et ADSC0 = Clock Select bits.
Ces 2 bits permettent de choisir la vitesse de conversion :
00= Fosc/2.
01= Fosc/8.
10= Fosc/32.
11= Oscillateur RC interne.
Le temps de conversion d'un bit est TAD. Pour une conversion totale des 10 bits il faut : 12
TAD.
Pour que la conversion soit correcte il faut que TAD soit au minimum de 1,6μs.
Avec l'oscillateur interne RC on a : TAD = 4 μs typique ( entre 2 et 6 μs ).

6
Registre ADCON0
Temps de conversion TAD en fonction du Quartz et des bits du Clock select :
Quartz Clock TAD 12 TAD Ne convient pas si TAD< 1,6µs
4 MHz Fosc /2 = 2 MHz 0,5 µs 6µs Ne convient pas
Fosc /8 = 500 KHz 2 µs 24 µs OK
Fosc /32 = 125 KHz 8 µs 96 µs OK
8 MHz Fosc /2 = 4 MHz 0,25 µs 3 µs Ne convient pas
Fosc /8 = 1 MHz 1µs 12 µs Ne convient pas
Fosc /32 = 250 KHz 4 µs 48 µs OK
12 MHz Fosc /2 = 6 MHz 0,16 µs 1,92 µs Ne convient pas
Fosc /8 = 1,5 MHz 0,66 µs 8 µs Ne convient pas
Fosc /32 = 375 KHz 2,6 µs 32 µs OK
16 MHz Fosc /2 = 8 MHz 0,125 µs 1,5 µs Ne convient pas
Fosc /8 = 2 MHz 0,5 µs 6 µs Ne convient pas
Fosc /32 = 500 KHz 2 µs 24 µs OK
20 MHz Fosc /2 = 10 MHz 0,1 µs 1,2 µs Ne convient pas
Fosc /8 = 2,5 MHz 0,4µs 4,8 µs Ne convient pas
Fosc /32 = 625 KHz 1,6 ms 19,2 ms OK
7
Registre ADCON0
Bit 5 bit4 et bit 3 : CHS2 CHS1 et CHS0 = Channel Select bits.
Ces 3 bits permettent de choisir l'entrée analogique qui va être convertie.

8
Registre ADCON0
Bit 2 : bit d’état de la conversion (GO/DONE)
Ce bit indique la fin de la conversion et permet aussi de lancer la conversion. Il est
nommé ADGO dans le langage C HI-TECH .
La mise à 1 de ce bit par le programmeur permet de commencer la conversion.
Ce bit passe automatiquement à 0 (par le HARD) lorsque le CAN terminera la
conversion.

Bit 2 : GO/DONE
Si ADON =1
GO/DONE =1 ; Démarre la conversion A/D. Ce bit est remis à "0" par hard.
GO/DONE =0 ; La conversion A/D est terminée.

9
Registre ADCON0
Bit 0 : ADON : A/D on bit.
1= Convertisseur A/D en service.
0 = Convertisseur A/D à l'arrêt.

ADON: ce bit permet de « mettre en route » le convertisseur analogique numérique:


1: le convertisseur analogique numérique est en fonctionnement.
0: le convertisseur analogique numérique ne fonctionne pas, les broches d’entrées ne
consomment pas de courant.

C.-à-d. Le positionnement à “1” du bit ADON active le convertisseur A/N. Dans le cas
contraire le C.A.N. est inopérant.

10
Registre ADCON1
ADCON1 (adresse : 9Fh ) Registre de configuration du convertisseur Analogique / Digital

11
Registre ADCON1
ADFM= Sélection du Format du résultat de la conversion:
Le résultat de la conversion sur 10 bits peut se présenter de 2 façons :
- ADFM = 0 justification à gauche (dans ce cas ADRESH donne un résultat sur 8 bits,
correspondant à la partie la plus significative = poids fort). Ce mode est surtout utilisé
lorsque l’on se contente d’un résultat sur 8 bits (variable de type “unsigned char”).
Left justified

- ADFM = 1 justification à droite. Le résultat correspond directement à un entier de type


“unsigned int” en langage C. Ce mode est donc tout indiqué lorsque l’on souhaite utiliser le
résultat sur 10 bits.
Right justified

12
Registre ADCON1

13
Registre ADCON1
Configuration des PORTS en fonctions des 4 bits PCFG:

Bit 3 bit 2 bit 1 et bit 0 : PCFG3 PCFG2 PCFG1 et PCFG0


Bits de contrôle de la configuration des Ports.
Ces bits permettent de choisir le partage entre entrées analogiques et digitales sur les PORTS A et
E.
Ils permettent également de choisir pour VREF+ entre VDD et PA3 et pour et VREF - entre VSS et
PA2.

ATTENTION :
Au reset le registre ADCON1 est initialisé à h'00'.
Cela signifie que les 5 bits du Port A et les 3 bits du Port E sont configurés en entrées
analogiques.
Pour récupérer le 5 bits du Port A et les 3 bits de Port E en tant que I/O digitales il faut écrire la
valeur h'06' dans ADCON1.

A = Entrée Analogique.
D = I/O Digitale.
14
Architecture interne de l’ADC

15
Programmation de l’ADC
Ces options permettent à l'utilisateur de configurer et utiliser le module convertisseur
analogique / numérique. Ils ne sont disponibles que sur les PICs avec ADC intégré. Les options
pour les fonctions et les directives varient en fonction du type du PIC et ils sont répertoriés
dans le fichier d'en-tête du PIC utilisé. Sur certains PICs, il ya deux modules ADC indépendants,
pour ces PICs, le second module est configuré en utilisant les fonctions de configuration
secondaire ADC (Ex. setup_ADC2).
setup_adc(mode) Sets up the a/d mode like off, the adc clock etc.
setup_adc_ports(value) Sets the available adc pins to be analog or digital.
set_adc_channel(channel) Specifies the channel to be use for the a/d call.
read_adc(mode) Starts the conversion and reads the value. The mode can also
control the functionality.
adc_done() Returns 1 if the ADC module has finished its conversion.
Relevant Preprocessor:
#DEVICE ADC=xx Configures the read_adc return size. For example, using a PIC with a 10
bit A/D you can use 8 or 10 for xx- 8 will return the most significant byte, 10 will return the
full A/D reading of 10 bits.

16
setup_adc(mode)
Syntax: setup_adc (mode); setup_adc2(mode);
Paramètre: mode: Analog to digital mode. Les options valides varient selon le PIC
utilisé. Voire le fichier 16f877.h file pour toutes les options. Quelques options typiques sont:

////////////////////////////////////////////////////////////////// ADC
// ADC Functions: SETUP_ADC(), SETUP_ADC_PORTS() (aka SETUP_PORT_A),
// SET_ADC_CHANNEL(), READ_ADC()
// Constants used for SETUP_ADC() are:
#define ADC_OFF 0 // ADC Off
#define ADC_CLOCK_DIV_2 0x100
#define ADC_CLOCK_DIV_8 0x40
#define ADC_CLOCK_DIV_32 0x80
#define ADC_CLOCK_INTERNAL 0xc0 // Internal 2-6us

Exemples:
Returns: undefined
setup_adc_ports( ALL_ANALOG );
Function: Configures the analog to digital converter.
setup_adc(ADC_CLOCK_INTERNAL );
Disponibilité: Pour les PICs ayant des ADCs intégré. set_adc_channel( 0 );
value = read_adc();
Nécessite: Constantes définies dans le fichier setup_adc( ADC_OFF ); 17
16f877.h.
setup_adc_ports( )
Syntaxe: setup_adc_ports (value)
Returns: undefined
Paramètres: value - une constante défini dans le fichier 16f877.h
Fonction: configure les pins de l’ ADC comme entrée analogique, numérique, ou comme
combinaison et la tension de reference à utiliser quand on calcule la valeur fournit par l’ADC.

Examples:
// All pins analog (that can be)
setup_adc_ports( ALL_ANALOG );
// Pins A0, A1 and A3 are analog and all others are digital. The +5v is used as a reference.
setup_adc_ports( RA0_RA1_RA3_ANALOG );
// Pins A0 and A1 are analog. Pin RA3 is used for the reference voltage and all other pins
// are digital.
setup_adc_ports( A0_RA1_ANALOGRA3_REF );
18
// Constants used in SETUP_ADC_PORTS() are:
#define NO_ANALOGS 7 // None
#define ALL_ANALOG 0 // A0 A1 A2 A3 A5 E0 E1 E2
#define AN0_AN1_AN2_AN4_AN5_AN6_AN7_VSS_VREF 1 // A0 A1 A2 A5 E0 E1 E2 VRefh=A3
#define AN0_AN1_AN2_AN3_AN4 2 // A0 A1 A2 A3 A5
#define AN0_AN1_AN2_AN4_VSS_VREF 3 // A0 A1 A2 A4 VRefh=A3
#define AN0_AN1_AN3 4 // A0 A1 A3
#define AN0_AN1_VSS_VREF 5 // A0 A1 VRefh=A3
#define AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF 0x08 // A0 A1 A5 E0 E1 E2 VRefh=A3 VRefl=A2
#define AN0_AN1_AN2_AN3_AN4_AN5 0x09 // A0 A1 A2 A3 A5 E0
#define AN0_AN1_AN2_AN4_AN5_VSS_VREF 0x0A // A0 A1 A2 A5 E0 VRefh=A3
#define AN0_AN1_AN4_AN5_VREF_VREF 0x0B // A0 A1 A5 E0 VRefh=A3 VRefl=A2
#define AN0_AN1_AN4_VREF_VREF 0x0C // A0 A1 A4 VRefh=A3 VRefl=A2
#define AN0_AN1_VREF_VREF 0x0D // A0 A1 VRefh=A3 VRefl=A2
#define AN0 0x0E // A0
#define AN0_VREF_VREF 0x0F // A0 VRefh=A3 VRefl=A2
#define ANALOG_RA3_REF 0x1 //!old only provided for compatibility
#define A_ANALOG 0x2 //!old only provided for compatibility
#define A_ANALOG_RA3_REF 0x3 //!old only provided for compatibility
#define RA0_RA1_RA3_ANALOG 0x4 //!old only provided for compatibility
#define RA0_RA1_ANALOG_RA3_REF 0x5 //!old only provided for compatibility
#define ANALOG_RA3_RA2_REF 0x8 //!old only provided for compatibility
#define ANALOG_NOT_RE1_RE2 0x9 //!old only provided for compatibility
#define ANALOG_NOT_RE1_RE2_REF_RA3 0xA //!old only provided for compatibility
#define ANALOG_NOT_RE1_RE2_REF_RA3_RA2 0xB //!old only provided for compatibility
#define A_ANALOG_RA3_RA2_REF 0xC //!old only provided for compatibility
#define RA0_RA1_ANALOG_RA3_RA2_REF 0xD //!old only provided for compatibility
#define RA0_ANALOG 0xE //!old only provided for compatibility
#define RA0_ANALOG_RA3_RA2_REF 0xF //!old only provided for compatibility

19
set_adc_channel( )
Syntaxe: set_adc_channel (chan)
Paramèters: chan est le numéro de canal à sélectionner. Les numéros des canaux commencent
à 0 et ils sont mentionnés dans le datasheet comme AN0, AN1, …,AN7.
Returns: indéfini.

Fonction: Elle indique le canal à utiliser pour le prochain appel de READ_ADC. Soyez conscient
que vous devez attendre un peu de temps après avoir changer le canal avant de pouvoir obtenir
une lecture valide. La durée varie en fonction de l'impédance de la source d'entrée.
En général, 10 μs sont suffisantes pour la plupart des applications.
Vous n’avez pas besoin de changer le canal avant chaque lecture si le canal ne change pas.
Disponibilité: Cette fonction n’est disponible que sur les PICs avec un convertisseur AN.

Examples:
set_adc_channel(2);
delay_us(20);
value = read_adc();
20
read_adc( )
Syntax: value = read_adc ([mode])
Parameters: mode est un paramètre facultatif. S’il est utilisé, les valeurs peuvent être:
ADC_START_AND_READ (continually takes readings, this is the default)
ADC_START_ONLY (starts the conversion and returns)
ADC_READ_ONLY (reads last conversion result)
Returns: soit un entier int8 ou int16E en fonction de la directive #DEVICE ADC= directive.
Function: Cette fonction va lire la valeur numérique du convertisseur analogique-numérique..
Les appels à setup_adc(), setup_adc_ports() et set_adc_channel() doit être faite un peu avant
que cette fonction est appelée.
Examples:
setup_adc( ADC_CLOCK_INTERNAL );
#DEVICE 8 bit 10 bit 11 bit 12 bit 16 bit
setup_adc_ports( ALL_ANALOG );
ADC=8 00-FF 00-FF 00-FF 00-FF 00-FF set_adc_channel(1);
ADC=10 x 0-3FF x 0-3FF x while ( input(PIN_B0) ) {
ADC=11 x x 0-7FF x x delay_ms( 5000 );
ADC=16 0-FF00 0-FFC0 0-FFEO 0-FFF0 0-FFFF value = read_adc();
printf("A/D value = %2x\n\r", value);
}
read_adc(ADC_START_ONLY);
sleep();
value=read_adc(ADC_READ_ONLY);
21
adc_done( )
Syntax: value = adc_done();
Parameters: None
Returns: A short int. TRUE if the A/D converter is done with conversion, FALSE if it is still busy.
Function: Can be polled to determine if the A/D has valid data.
Availability: Only available on devices with built in analog to digital converters
Requires: None

Examples:
int16 value;
setup_adc_ports(AN0_AN1_VSS_VREF);
setup_adc(ADC_CLOCK_DIV_4|ADC_TAD_MUL_8);
set_adc_channel(0);
read_adc(ADC_START_ONLY);

int1 done = adc_done();


while(!done) {
done = adc_done();
}
value = read_adc();
printf(“A/C value = %LX\n\r”, value);
} 22
23
PIC16F877A ADC example with CCS PIC C compiler
The microcontroller PIC16F877A has 8 ADC (Analog to Digital Converter) channels. The resolution
of the PIC16F877A ADC is 10-bit, which means the analog value after conversion is stored as a 10-
bit number that varies from 0 to 1023 (0x3FF). The A/D module has high and low-voltage reference
input that is software selectable to some combination of VDD, VSS, RA2 or RA3.
PIC16F877A ADC example with CCS C:
This is an example to start with the ADC module, example circuit schematic is shown below:

The LCD used to display the analog value


after conversion where channel 0 (RA0) is
the analog input and analog signal can be
changed from the potentiometer. The
output analog voltage of the potentiometer
varies from 0V to 5V.
The reference voltage is set to VDD (+5V)
and GND.
24
25
26
27
Unipolar stepper motor control using PIC16F877A microcontroller
Interfacing unipolar stepper motor with PIC16F877A: This post shows how to control
speed and rotation direction of unipolar stepper motor using PIC16F877A
microcontroller and CCS PIC C compiler.
Usually the unipolar stepper motor has 5 wires one for motor supply and the other for
coils. This motor has 4 coils and they are connected as shown in the figure below:

The unipolar stepper motor can be controlled in full step mode or half step mode, the
usual method is the full step driving mode. The following table shows driving sequences:
STEP A B C D

1 0 0 1 1

2 0 1 1 0

3 1 1 0 0

4 1 0 0 1
28
Interfacing PIC16F877A with unipolar stepper motor circuit
 In the circuit there are 2 pushbuttons which are connected to RB0 and RB1 pins, they are used to
choose motor rotation direction.
 To control the stepper motor speed a potentiometer (10K) is used and it is connected to analog
channel 0(AN0).
 ULN2003 (or ULN2004) chip is used to energize the stepper motor coils.
 The ULN2003(ULN2004) is a Darlington transistor array which contains seven open collector
Darlington pairs with common emitters. For stepper motor controller we need 4 transistors form
this chip which means 4 inputs and 4 outputs are needed.

29
Interfacing PIC16F877A with unipolar stepper motor circuit
 Instead of the ULN2003 chip, another chip can be used which is L293D dual H-bridge circuits as
shown in the circuit schematic below.
 For the L293D chip VS voltage always +5V and VSS voltage is the same as the motor voltage for
example if the motor voltage is 12V VSS should be connected to +12V power supply.

30
31
Bipolar stepper motor control with PIC16F877A microcontroller
Cd-Rom bipolar stepper motor control using PIC16F877A microcontroller and CCS PIC C compiler
 Most of cd-rom or dvd-rom drives has a bipolar stepper motor, this motor has two windings and
each winding has 2 inputs which means that this type of motor has 4 wires.
 This topic shows circuit schematic and C code for controlling the bipolar
stepper motor speed and direction using PIC16F877A microcontroller.
 The stepper motor can be controlled in full step mode or half step mode.
 The full step mode is a little bit easier than the half step control mode. In this
topic the full step control mode is used.
 To control the bipolar stepper motor we need two H-bridge circuits and for that L293D motor
driver chip is used, this cheap chip can work as a dual H-bridge drivers.
 In the full step control mode always both windings are energized according to the following two
tables:

 where table1 shows the driving sequence for  And the following table shows driving
rotation direction 1: sequence for the other rotation direction

32
Interfacing PIC16F877A with bipolar stepper motor circuit
 The following image shows circuit schematic diagram of this project where two pushbuttons are
used to choose motor rotation direction and a potentiometer to control motor speed.
 PortB internal pull-ups are enabled in the C code.

 A pot connected to AN0 is used to control the speed of the stepper motor.
 The microcontroller reads the analog data from AN0 and uses the digital value to change the
delay between motor driving phases and when the delay increases the motor speed decreases and
vise versa.
 The two pushbuttons which are connected to RB0 and RB1 are used to choose motor rotation
direction and when RB0 button pressed the driving sequence follows the first table above and when
RB1 button is pressed the driving sequence follows the second table. 33
 8-bit ADC resolution is used.
34
35
36
http://blog.ghatasheh.com/2012/01/pic16f877a-and-lm35-based-temperature.html
https://www.youtube.com/watch?v=qr84YO2hMtw

37
http://320volt.com/en/ccs-lm35-temperature-sensor-example-with-pic16f877-lcd/

38
39
MPLAB PROGRAMMING USING HI-TECH PIC16 COMPILER while(1)
#include<htc.h> {
#define _XTAL_FREQ 4000000 t=(adc()*500)/1024;
int h; a=t/10;
int adc(); b=t%10;
int adc() if(t>=25)//this is for buzzer
{ {
ADCON1=0x80; PORTD=0x02;
ADCON0=0x01; }
ADGO=1; PORTC=0x02;
while(ADGO==1); PORTB=arr[a];
h=ADRESH; __delay_ms(5);
h<<8; PORTB=0xff;
h=h+ADRESL; PORTC=0x01;
return(h); PORTB=arr[b];
} __delay_ms(5);
main() PORTB=0xff;
{ }
int }
i,a,x,t,b,arr[]={0x03,0x9f,0x25,0x0d,0X99,0X49,0Xc1,0x1f,0x0
1,0x19};
TRISB=0x00;
TRISC=0x00;
TRISD=0x00;
PORTB=0xff;
PORTD=0x00;

40
http://exeltronic.blogspot.com/2016/03/detecteur-dobjet-distance-sensor.html
http://exeltronic.blogspot.com/2015/01/capteur-temperature-tc1047a-et.html
https://www.youtube.com/watch?v=hcxOs4dKE_E&list=PLwX8VyNMoKQ5uWLt6fkuyfQmxd9W3T
https://www.youtube.com/watch?v=XPtTGaOB3no&list=PLwX8VyNMoKQ5uWLt6fkuyfQmxd9W3T
https://www.youtube.com/watch?v=d2xkvs7Fi-k&index=6&list=PL4YGUrOWs0NQTR11bc7AU35rs

https://www.youtube.com/watch?v=qOO8Kggzz1E&list=PLF-qcfymUY4VvPaoquGoQ5auW_n968P4
https://www.youtube.com/watch?v=We0O2gsx4Bw
https://www.youtube.com/watch?v=uByfh_VDpRw&list=PLMFrcR3zyPe_BUvi1y3nzE4GNEqkUNkZ
https://www.youtube.com/watch?v=eYDQLs5iD2A&list=PLMFrcR3zyPe_BUvi1y3nzE4GNEqkUNkZK
https://www.youtube.com/watch?v=rmuK6bY-aiI&list=PLMFrcR3zyPe_BUvi1y3nzE4GNEqkUNkZK&
https://www.youtube.com/watch?v=iyCSJsZNm9E&list=PLMFrcR3zyPe_BUvi1y3nzE4GNEqkUNkZK
https://www.youtube.com/watch?v=yCDCaPQU_Xw&list=PLMFrcR3zyPe_BUvi1y3nzE4GNEqkUNk
https://www.youtube.com/watch?v=rRi6oCehEPM&list=PLMFrcR3zyPe_BUvi1y3nzE4GNEqkUNkZK
https://www.youtube.com/watch?v=Zr5g2jTRk0Q&list=PLMFrcR3zyPe_BUvi1y3nzE4GNEqkUNkZK
https://www.youtube.com/watch?v=P8rcSEd4Q3k&index=9&list=PLF-qcfymUY4VvPaoquGoQ5auW

41
42

Vous aimerez peut-être aussi