Vous êtes sur la page 1sur 33

Microcontrôleur Application: clignotement des diodes LED

LOTFI CHARAABI -1-


Microcontrôleur Application: chasing a LED

début

PORTC en sortie
Initialiser j=1

PORTC=j
Décalage à gauche de j d’une position

j=0

j=1

wait 1 second

LOTFI CHARAABI -2-


Microcontrôleur Application: compteur avec affichage

1 second

LOTFI CHARAABI -3-


Microcontrôleur Application: 7-segment LED counter

début

PORTC en sortie
Création d’une table LCD[]. J=0

PORTC=LCD[J]
J=J+1

J=10

J=0

wait 1 second

LOTFI CHARAABI -4-


Microcontrôleur Programme d’interruption

 Une interruption est une fonction qui se déclenche suite a un


événement configuré en avance
 L’événement est qualifié comme une source d’interruption
 Le nombre des sources d’interruption change suivant le type
de microcontrôleur
 PIC18Fxx2 dispose de 10 registres pour gérer ses
interruptions
 INTCON, INTCON2, INTCON3, RCON
 PIR1, PIR2, PIE1, PIE2, IPR1, IPR2
LOTFI CHARAABI -5-
Microcontrôleur Programme d’interruption

 l’exécution d’une interruption est contrôlée par 3 bits des


registres de configuration d’interruption
 bit de FLAG qui indique l’occurrence d’interruption
 bit de validation qui assure le déroutement vers le
programme d’interruption si le bit de flag est à 1
 bit de priorité

LOTFI CHARAABI -6-


Microcontrôleur Interruption externe

 PIC18Fxx2 dispose de 3 sources d’interruption externe RB0,


RB1 et RB2
 les interruption externes sont gérées par les registres
 INTCON
 INTCON2
 INTCON3

LOTFI CHARAABI -7-


Microcontrôleur Interruption externe

INTCON

RB port change RB port change


interrupt enable interrupt Flag
RB7:RB4
Peripheral INT0 external INT0 Flag
interrupt enable interrupt enable

TMR0 interrupt TMR0 Flag


Global interrupt enable
enable

LOTFI CHARAABI -8-


Microcontrôleur Interruption externe

INTCON2

TMR0 priority bit


RB port change
priority
INT0 edge select INT2 edge select

INT1 edge select


PORTB pull-up enable

LOTFI CHARAABI -9-


Microcontrôleur Interruption externe

INTCON3

INT1 external INT1 Flag


interrupt enable
INT1 priority bit INT2 external
interrupt enable

INT1 Flag
INT2 Flag
INT2 priority bit

LOTFI CHARAABI - 10 -
Microcontrôleur Interruption externe

U1
13 15
R11 1
OSC1/CLKI RC0/T1OSO/T1CKI
16
MCLR/VPP RC1/T1OSI/CCP2A
17
1k RC2/CCP1
2 18
RA0/AN0 RC3/SCK/SCL
3 23
RA1/AN1 RC4/SDI/SDA
4 24
RA2/AN2/VREF- RC5/SDO
5 25
RA3/AN3/VREF+ RC6/TX/CK
6 26
RA4/T0CKI RC7/RX/DT
7
RA5/AN4/SS/LVDIN
14 19
RA6/OSC2/CLKO RD0/PSP0
20
RD1/PSP1
33 21
R8 34
RB0/INT0 RD2/PSP2
22
RB1/INT1 RD3/PSP3
10k
35
RB2/INT2 RD4/PSP4
27 D9
36 28
RB3/CCP2B RD5/PSP5
37 29
RB4 RD6/PSP6
38 30
RB5/PGM RD7/PSP7
39
RB6/PGC
40 8
RB7/PGD RE0/RD/AN5
9
RE1/WR/AN6
10
RE2/CS/AN7
PIC18F452

LOTFI CHARAABI - 11 -
Microcontrôleur Interruption périodique (timer)

On considère le timer 0 en mode 8 bits. Le temps nécessaire pour


l’interruption est:

T=(4 x Tclk) x Prescaler x (256-TMR0L)


Si Fclk=4MHz, Prescaler=32, T=5 ms => TMR0L=100

Le calibrage est effectué


avec le registre T0CON

LOTFI CHARAABI - 12 -
Microcontrôleur Timer Interrupt

Le calibrage de l’interruption est effectué avec le registre INTCON

Dans le programme d’interruption (ISR) il faut:


• Recharger (reload) le registre TMR0L.
• Revalider (reenable) la source d’interruption TMR0 interrupts
• Effacer ( clear) le registre TMR0 interrupt flag bit.

LOTFI CHARAABI - 13 -
Microcontrôleur Application: Affichage LED multiplexé sur 2 digits

LOTFI CHARAABI - 14 -
Microcontrôleur Application: affichage multiplexé sur 2 digits

U1
13 15
R11 1
OSC1/CLKI RC0/T1OSO/T1CKI
16
MCLR/VPP RC1/T1OSI/CCP2A
10k 17
RC2/CCP1
2 18
RA0/AN0 RC3/SCK/SCL
3 23
RA1/AN1 RC4/SDI/SDA
4 24
RA2/AN2/VREF- RC5/SDO
5 25
RA3/AN3/VREF+ RC6/TX/CK
6 26
RA4/T0CKI RC7/RX/DT
7
RA5/AN4/SS/LVDIN
14 19
RA6/OSC2/CLKO RD0/PSP0
20
RD1/PSP1
33 21
RB0/INT0 RD2/PSP2
34 22
RB1/INT1 RD3/PSP3
35 27
RB2/INT2 RD4/PSP4
36 28
RB3/CCP2B RD5/PSP5
37 29
RB4 RD6/PSP6
38 30
RB5/PGM RD7/PSP7
39
RB6/PGC
40 8
RB7/PGD RE0/RD/AN5
9
RE1/W R/AN6
10
RE2/CS/AN7
PIC18F452

LOTFI CHARAABI - 15 -
Microcontrôleur Application: affichage multiplexé sur 2 digits

début
début

PORTC et PORTB en sortie Reconfigure TMR0, remettre flag int à 0


Création d’une table LCD[]. J=0, d=0,u=0
Configurer TMR0 pour une int chaque 5 ms

d est affectée
J=J+1

J=100 RB1=0,d=J/10 RB0=0,u=J%10


PORTC=LCD[d],RB0=1 PORTC=LCD[u],RB1=1

J=0

fin
wait 1 second

LOTFI CHARAABI - 16 -
Microcontrôleur Application: affichage multiplexé (code)

#include <xc.h>

// CONFIG Watchdog
#pragma config WDT = OFF // Watchdog Timer Enable bit
#pragma config WDTPS = 128 // Watchdog Timer Postscale Select bits

// CONFIG Clock
#define _XTAL_FREQ 4000000

// Global Variable
#define DIGIT1 PORTBbits.RB0
#define DIGIT2 PORTBbits.RB1

unsigned char Cnt = 0;


unsigned char Flag = 0;

LOTFI CHARAABI - 17 -
Microcontrôleur Application: affichage multiplexé (code)

unsigned char Display(unsigned char no)

unsigned char Pattern;

unsigned char SEGMENT[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

Pattern = SEGMENT[no]; // Pattern to return

return (Pattern);

LOTFI CHARAABI - 18 -
Microcontrôleur Application: affichage multiplexé (code)
void main()
{
TRISC = 0; // PORTC are outputs
TRISB = 0; // RB0, RB1 are outputs
DIGIT1 = 0; // Disable digit 1
DIGIT2 = 0; // Disable digit 2
// Configure TMR0 timer interrupt
T0CON = 0xC4; // Prescaler = 32
TMR0L = 100; // Load TMR0L with 100
INTCON = 0xA0; // Enable TMR0 interrupt

LOTFI CHARAABI - 19 -
Microcontrôleur Application: affichage multiplexé (code)

while(1) // Endless loop


{
Cnt++; // Increment Cnt
if(Cnt == 100) Cnt = 0; // Count between 0 and 99
__delay_ms(1000); // Wait 1 second
}
}

LOTFI CHARAABI - 20 -
Microcontrôleur Application: affichage multiplexé (code)

void interrupt TMR_routine()


{
unsigned char Msd, Lsd;
if (T0CONbits.TMR0IF)
{
TMR0L = 100; // Re-load TMR0
T0CONbits.TMR0IF = 0; // clear TMR0IF
Flag = ~ Flag; // Toggle Flag
if(Flag == 0)
{
DIGIT2 = 0;
Msd = Cnt / 10; // MSD digit
PORTC = Display(Msd); // Send to PORTC
DIGIT1 = 1; // Enable digit 1
}

LOTFI CHARAABI - 21 -
Microcontrôleur Application: affichage multiplexé (code)

else
{ // Do digit 2
DIGIT1 = 0; // Disable digit 1
Lsd = Cnt % 10; // LSD digit
PORTC = Display(Lsd); // Send to PORTC
DIGIT2 = 1; // Enable digit 2
}
}
}

LOTFI CHARAABI - 22 -
Microcontrôleur Convertisseur analogique numérique

• Le convertisseur Analogique Numérique (ADC) est un composant


qui permet de convertir une valeur analogique (ici la tension) à une
valeur numérique.

• PIC18F452 possède 8 entrées analogiques. La conversion est


effectuée sur 10 bits. La référence varie de 0V jusqu’a 5V.

• Vref- = 0V
• Vref+ = 5V
• n = 10 bits
• Résolution = (Vref+ – Vref-)/(2n – 1) = 5/1023 = 0.004887V

LOTFI CHARAABI - 23 -
Microcontrôleur Convertisseur analogique numérique

LOTFI CHARAABI - 24 -
Microcontrôleur ADC (les registres)

• Le module ADC du PIC18F452 possède 4 registres


• ADRESH – A/D Result High Register
• ADRESL – A/D Result Low Register
• ADCON0 – A/D Control Register 0
• ADCON1 – A/D Control Register 1

LOTFI CHARAABI - 25 -
Microcontrôleur Convertisseur analogique numérique

LOTFI CHARAABI - 26 -
Microcontrôleur ADC (ADCON0)

• Bit 7 ~ 6 : ADCS1 & ADCS0, A/D Conversion clock selection bits. These bits are used in
combination with ADCS2 of ADCON1 register. (See the ADC Clock Selection Table)
• Bit 5 ~ 3 : CH2, CH1 & CH0 are analog channel selection bits which will select a particular
channel out of 8.
• Bit 2 : Go_nDone is the A/D conversion status bit. Setting this bit initiates the A/D
conversion and it will be automatically cleared when the conversion completes.
• Bit 1 : Unimplemented, Read as 0.
• Bit 0 : ADON, A/D Module On bit. Setting this bit will turn on the ADC module.

LOTFI CHARAABI - 27 -
Microcontrôleur ADC (ADCON1)

• Bit 7 : ADFM, A/D Result Format bit. Bits of result will be right justified if this bit is set
otherwise it will be left justified.
• Bit 6 : ADCS2, A/D Conversion clock selection bit. This bit is used in combination with
ADCS0 and ADCS1 of ADCON0 register. (See the ADC Clock Selection Table)
• Bit 5 ~ 4 : Unimplemented. Read as 0.
• Bit 3 ~ 0 : PCFG3 ~ PCFG0, A/D Port Configuration Bits. Status of these bits determine
whether the pin is Analog or Digital as per the table below.

LOTFI CHARAABI - 28 -
Microcontrôleur ADC (ADCON1)

LOTFI CHARAABI - 29 -
Microcontrôleur ADC (Clock source)

LOTFI CHARAABI - 30 -
Microcontrôleur ADC : Application
VDD D1
U1
13 15
OSC1/CLKI RC0/T1OSO/T1CKI
1 16
MCLR/VPP RC1/T1OSI/CCP2A
17 D2
RC2/CCP1
RV1 2
RA0/AN0 RC3/SCK/SCL
18
3 23
RA1/AN1 RC4/SDI/SDA
4 24
5
RA2/AN2/VREF- RC5/SDO
25 D3
21%

RA3/AN3/VREF+ RC6/TX/CK
6 26
RA4/T0CKI RC7/RX/DT
7
RA5/AN4/SS/LVDIN
14 19
1k
RA6/OSC2/CLKO RD0/PSP0
20 D4
RD1/PSP1
33 21
RB0/INT0 RD2/PSP2
34 22
RB1/INT1 RD3/PSP3
35 27
36
RB2/INT2 RD4/PSP4
28 D5
RB3/CCP2B RD5/PSP5
37 29
RB4 RD6/PSP6
38 30
RB5/PGM RD7/PSP7
39
40
RB6/PGC
8 D6
RB7/PGD RE0/RD/AN5
9
RE1/W R/AN6
10
RE2/CS/AN7
PIC18F452
D7

D8

D9

D10

LOTFI CHARAABI - 31 -
Microcontrôleur ADC (Code)

void ADC_Init()
{
ADCON0 = 0x81; //Turn ON ADC and Clock Selection
ADCON1 = 0x80; //All pins as Analog Input and setting Reference Voltages
}

unsigned int ADC_Read(unsigned char channel)


{
if(channel > 7) //Channel range is 0 ~ 7
return 0;

ADCON0 &= 0xC5; //Clearing channel selection bits


ADCON0 |= channel<<3; //Setting channel selection bits
__delay_ms(2); //Acquisition time to charge hold capacitor
GO_nDONE = 1; //Initializes A/D conversion
while(GO_nDONE); //Waiting for conversion to complete
return ((ADRESH<<8)+ADRESL); //Return result
}
LOTFI CHARAABI - 32 -
Microcontrôleur ADC (Code)

void main()
{
unsigned int a;
TRISA = 0xFF; //Analog pins as Input
TRISD = 0x00; //Port D as Output
TRISC = 0x00; //Port C as Output
ADC_Init(); //Initialize ADC

while(1) //Infinite Loop


{
a = ADC_Read(0); //Read Analog Channel 0
PORTC = a; //Write Lower bits to PORTC
PORTD = a>>8; //Write Higher 2 bits to PORTD
__delay_ms(100); //Delay
}
}

LOTFI CHARAABI - 33 -

Vous aimerez peut-être aussi