Sunteți pe pagina 1din 6

Proiect AHSCTCM

Aplicaie cu LED-urilor folosind


intreruperi
n aplicatia de fa se doreste aprinderea a 8 LED-uri utilizand doua intreruperi
externe. Aplicaia este dezvoltata pe platforma microcontrolerului PIC18F4550.
La cele doua intreruperi externe am conectat cate un buton. La apasarea unui
buton led-urile se vor aprinde de la stanga la dreapta si in sens invers la
apasarea celui de-al doilea buton. Mai jos am proiectat schema elctrica in
Proteus si programul de functionare.

Ledurile alese pentru proiect functioneaza la o tensiune nominal de 2.1V si


20mA. Avand in vedere ca la iesirile de la PORTD tensiunea este de 5v a fost
necesara inserierea lor cu rezistente pentru a limita tensiunea de alimentare si
curentul care trece prin acestea.
Am calculate valoarea rezistentelor cu formula:
R = (Vpin-Vled)/Iled
Unde
R = (5-2.1)/0.02
R = 145
Am ales cea mai apropiata rezistenta ~ 150
La cei doi pini de intreruperi externe este conectata cate o rezistenta pull-down
de 10k, iar butoanele sunt conectate la +5v. Astfel incat la pinii de intrerupere
avem 0 logic initial si 1 logic atunci cand se va apasa pe butoane. Oscilatorul
este format dintrun crystal de quartz si doi condensatori ceramici de 22pF pentru
stabilitatea acestuia.
Microcontrolerul Pic deine mai multe tipuri de intreruperi interne (periferice) i
externe. In proiectul de fata intreruperile prezentate sunt cele externe. LED-urile
care vrem sa le aprindem sunt conectate la PORTD. Registrii utilizati din
schema sunt incadrati in chenarele rosii.

Schema intreruperilor din microcontroler

Configurarea intreruperilor

INTCON.GIE = 1 //activarea intreruperilor globale


INTCON.INT0IE = 1 //activarea intreruperii externe INT0
INTCON.INT0IF = 0 //setarea bit-ului Flag de la intreruperea INT0
INTCON.INT1IE = 1 //activarea intreruperii externe INT1
INTCON.INT1IF = 0 //setarea bit-ului Flag de la intreruperea INT1

Flagurile intreruperilor sunt necesare pentru a determina de la care intrerupere


externa sa produs intreruperea catre CPU. Pentru aceasta configurare au fost
folositi registrii INTCON si INTCON3. Registrii contin setari pentru activarea
intreruperilor, prioritatilor acestora dar si biti pentru a determina daca acestea au
fost produse (INT0IF si INT1IF).

Programul nefiind complex nu sunt necesare intreruperi cu diferite nivele de


prioritate astfel la setarea bitului RCON.IPEN = 0 toate intreruperile vor avea
aceeasi prioritate. Deoarece la pinii de intreruperi externe se afla si intrarile de la
modulul ADC, a fost necesara dezactivarea acestuia (ADCON0.ADON = 0) si
setarea pinilor din analog in digital (ADCON1 = 0x0F).

Codul este scris in limbajul de programare C. Mediul de programare MikroC. Se


poate ncarca pe microcontroller folosind un Pickit2.

int i = 0, sens = 0;
void interrupt ()
{
if(INTCON.INT0IF == 1)
{
sens = 1;
INTCON.INT0IF = 0; // resetare
Flag de la INT0
}
if(INTCON3.INT1IF == 1)
{
sens = -1;
INTCON3.INT1IF = 0; // resetare
Flag de la INT1
}
}

void main()
{
TRISD = 0x00; // initializare port D ca iesire
LATD = 0x00; // setare 0 pe iesirile portului D
ADCON0.ADON = 0; // dezactivare modul ADC
ADCON1 = 0x0F; // setare pini de intrare pe mod digital
TRISB0_bit = 1; // setare pin B0 (INT0) ca intrare
TRISB1_bit = 1; // setare pin B1 (INT1) ca intrare
RCON.IPEN = 0; // dezactivare nivele de prioritate pentru intreruperi
INTCON.GIE = 1; // activarea intreruperilor globale
INTCON.INT0IE = 1; // activarea intreruperii externe INT0
INTCON.INT0IF = 0; // setarea bit-ului Flag de la intreruperea INT0
INTCON3.INT1IE = 1; // activarea intreruperii externe INT1
INTCON3.INT1IF = 0; // setarea bit-ului Flag de la intreruperea
INT1
while (1) {
if (sens == 1)
{
for (i = 0; i <= 7; i ++)
{
LATD = ceil(pow(2,i));
delay_ms(50);
}
}
if (sens == -1)
{
for (i = 7; i >= 0; i --)
{
LATD = ceil(pow(2,i));
delay_ms(50);
}
}
}
}

S-ar putea să vă placă și