Sunteți pe pagina 1din 7

Scopul lucrrii: Elaborarea unui program pentru utilizarea resetului si intreruperii externe.

Sarcina lucrarii: de elaborat unui dispozitiv de dirijare a unui afisaj cu apte segmente cu ajutorul
butoanelor conectate la portul de intrare.n dependen de butonul apsat s se reprezinte cifra corespunztoare.

Date teoretice:
ntreruperile sunt un mecanism a unui microcontroler ce i permit s rspund la unele evenimente la momentul cnd se ntmpl, indiferent de ce face atunci microcontrolerul. Aceasta este o parte foarte important, pentru c permite conexiunea microcontrolerului cu lumea de afar. n general, fiecare ntrerupere schimb debitul programului, l ntrerupe i dup executarea unui subprogram (rutine de ntrerupere), continu din acelai punct.O intrerupere reprezinta un semnal sincron sau asincron de la un periferic ce semnalizeaza aparitia unui eveniment care trebuie tratat de catre procesor. Tratarea intreruperii are ca efect suspendarea firului normal de executie al unui program si lansarea in executie a unei rutine de tratare a intreruperii (RTI). Intreruperile hardware au fost introduse pentru a se elimina buclele pe care un procesor ar trebui sa le faca in asteptarea unui eveniment de la un periferic. Folosind un sistem de intreruperi, perifericele pot atentiona procesorul in momentul producerii unei intreruperi (IRQ), acesta din urma fiind liber sa-si ruleze programul normal in restul timpului si sa isi intrerupa executia doar atunci cand este necesar. Inainte de a lansa in executie o RTI, procesorul trebuie sa aiba la dispozitie un mecanism prin care sa salveze starea in care se afla in momentul aparitiei intreruperii. Aceasta se face prin salvarea intr-o memorie, de cele mai multe ori organizata sub forma unei stive, a registrului contor de program (Program Counter), a registrelor de stare precum si a tuturor variabilelor din program care sunt afectate de executia RTI. La sfarsitul executiei RTI starea anterioara a registrelor este refacuta si programul principal este reluat din punctul de unde a fost intrerupt. Pentru a asocia o intrerupere cu o anumita rutina din program, procesorul foloseste tabela vectorilor de intrerupere (TVI). Fiecarei intreruperi ii este asociata o adresa la care programul va face salt in cazul aparitiei acesteia. Aceste adrese sunt predefinite si sunt mapate in memoria de program intr-un spatiu contiguu care alcatuieste TVI. Adresele intreruperilor in TVI sunt setate in functie de prioritatea lor, cu cat adresa este mai mica cu atat prioritatea este mai mare. Pentru ATMega16, TVI este data in tabelul de mai jos:

Se observa ca TVI este plasata de la prima adresa a memoriei de program si ca intreruperile sunt puse din doua in doua adrese consecutive. Prioritatea cea mai mare o are intreruperea de RESET, de la adresa 0, apoi intreruperea externa 0 (INT0). Perifericele care pot genera intreruperi la ATMega16 sunt timerele, interfata seriala (USART), convertorul analog-digital (ADC), controllerul de memorie EPROM, comparatorul analog si interfata seriala I2C. Deasemenea, procesorul poate sa primeasca cereri de intreruperi externe din trei surse (INT0, 1 si 2) ce corespund unui numar egal de pini exteriori. Activarea/Dezactivarea intreruperilor: Intreruperile pot fi activate sau dezactivate de utilizator in program prin setarea individuala a bitilor de interrupt enable pentru fiecare periferic folosit si prin setarea flagului de Global Interrupt Enable (I) din Status Register (SREG).

Tratarea unei intreruperi pentru ATMega16 se face ca in figura alaturata. Sa presupunem ca programul nostru primeste intreruperea externa INT0 in timp ce executa instructiunea ldi R16,0xFF. Dupa efectuarea instructiunii, registrul contor program (PC) este automat salvat in stiva si apoi initializat la valoarea corespunzatoare adresei lui INT0 ($002). Acest lucru se traduce prin saltul programului de la adresa curenta ($123) la adresa $002. Aici, programul gaseste instructiunea jmp $2FF care-i permite sa sara la rutina efectiva de tratare a intreruperii. La sfarsitul oricarei RTI trebuie sa existe instructiunea reti care reface din stiva registrul PC (programul sare inapoi la adresa de unde ramasese inainte de intrerupere). In timpul executiei unei intreruperi, bitul I din SREG este setat la 0 si resetat la iesire, adica orice alta intrerupere care poate aparea in timpul intreruperii curente nu va fi luata in seama. Cu toate acestea, utilizatorul poate sa reseteze bitul I din software, permitand astfel executia de intrerupere in intrerupere.
Registre pentru tratarea intreruperilor externe

Acest registru este raspunzator pentru plasarea tabelului vectorului de intreruperi. Bitul 0 din acest registru se numeste IVCE (Interrupt Vector Change Enable) .Acest bit trebuie initilizat cu valoarea logica 1 pentru a permite schimbarea urmatorului bit din registru si anume IVSEL.Setand acest bit nu se vor mai putea genera intreruperi. Bitul 1 din acest registru se numeste IVSEL (Interrupt Vector Select).Cand acest bit are valoarea logica 0 vectorii de intreruperi sunt plasati la inceputul memoriei de

program(Flash). Cand acest bit este setat cu valoarea logica 1 vectorii de intreruperi sunt mutati la inceputul zonei de boot . Bitul 7 INT1:External Interrupt Request 1 Enable: Cand INT1 e setat cu valoarea logica 1 si bitul I din SREG este setat cu aceeasi valoare, pinul destinat intreruperii externe INT1 este activat. Bitii ISC11 si ISC10 definesc logica de generare a intreruperii, respective daca aceasta este generata pe frontul crescator sau descrescator. Intreruperea va fi setata conform rutinei asociate vectorului de intrerupere. Bitul 6INT0:External Interrupt Request 0 Enable: Cand INT0 e setat cu valoarea logica 1 si bitul I din SREG este setat cu aceeasi valoare pinul destinat intreruperii externe 0 este activat. Bitii ISC01 si ISC00 definesc logica de generare a intreruperii, respective daca aceasta este generata pe tranzitia de crestere sau pe cea de scadere. Bitul 5INT2:External Interrupt Request 2 Enable: Cand INT0 e setat cu valoarea logica 1 si bitul I din SREG este setat cu aceeasi valoare, pinul destinat intreruperii externe 2 este activat. Bitul ISC2 defineste logica de generare a intreruperii, respective daca aceasta este generata pe tranzitia de crestere sau pe cea de scadere. Intreruperile externe .Aceste intreruperi sunt generate prin intermediul pinilor INT0, INT1 si INT2. Ele sunt activate chiar daca acesti pini sunt setati ca fiind de output. Modul in care se pot genera intreruperile externe poate fi setat prin configurarea registrelor MCUCR si MCUCSR.

De exemplu, pentru a folosi intreruperea externa INT2 sunt necesare urmatoarele configurari: 1. Bitul I din SREG trebuie sa fie setat (global interrupt enable) 2. Bitul INT2 din GICR trebuie setat (INT2 enable) 3. Daca ISC2 este initializat cu valoarea zero INT2 va fi activata pe front descrescator (tranzitie din 1 in 0 a pinului INT2), in caz contrar ea va fi activata pe front crescator. Perifericele care pot genera intreruperi sunt: timerele, convertorul analog-digital, interfetele seriale (RS232, I2C, SPI) etc. Pentru a constru i astfel de circuit vom construi tabela de adevar a celulei 7-seg :
segm. cifr.

a
1 0 1 1 0 1 1 1

b
1 1 1 1 1 0 0 1

c
1 1 0 1 1 1 1 1

d
1 0 1 1 0 1 1 0

e
1 0 1 0 0 0 1 0

f
1 0 0 0 1 1 1 0

g
0 0 1 1 1 1 1 0

Hex
3F 6 5B CF 66 6D 7D 7

0 1 2 3 4 5 6 7

Schema electrica:

Schema bloc:
Intreruperea externa int0

Svic pina,o

Portb=cifra1

Start Svic pina,1 Iniializare stiva Svic pina,2 Portb=cifra1 Portb=cifra1

Setarea porturilor de intrare/ieire

Intreruperea int0

Svic pina,3

Portb=cifra1

Ciclul infinit main

Svic pina,4

Portb=cifra1

Svic pina,5

Portb=cifra1

Svic pina,6

Portb=cifra1

Svic pina,7

Portb=cifra1

reti

Algoritmul:
Pentru a scrie programul, avem nevoie de un algoritm. n cazul nostru algoritmul este: Dup setrile iniiale ale porturilor, microcontrolerul trebuie s intre intr-un ciclu nentrerupt, n care nu se va execura nici o operatie. n momentul activrii ntreruperii, trebuie s se apeleze o subrutin d e prelucrare a ntreruperii respective, dup care iar nu se va executa nimic (se va intra iar n ciclul main). Operaii de iniializare a controlerului: iniializarea stivei; setarea portului B ca port de ieire; se d la ieirea PB.0 semnalul uniii logice(se sting toate segmentele digitului); configurm portul C ca port de intrare; activm rezistena pull-up a portului C, D; sei- permiterea global a ntreruperilor; Dup operaiile de iniializare, se ncepe ciclul de baz a programului, care se caracterizeaz prin urmtoarele operaii: Operaii ce se conin n interiorul ciclului: NOP-no operation. n ciclul main nu se va executa nimic, se va atepta activarea ntreruperii; Descrierea subrutinei de prelucrare a ntreruperii: citim starea pinului PA.0 a portului A; dac bitul e resetat(e apsat butonul), ncrcm ntr-un registru numrul n hexazecimal care arat ce segmente ale digitului s se aprind; n portul de ieire, PB, ncrcm registrul n care este indicat ce segmente ale digitului s se afieze; ieim din subrutin;

Listingul programului:
// prob4.asm .include"m16def.inc" ; se include fi?ierul de descriere a controlerului .cseg .org 0 rjmp reset .org INT0addr rjmp Intr .org 30 reset: ldi r16, low(ramend);init stiva out SPL, r16 ldi r16, high(ramend) out SPH, r16 ldi r16, 0x00 out portc, r16; out ddra, r16; out ddrd,r16 ldi r16,0xff out ddrc,r16 out porta,r16 out portd,r16 ldi r16, 1<<int0 out gicr,r16 ldi r16,1<<isc01 out mcucr,r16 sei main: rjmp main intr: sbic pina,0 rjmp A0 ldi r16,0x3f out portc,r16 rjmp end A0: sbic pina,1 rjmp A1 ldi r16,0x06 out portc,r16 rjmp end A1: sbic pina,2 rjmp A2 ldi r16,0x5b out portc,r16 rjmp end A2: sbic pina,3 rjmp A3 ldi r16,0xcf out portc,r16 rjmp end A3: sbic pina,4 rjmp A4 ldi r16,0x66 out portc,r16 rjmp end A4: sbic pina,5 rjmp A5 ldi r16,0x6d out portc,r16 rjmp end A5: sbic pina,6 rjmp A6 ldi r16,0x7d out portc,r16 rjmp end A6: sbic pina,7 rjmp end ldi r16,0x07 out portc,r16 end: reti

Descrierea programului
Programul acesta se va ncepe exact ca i programul precedent. Iniializarea porturilor se face la fel, diferena este numai n ciclul de baz main. Pe lnga funcia de baz main, mai folosim i o subrutin de prelucrare a ntreruperilor. Pentru scrierea acestor funcii am folosit comenzile descrise n programul precedent, i o comand nou: sbis. sbis aceast comand ignor urmtoarea comand dac bitul din portul intrare/ieire este setat (are valoarea 1). Are 2 parametri, i anume portul si pinul din portul respectiv. Ea verifica daca pinul din port este setat sau nu, n caz c e setat, sare peste comanda imediat urmtoare.n urma compilrii programului, dac nu snt erori, obinem un fiier cu extensia *.hex. Acest fiier se va folosi ca Program File pentru microcontrolerul ATmega16, funcionarea cruia o vom simula folosind softul Proteus.

Concluzie:
n aceasta lucrare de laborator nr-3 am facut cunostinte cu intreruperile externe, cu modul lor de activare, cu configurarea microcontrolerului pentru diferite tipuri de activare a ntreruperii, i am creat o funcie de intrerupere externa la apasarea unui buton.

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