Vous êtes sur la page 1sur 9

 Introduction

Le cour se porte sur les Systèmes à base de Microcontrôleur, comment on peut les utiliser pour
contrôler une machine externe comme une pompe, une lampe, un moteur ...etc.

Pour cela, il faut comprendre le fonctionnement de ces microcontrôleurs. Ce chapitre ce compose de


trois partie sur le PIC 16F877:

- Les Entrées/Sorties (PORTA, PORTB).

- Le Timer ou le compteur TMR0.

- Le Convertisseur Analogique Numérique CAN à 10 bits.

ET un rappelle sur la programmation langage C.

 • Les boucles en langage CPage

 • Opérateurs Arithmétique et logiquePage

 • Les opérateurs de décalagesPage

 • Les matricesPage

 • Les fonctionsPage

 Les structures conditionnellesPage

 DESCRIPTION PIC 16F877


 Le PIC 16F877 a une Architecture RISC : 35 instructions de durée 1 ou 2 cycles.

- Durée du cycle : Période de l'oscillateur quartz divisée par 4 soit 200 ns pour un
quartz de 20 MHz.

- Deux bus distincts pour le code instruction et les data.

- Code instruction : mot de 14 bits et compteur programme (PC) sur 13 bits, ce qui
permet d'adresser 8 K mots ( de h'0000' à h'1FFF').

- Bus de donnée DATA sur 8 bits. Pour chaque adresse, vous avez une donnée 8
bits (1 octet).

∙∙ 368 Octets de RAM.

∙∙ 256 Octets d'EEPROM Data.


∙∙ 8K mots de 14 bits en EEPROM Flash pour le programme (code
instruction)(h'000' à h'1FFF').

∙∙ 1 registre de travail : W et un registre fichier : F permettant d'accéder à


la RAM ou aux registres internes du PIC. Tous les deux sont des registres
8 bits.

- 33 Ports Entrée-Sortie bidirectionnels pouvant produire 25 mA par sortie. PORTA


= 6 bits et PORTB PORTC et PORTD = 8bits PORTE = 3 bits pour le 16F877.

- 2 Compteurs 8 bits et 1 compteur 16 bits avec pré diviseur programmable.

- Un convertisseur analogique 10 bits à 8 entrées pour le 16F877.

- 4 sources d'interruption :

∙∙ Externe par la broche partagée avec le Port B : PB0

∙∙ Par changement d'état des bits du Port B: PB4 PB5 PB6 ou PB7

∙∙ Par un périphérique intégré dans le chip: écriture de Data en EEPROM


terminée, conversion analogique terminée, réception USART ou I2C.

∙∙ Par débordement du Timer.

- UART pour transmission série synchrone ou asynchrone, et une Interface I2C et 2 modules
pour PWM avec une résolution de 10 bits.

- Une Interface avec un autre micro: 8 bits + 3 bits de contrôle pour R/W et CS.

 Les Entrées/Sorties
 ∙∙PORTA :

Ce port bidirectionnel est constitué de 6 bits (entrées/sorties). Le registre de direction


correspondant est TRISA. Quand on écrit un "1" dans TRISA , le bit correspondant du
PORTA est configuré en entrée. Si on écrit un "0" dans TRISA, le bit correspondant du
PORTA devient une sortie.
Le bit 4 du PORTA peut également servir pour l'entrée horloge du timer TMR0. Les autres
bits du Port sont partagés avec le CAN. Par défaut le PORTA est en mode Analogique. il faut
le configurer en mode binaire (numérique) en utilisant le registre ADCON1=0x06.

∙∙PORTB :
Ce port bidirectionnel est constitué de 8 bits (entrées/sorties). Le registre de direction
correspondant est TRISB nous permet de configurer chaque bits du PORTB soit entrée ou en
sortie (comme le PORTA). Une entrée interruption externe via le bit du PORTB qui est PB0.

∙∙ PORTC :
Il s'agit d'un PORT 8 bits bidirectionnel. Il est partagé avec le module
de transmission synchrone I2C et l'USART.

∙∙ PORTD :
8 entrées-sorties.Port interface micro processeur (8 bits data).

∙∙PORTE :
3 entrées-sorties. 3 bits de contrôle interface micro. 3 entrées du CAN.

 Exemple 1 :

Sois un bouton poussoir brancher sur le PORTB (du pin B0). Ce bouton commande
l'allumage d'une led brancher sur le PORTC (du pin C0). Si on appuie sur le bouton poussoir
la lampe s'allume. Si on relâche le bouton poussoir la lampe s'éteint.

Pour résoudre le problème, il faut identifier les entrées et les sorties du système d'allumage.
Le PORTB.RB0 est l'entrée du système et le PORTC.RC0 est la sortie du système brancher
sur une led. pour configurer le PORTB en entrée, on a besoin du registre TRISB même chose
pour le PORTC, on utilise TRISC.

void main(){
ADCON1=0x06;// il faut configurer tout les pins du PORTA en mode
numérique (binaire). Pour l'utiliser comme une entrée/sortie binaire.
TRISB=0xFF; // configuré tout les pins du PORTB en entrée.
TRISC=0xFE; // configuré le pin RC0 du PORTC en sortie et les autres
RC7..RC1 en entrées.
PORTC=0x00; // la led brancher à RC0 est éteint.
if(PORTB.RB0==1) PORTB.RC0=1; else PORTC.RC0=0;
}
Ce programme ne marchera pas, il s’arrête seulement après quelque microseconde avant
même de commencer notre manipulation. Donc il faut que le système (UC) scrute le PORTA
en permanence. C'est pour sa, on utilise une boucle infinie do{}while(1). Appelé aussi
scrutation logiciel.

void main(){
ADCON1=0x06;// il faut configurer tout les pins du PORTA en mode numérique
(binaire). Pour l'utiliser comme une entrée/sortie binaire.
TRISB=0xFF; // configuré tout les pins du PORTB en entrée.
TRISC=0xFE; // configuré le pin RC0 du PORTC en sortie et les autres RC7..RC1
en entrées.
PORTC=0x00; // la led brancher à RC0 est éteint.
do {
if(PORTB.RB0==1) PORTC.RC0=1; else PORTC.RC0=0;
}while(1);
}
 Exemple 2 :

Sois un bouton poussoir brancher sur le PORTB (du pin B0). Ce bouton commande
l'allumage d'une led brancher sur le PORTC (du pin C1). Si on appuie sur le bouton poussoir
la lampe s'allume. Si on relâche le bouton poussoir la lampe reste allumer .

Les entrées et les sorties du système d'allumage sont le PORTB.RB0 est l'entrée du système
et le PORTC.RC1 est la sortie du système brancher sur une led. Pour configurer le PORTB
en entrée, on a besoin du registre TRISB même chose pour le PORTC, on utilise TRISC.

void main(){
ADCON1=0x06;// il faut configurer tout les pins du PORTA en mode numérique
(binaire). Pour l'utiliser comme une entrée/sortie binaire.
TRISB=0xFF; // configuré tout les pins du PORTB en entrée.
TRISC=0b11111101; // configuré le pin RC1 du PORTC en sortie et les autres
RC7..RC2 et RC0 en entrées.
PORTC=0x00; // la led brancher à RC1 est éteint.
do{
if(PORTB.RB0==1) PORTC.RC1=1;
}while(1);
}
 Exemple 3 :

Sois un bouton poussoir brancher sur le PORTB (du pin B1). Ce bouton commande
l'allumage d'une led brancher sur le PORTC (du pin C2). Si on appuie sur le bouton poussoir
la lampe s'allume. Si on relâche le bouton poussoir la lampe reste allumer. Si on appuie à
nouveau sur bouton poussoir la lampe s'éteint. En relâchant le bouton poussoir la lampe reste
éteinte. Les entrées et les sorties du système d'allumage sont le PORTB.RB1 est l'entrée du
système et le PORTC.RC2 est la sortie du système.

Remarquez, que l'exemple 3 , ne correspond pas aux deux exemples précédent. Tout
simplement, les deux autres exemples traitent les systèmes combinatoires. Pour chaque
valeur d'entrée, il y a une seule valeur de sortie. Par contre, dans cet exemple, la valeur de
l'entrée a deux valeurs de sorties différentes. Par exemple, B=1 (bouton) →→ la lampe
allumée et B=1 (bouton) →→ la lampe éteinte. Donc notre système est un système
séquentiel. cela implique qu'il y a une mémorisation de l'état de la sortie PORTC.RC2.

Donc l'état mémorisé du système précédent est utilisé pour changer l'état suivant c.a.d :

PORTC.RC2=F(PORTC.RC2);

la fonction F est une fonction booléenne. à gauche l'état suivant (future) PORTC.RC2 et à
droite de l'équation l'état précédent (passé) PORTC.RC2.

Quelle est la fonction F, quand doit choisir. Remarquez que dans l'énoncé :

 L'état précédent PORTC.RC2=0 et B=1→→ l'état suivant PORTC.RC2=1


 L'état précédent PORTC.RC2=1 et B=1 →→ l'état suivant PORTC.RC2=0.

Donc la fonction F est un opérateur inverseur de valeur binaire '~' (complément à


1).

void main(){
ADCON1=0x06;// il faut configurer tout les pins du PORTA en mode numérique
(binaire). Pour l'utiliser comme une entrée/sortie binaire.
TRISB=0xFF; // configuré tout les pins du PORTB en entrée.
TRISC=0b11111101; // configuré le pin RC2 du PORTC en sortie et les autres
RC7..RC3 et RC1..RC0 en entrées.
PORTC=0x00; // la led brancher à RC2 est éteint.
do{
if(PORTB.RB1==1) {PORTC.RC2=~PORTC.RC2; delay_ms(400);}
}while(1);
}
 Le Timer TMR0
 Le compteur/Timer TMR0 a les caractéristiques suivantes :

- Compteur sur 8 bits.

- Lecture / écriture de TMR0.

- Prédiviseur 8 bits programmable.

- Choix de l'horloge : interne en Timer et externe en compteur.

- Interruption au débordement ( passage de FF à 00).

- Choix du front de l'horloge en mode horloge externe.

Tous les bits de configuration de TMR0 sont dans le registre OPTION_REG

a) Mode TIMER :

Le choix de ce mode se fait par : TOCS = 0 (b5 de OPTION_REG). TMR0 est incrémenté à
chaque cycle instruction ( Fosc/4), en considérant le prédiviseur avec un rapport de 1.

b) Mode COMPTEUR :

Ce mode est sélectionné si TOCS = 1. TMR0 est alors incrémenté à chaque front montant ou
descendant sur la broche PA4/CLK (pin3). Le choix du front est fait par le bit TOSE ( b4 de
OPTION).

Si TOSE = 0 le compteur s'incrémente à chaque front montant.

Si TOSE = 1 c'est le front descendant qui incrémente le compteur.

c) LE PREDIVISEUR :

Il est partagé entre le Watchdog et TMR0. L'affectation se fait par le bit PSA (b3 de
OPTION).

Si PSA = 0 le prédiviseur est affecté à TMR0. Le choix du rapport de division se


fait avec les bits PS2, PS1 et PS0 ( b2, b1 et b0 de OPTION).

Si PSA = 1 le prédiviseur est affecté au Watchdog et le rapport de division pour


TMR0 est fixé à 1.

d) INTERRUPTION :

Elle est générée quand TMR0 passe de la valeur FF à 00. Le Flag TOIF (b2 de INTCON)
passe à "1". On peut masquer la génération de l'interruption en mettant le bit TOIE ( b5 de
INTCON) à "0". Le Flag TOIF dit être remis à zéro par soft dans le sous programme
d'interruption, avant de re-autoriser cette interruption.

Vous aimerez peut-être aussi