Vous êtes sur la page 1sur 69

Qu’est ce qu’un Microcontrôleur

C’est un ordinateur monté dans un circuit intégré.

Ordinateur = trois parties :


La mémoire
 Le processeur
Les périphériques
Les mémoires: stocker le programme qui sera
exécuté ainsi que les données nécessaires et les
résultats obtenus.
 Le processeur C’est le cœur du système:
Exécution du programme
 Les périphériques : Connecter le processeur avec le
monde extérieur dans les deux sens. Soit le processeur
fournit des informations vers l’extérieur (périphérique
de sortie), soit il en reçoit (périphérique d’entrée).
Clavier, souris, imprimante, écran……
Architecture Von Neumann

La mémoire contient le code des instructions et les données


2cycles d’horloge pour exécuter l’instruction
Architecture Harvard

1 mémoire contient le code des instructions


1 autre contient les données
1 seul cycle d’horloge pour exécuter l’instruction
L’architecture Von Neumann utilise un seul
bus pour effectuer des extractions
d’instructions et des transferts de données
(l’exécution se fait en 2 cycles d’horloge).
L’architecture de Harvard, en revanche, utilise
deux adresses de mémoire distinctes pour les
données et les instructions, ce qui permet
d’alimenter des données simultanément dans
les deux bus données (l’exécution se fait en 1seul
cycle d’horloge)
Qu’est-ce qu’un microcontrôleur 
Avec l’évolution de la technologie on a implanté sur une
puce de silicium de quelques millimètres carrés la totalité
des composants qui forment la structure de base d’un
ordinateur.
Un microcontrôleur est donc un Circuit Intégré qui
rassemble les élément essentiels d'un Micro ordinateur :
processeur, mémoires (mémoire morte pour le
programme, mémoire vive pour les données), unités
périphériques et interfaces. Comme tout ordinateur, on
peut décomposer la structure interne d’un microcontrôleur
en trois parties :
-Les mémoires
-Le processeur
-Les périphériques
Le PIC 16f84

PIC (Programmable Interface Controler): microcontrôleur,


fabriqué par la Société américaine Arizona MICROCHIP
Technology.

Le microcontrôleur (Le PIC 16f84) est un système qui


exécute des instructions les unes après les autres à une
vitesse (fréquence) qui est fixée par une horloge interne
au circuit. Cette horloge doit être stabilisée de
manière externe au moyen d’un cristal de quartz
connecté aux pattes OSC1/CLKIN (patte 16) et
OSC2/CLKOUT (patte15).
Différentes séries de PIC
Identification des PIC
Les PICs sont des composants RISC (Reduce Instructions Set
Construction), ou encore composant à jeu d’instructions
réduit. L'avantage est que plus on réduit le nombre
d’instructions, plus facile et plus rapide en est le
décodage, et plus vite le composant fonctionne.

3 grandes familles des PICs :


 La famille Base-Line: Utilise des mots d’instructions de 12
bits,
 La famille Mid-Range: Utilise des mots de 14 bits (et dont
font partie la 16F84 et 16F876),
La famille High-End: Utilise des mots de 16 bits (18FXXX).
Les 2 premiers chiffres indiquent la catégorie du
PIC, 16 indique un PIC Mid-Range.
 Vient ensuite parfois une lettre L:
le PIC peut fonctionner avec une plage de tension
beaucoup plus tolérante.
 Vient en suite une ou deux lettres pour indiquer le
type de mémoire programme :
- C indique que la mémoire programme est une EPROM
ou plus rarement une EEPROM
- CR pour indiquer une mémoire de type ROM
- F pour indiquer une mémoire de type FLASH.
 On trouve ensuite un nombre qui constitue la
référence du PIC. 16F84
Architecture interne
Architecture interne du PIC 16F84
Principales caractéristiques du PIC 16F84:
- 13 lignes d’entrées/sorties, réparties en un port de 5
lignes (Port A) et un port de 8 lignes (Port B)
- 1 mémoire de programme pouvant contenir 1.019
instructions de 14 bits chacune (allant de l’adresse 005
à l’adresse 3FF)
- une mémoire RAM utilisateur de 68 octets (de
l’adresse 0C à l’adresse 4F)
- une mémoire RAM de 2x12 emplacements réservée
aux registres spéciaux
- une mémoire EEPROM de 64 emplacements (allant
de l’adresse 00 à l’adresse 3F).
- vecteur de Reset situé à l’adresse 000
- un vecteur d’interruption, situé à l’adresse 004
Consommation : 2mA sous 5V à 4 MHz;
-Architecture RISC : 35 instructions de durée 1 ou 2cycles.
-une horloge interne;
-Deux bus distincts pour le code programme et les data.
- Compteur programme (PC) sur 13 bits, ce qui permet
d'adresser 8 K mots ( de h'0000' à h'1FFF')
Brochage et caractéristiques principales
Le PIC16F84 est un circuit intégré de 18 broches:
MCLR =Master CLear Reset (patte 4) : Elle permet
lorsque la tension appliquée est égale à 0V de
réinitialiser le microcontrôleur. C’est à dire que si un
niveau bas (0 Volt) est appliqué sur MCLR le
microcontrôleur s’arrête, place tout ses registres dans
un état connu et se redirige vers le début de la mémoire
de programme pour recommencer le programme au
début (adresse dans la mémoire de programme : 0000).
A la mise sous tension, la patte MCLR étant à zéro, le
programme démarre donc à l’adresse 0000
Les broches RB0 à RB7 et RA0 à RA4 :
Lignes d’entrées/sorties numériques. Elles permettent
au microcontrôleur de dialoguer avec le monde
extérieur (périphériques).
Nombre: 13
RB0 à RB7 forme le port B
RA0 à RA4 forment le port A.
peuvent être configurées en entrée ou en sortie.
Certaines de ces broches ont aussi d’autres fonctions
(interruption, timer).
Organisation de la mémoire du PIC 16F84
La mémoire du PIC 16F84 est répartie en trois espaces:
1/ Une mémoire de programme: de 1 K mots (1024*14
bits allant de l’adresse 000 à l’adresse 3FF. On peut donc
stocker 1024 instructions.)
C’est une EEPROM de type flash, c’est-à-dire qu’elle peut
être programmée et effacée par l’utilisateur via un
programmateur et un PC.
2/ une mémoire de données EEPROM de 64 octets dans
laquelle on peut lire et écrire des données 8bits et qui
possède l’avantage d’être non volatile

3/Une mémoire RAM à 8 bits, que Microchip appelle


Register File, réservée aux données; il s’agit d’une RAM
statique (SRAM).
Exercices de programmation du PIC 16f84 
void main() void main() {
{ TRISB=0;
trisa=4; PORTB=0;
trisb= 0; for(;;)
porta=0; {
portb=0;
while(1) PORTB=~PORTB;
{ delay_ms (50);
if(ra2_bit==0) //ou if porta=0; }
{portb=1;delay_ms(60); }
portb=0;delay_ms(60); }
else { portb=2;delay_ms(60);
portb=0;delay_ms(60);}
}
}
 
Que fait ce programme ?
Chenillard

void main()
{
int i; char C;
TRISB=0;
while(1)
{ C=1; PORTB=C;
Delay_ms(60);
for(i=1;i<=7;i++)
{ C=C<<1; PORTB=C;
delay_ms(70); }
}
}
Compteur avec résultats sur afficheur 7 segments

void main()
{
int i;
Char t[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
trisb=0; portb=0;
while(1)
{ for(i==0;i<=9;i++)
{portb=t[i] ; delay_ms(500);}
i=0; }
}
Si K0 fermé seule d1 allumée; Si K1 fermé seule d2 allumée
Si K2 fermé seule d2 allumée. Si K0 K1 K2 fermés simultanément
toutes les leds éteintes
void main()
{ int k;
TRISB=0 ; TRISD=0xff;
PORTD=0; PORTB=0;
while(1)
{ //k=portd; if(k==…………….)
if(portd.f0==0&&portd.f1==1&&portd.f2==1) portb.f0=1;
else portb.f0=0;
if(portd.f1==0&&portd.f2==1&&portd.f0==1) {portb.f1=1;
portb.f0=0;}
else portb.f1=0;
if(portd.F2==0&&portd.F1==1&&portd.F0==1){portb.f2=1;
portb.f1=0;portb.f0=0;}
else portb.f2=0;
if(portd.f2==0&&portd.f1==0&&portd.f0==0) portb=0;
}
}
ZONE GPR:
Elle contient des mots de 8 bits. On peut y accéder par
adressage direct ou indirect ( en utilisant le registre FSR qui
sera vu plus tard). Les adresses GPR en page 1 sont
confondues avec celles de la page 0. On atteint la même
adresse en RAM quand on adresse en h'0C' ou en h'8C'.
ZONE SFR:
Elle contient les registres utilisés par le microcontrôleur et les
périphériques internes pour contrôler le fonctionnement du
circuit. Ces registres sont du type RAM Statique. Ils son
répartis dans les deux pages BANK 0 et BANK 1. Ils occupent
les 12 premiers octets de ces deux pages.
ORGANISATION de la MEMOIRE DATA :
Elle est constituée de deux zones :
- La zone SFR (Special function registers) qui contient les registres
de configuration et de fonction du microcontrôleur.
- La zone GPR ( General Purpose Register ) qui contient la RAM.
Elle est découpée en deux pages : Bank 0 et Bank 1. L'accès à la
Bank 0 se fait en positionnant le bit 5 du registre STATUS (RP0) à
"0". Pour l'accès à la Bank 1 on doit mettre ce bit à "1".
Chaque page contient 128 bits (de 00 à 7f), et nécessite donc 7
bits d'adresse. Les 12 premiers octets de chaque page sont
réservés pour la zone SFR. Le reste est attribué à la zone GPR
pour de la RAM.
La Conversion Analogique Numérique

long adc_value;
unsigned char d1,d2,d3,d4;

long adc_value,x; //long obligatoire


vstring[10];
void main() {

ANSEL=0x04; // port en mode analogique


ANSELH=0;
TRISA=0xFF;
TRISD=0;
for(;;) {

ADC_VALUE=ADC_READ(2);
ADC_VALUE=ADC_VALUE*1300/1023;
PORTD=ADC_value
}
}
ADC - LCD
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
//*************************************
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
unsigned char d1,d2,d3,d4;
long adc_value; //long obligatoire
void main() {

ANSEL=0x04; // port A en mode analogique


ANSELH=0; // port mode analogique
TRISB=0x00;
TRISA=0xFF;
LCD_init();
LCD_cmd(_LCD_CLEAR);
LCD_cmd(_LCD_CURSOR_OFF);
LCD_OUT(1,1,"ADC val-temperat ");
for(;;)
{
ADC_VALUE=ADC_READ(2);
ADC_VALUE=ADC_VALUE*1300/1023;
d1=adc_value/1000; d2=(adc_value%1000)/100;
d3=(adc_value%100)/10; d4=adc_value%10;
LCD_chr(2,12,48+d1); LCD_chr_cp(d2+48);
LCD_chr_cp(d3+48);
LCD_chr_cp(d4+48);
delay_ms(20); lcd_out(2,10," degre");
}
}
void main() Operateur switch - case
{ trisB=0X0F; trisD=0;
portB=0; portD=0;
for(;;) {
switch( portb)
{
case 1: portd=1;delay_ms(100); break;
case 2: portd=2;delay_ms(100); break;
case 3: portd=3;delay_ms(100); break;
case 4: portd=4;delay_ms(100); break;
case 5: portd=5;delay_ms(100); break;
}
}
}
Operateur switch - case
void main(void) Décodeur 7 segments
{
char C;
const unsigned char
ta[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77, 0x7c,0x39,0x5e,0x7b,0x71};
TRISD=0;
TRISB=0xff;
PortD=0; PortB=0;
for(;;)
{
C=PORTB; PORTD=ta[C];
}
}
Décodeur 7 segments
Commande d’un moteur à courant continu
Commande d’un moteur à courant continu

void main(){
trisd=0;portd=0;
for(;;)
{portd=1; delay_ms(500);
portd=0; delay_ms(500); }}
Revisions

-Si RD0=1 la led reliée au PORTC clignote


-Si RB4=1 la led reliée au PORTC clignote
void main()
{trisd=1;
trisb=0x10;trisc=0;trisa=4;
porta=0;portd=0;portc=0;portd=0;
while(1){
if(RD0_bit==1)
{RC7_bit=1; delay_ms(60);
RC7_bit=0; delay_ms(60);}
if(RB4_bit==1)
{RB5_bit=1; delay_ms(60);
RB5_bit=0; delay_ms(60);}
}}
Le port série

RS-232  (appelé  port série) est une norme standardisant un


bus de communication de type série sur trois fils minimum
Le port série

RS-232  (appelé  port série) est une norme standardisant un


bus de communication de type série sur trois fils minimum
les ports RS-232 sont désignés par les noms COM1, COM2,
etc. Il sont de plus en plus remplacés par le port USB.
Réalisation d'un convertisseur de niveaux

 Les niveaux RS232 diffèrent des signaux logiques


normaux car ils opèrent en + 12V et - 12V.
 Pour connecter des signaux de niveau RS232 à nos
microcontrôleurs il nous faut un "convertisseur de
niveaux. Il a pour effet de convertir les signaux niveau
RS232 (HIGH=-12V LOW=+12V) du PC vers les niveaux
TTL (HIGH=+5V LOW=0V) du MCU et le contraire.

Il existe un circuit dédié conçu à cet effet, le MAX232.


Comparaison entre la transmission en série et
la transmission en parallèle
 Une liaisons série est moins exposée à la diaphonie ;

 Une liaison série requiert un nombre de lignes de


communication plus faible ce qui permet de libérer de la
place, qui peut servir à améliorer la 
compatibilité électromagnétique.

 Une liaison série requiert un nombre de lignes de


communication plus faible, et donc un gain de broches
particulièrement intéressant pour les micro-puces puisqu'il
entraine une diminution de la taille et donc du prix de
celles-ci.
On nomme diaphonie (parfois « bruit » ou « crosstalk »
en anglais) l'interférence d'un premier signal avec un
second. On trouve des traces du premier signal, dans le
signal du second, souvent à cause de phénomènes d'
induction électromagnétique.

La compatibilité électromagnétique (CEM) est l'aptitude


d'un appareil ou d'un système électrique, ou électronique
, à fonctionner dans son environnement 
électromagnétique de façon satisfaisante, sans produire
lui-même des perturbations électromagnétiques
intolérables pour tout ce qui se trouve dans cet
environnement.
char uart_rd;
void main()
{
UART1_Init(9600); // Initialize UART module at 9600 bps
Delay_ms(100); // Wait for UART module to stabilize
UART1_Write_Text("Start");
while (1) { // Endless loop
if (UART1_Data_Ready()) // If data is received,
{
uart_rd = UART1_Read(); // read the received data,
UART1_Write(13);
UART1_Write_Text("received ");

UART1_Write(uart_rd); // and send data via UART


}
}
}
char k;
int i;
void main() {
UART1_Init(9600);
Delay_ms(100);
for (k='A';k<='Z';k++)
{ UART1_Write(k);delay_ms(100);
UART1_Write('*'); delay_ms(100);
}
UART1_Write(13);
for (i=0;i<=9;i++)
{ UART1_Write(i+48);delay_ms(100);
UART1_Write('*');
delay_ms(100); }
}
UART ADC
UART- ADC-PIC 16f877
unsigned char d1,d2,d3,d4;
Unsigned long valeur_acquise ;
void main() {
TRISA = 0xFF; // PORTA is input
uart1_init(9600); delay_ms(100);
While(1)
{valeur_acquise=adc_read(2) ;
valeur_acquise= valeur_acquise*1200/1023;
d1= valeur_acquise/1000; d2= (valeur_acquise%1000)/100;

d3=(valeur_acquise%100)/10; d4= valeur_acquise%10;


uart1_write_text(" Temperature acquise");
UART1_write(48+d1); UART1_write(48+d2);
UART1_write(48+d3); UART1_write(48+d4);
delay_ms(5000);
UART1_write(13);
}
Tapez A svp port série
char ch;
UART1_Init(9600);
Delay_ms(100);
UART1_Write_Text("tapez su A svp ");
while (1) {
if (UART1_Data_Ready())
{ch = UART1_Read();//read the received data,
UART1_Write(ch);UART1_Write(13);
if(ch== 'A')
UART1_Write_Text("OK Au revoir ");
else
{
UART1_Write_Text("Mais non vous vous etes trompes ");
UART1_Write(13);
UART1_Write_Text("tapez sur le A svp ");
}
}
}
}
Port série: Addition de 2 nombres résultat<10
char ch; int i,k,k1,k2,val,val1,un,dis;
void main()
{
UART1_Init(9600); // Initialize UART module at 9600 bps
Delay_ms(100); // Wait for UART module to stabilize
UART1_Write_Text("votre premier nombre: ");
while(i<=1)
{ if (UART1_Data_Ready())
{ ch= UART1_Read();
if(i==0)
{
UART1_Write(ch);
UART1_Write(13);
k1=ch-48;
UART1_Write_Text("votre deuxieme nombre: ");
}
Port série: Addition de 2 nombres résultat<10
if(i==1)
{
k2=ch-48; UART1_Write(ch);
}
i++;
}
}
UART1_Write(13);
val=k1+k2; UART1_Write(13);
UART1_Write_Text("votre somme est: ");
UART1_Write(dis+48);UART1_Write(un+48);
}
UART-Arduino
int i, un, dis;
void setup() {
Serial.begin(9600);
delay(500);
Serial.print("Hello,World");Serial.write(13);
delay(3000); // Wait 3sec.
}
void loop() {
for(i=0;i<=30;i++){ un=i/10;dis=i%10;
Serial.write(un+48);Serial.write(dis+48);
Serial.write(13);
delay(1000);}
}
UART-ADC-Arduino
UART-ADC-Arduino
Acquisition de la température Val. Max. 500
degrés celsius
void setup() {
// initialize serial communication at 9600 bits /s
Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop() {
// read the input on analog pin 0 (A0)
int sensorValue = analogRead(A0);
float voltage = sensorValue * (500.0 / 1023.0);
Serial.println(voltage);
delay(1500);
}
UART ADC

Vous aimerez peut-être aussi