You are on page 1of 26

Cuprins

1. Problema ………………………………………………………...…1.
2. Notiuni teoretice intriductive...........................................................3-4.
3. Descrierea mudulelor periferice folosite ......................................4-10.
4. Rezolvarea problemei........................................................................11.
5. Vizualizarea solutiei.....................................................................12-13.
6. Concluzie..........................................................................................14.
7. Bibliografie………………………………………………………..15.
8. Anexa………………………………………………………......16-26.

1

1.Problema :
Sa se proecteze un sistem ,la dorinta ,care va contine :

1)minimum 2 module periferice in afara de GPIO;
2)minimum o intrerupere inafara de intreruperea RESET;
3)solutiile sa fie realizate modular cu grupare pe fisiere si subroutine;
4)o subrutina e necesar sa fie implimentata in limpajul ASM;

2

Adresa pentru stocarea rezultatului coincide cu adresa operandului stâng LA. Schematic arhitectura AVR poate fi reprezentată prin figura de mai jos. În acelaşi mod se generează şi adresa de salt pentru instrucţiunile de salt necondiţionat. Executarea unei instructiuni in cadrul nucleului microcontrollerului Instrucţiunea este selectată din memoria de programe PM cu ajutorul contorului de program PC şi transmisa către decodificatorul de comenzi CDC. Microcontroller . În cazul în care instrucţiunea este de salt condiţionat. Program . Instrucţiune . se generează o adresă de salt pentru a fi înregistrată în contorul de program PC. Arhitectura nucleului Microcontrollerului Microcontrollerul seriei AVR are o arhitetură RISC pe 8 biţi construit după principiul arhitecturii HAWARD. doar că nu se iau in consideraţie biţii de stare din SREG. acesta poate executa până la 1 000 000 operaţii pe secundă .minicalculator care cuprinde în sine un nucleu de microprocesor. Odată cu evaluarea rezultatului se generează şi biţii de stare a procesorului care sunt stocaţi în registrul de stare SREG. la o frecvenţă a semnalului de ceas de 1 MHz. o prelucrează şi aplică rezultatul către interfaţa de ieşire.o acţiune pe care o poate executa nucleul Microcontrollerului. În general MCU preia informaţia de la interfeţele de intrare. memorie de program şi Module periferice. aritmetică sau logică.Partea principală a Microcontrollerului care execută instrucţiunile din program. 2.un set de instrucţiuni care se execută una după alta. dacă se satisface condiţia presupusă de instrucţiune verificând biţii de stare din SREG. În cazul în care instrucţiunea este una de prelucrare. 3 . Deci.Notiuni teoretice introductive: Microprocesor .1MIPS/MHz. CDC decodifică comanda şi generează semnale de configurare a nucleului. O asemenea arhitectură permite ca majoritatea instrucţiunilor să se execute într-un singur tact al semnalului de ceas. Nucleu . se generează un semnal de selecţie a funcţiei către ALU şi adresele pentru operandul stâng LA şi operandul drept RA.un circuit care poate îndeplini oricare funcţie în dependenă de programul care îl are spre execuţie.

Deoarece modulul GPIO este un modul periferic al microcontrollerului. se generează adrese către modulele de memorie între care se efectuază transferul. Lucrul cu portul se execută ca cu un tot întreg. Orice Microcontroller are un set de pini. In lucrarea data au fost folosite urmatoarele module periferice: -GPIO -Ext INIT -AC -ADC -Taimer 3. respectiv. Deci operaţiile de transfer către port va afecta toţi pinii ce îl constitiue. Aici vom evidenţia faptul că pentru arhitectura AVR sunt posibile operaţii de transferuri în care strict participă un registru de uz general GPR. DDRx si PORTx. astfel încât să i se poată atribui o valoare logică către terminalul pinului sau sa fie citită aceasta valoare logică de pe el. Pinii de intrare/ieşire sunt grupaţi în porturi a câte opt. Pentru operaţiile de transfer. majoritatea dintre care care pot fi configuraţi ca pini generici de intrare sau ieşire (GPIO).1 Modulul periferic GPIO .Descrierea mudulelor periferice folosite 1.Port Generic de Intrare/Ieşire. Pentru a explica modul de funcţionare a modulului GPIO vom prezenta următoarea figură: 4 . dintr-o singură operaţie de transfer către port putem modifica configuraţia la toţi opt pini deodată. în cazul când pinul este configurat către intrare. Fiecare modul GPIO a microcontrollerului cu arhitectura AVR va avea la dispoziţie trei registri de periferici PINx. respectiv are rezervaţi un set de regiştri în spaţiul de adrese a regiştrilor periferici.

evitarea zgomotelor pe intrare nedorite. si INT2 ale microconrollerului. În acest caz valoarea din registrul PORTx va conecta rezistenţa de pull-up cu valoarea logică "1". Această caracteristică oferă posibilitatea crearii situatiilor de intreruperi chiar din cadrul programului prin modificarea valorilor pinilor respectivi din programul din MCU. care ar putea fi tratata de catre o subrutina de prelucrare a intreruperii EXT_INT_ISR. terminalul fizic respectiv va fi setat către intrare. . rezervati pentru modulul periferic EXT INT."HiZ".Activarea intreruperii INT2 Biti 4. Totodata este unul din cele mai simple si esentiale module periferic care pot genera intreruperi. respectiv pentru dezactivare se inregistreaza "0" logic bit7 . valoarea logică "0" va seta pinul în starea de impedanţă înaltă . pinul respectiv va fi setat către ieşire. sunt: . Întreruperile externe sunt atasate de pinii INT0. pentru activarea intreruperii de la sursa INT0 se va executa urmatoarea secventa de cod. care reactioneaza in timp real la oricare schimbare pe pinul fizic. iar valoarea logică din PORTx de la aceeaşi locaţie va fi tranferată către terminalul fizic.EXT INT permite detectarea schimbarilor de la unul din pinii externi al microcontrollerului cu o eventuala generare a unei situatii de intrerupere. Pinii destinati intreruperilor pot fi configuraţi si ca ca ieşiri.rezervati de notat ca pentru ca ca intreruperea sa aiba loc este necesar ca bitul global de activare a intreruperii sa fie activ. În aşa mod recomandarea pentru pinii neutilizaţi este de a seta configuraţia lor ca intrare cu rezistenţa de pull-up activată. 1.GICR (GIMSK) .INT0 = 1 a fost detectata situatia de intrerupere si reprezentata de un flag indicator al acesteia . ceea ce va evita scurt-circuituri întâmplătoare atunci când este setat spre ieşire. Se recomandă de a evita starea de HiZ pe terminal. din cei 64 pentru microcontrillerul din seria AVR. intrare sau ieşire.registru de setare a valorii portului pentru cazul când este setat catre ieşire şi activarea rezistentei de pull-up în cazul când este setat către intrare. şi pentru cazul când este pe intrare. Ca si orisicare modul periferic.INT2 .I=1 intreruperea de la pinul EXT INT0 este activata . INT1. În cazul când o locaţie a DDRx va conţine "1". pentru a evita introducerea de zgomote în interiorul cipului microcontrollerului..INT1 . si de fapt asta si este.Activarea intreruperii INT0 bit5 . fapt ce are loc când terminalul nu este conectat la o sursa de semnal.serveşte pentru citirea valorii logice de pe terminalul fizic. În cazul în care o locaţie a DDRx va conţine "0" .Activarea intreruperii INT1 bit6 . de obicei plasata in secveta de inializare a progamului principal: 5 .Registrul de setare a direcţiei portului.2 Modulul periferic Intrerupere Externa . Operaţia de scriere către acest registru nu va afecta valoarea fizică a terminalului fizic.0 . PORTx . DDRx . modulului periferic EXT INT ii sunt rezevati un set de registri periferici de stare si/sau control pentru configurare si lucru cu acest modul.PINx . acest registru este accesibil doar pentru citire. Registri periferici. Putem vedea ca pentru ca sa fie apelata subrutina de prelucrare a intreruperii este necesara satisfactia urmatoarelor conditii: Bitul de permisiune globala a intreruperiolor este setat . ce ar putea în cazurile critice duce până la defectarea circuitului.INT0 .General Interrupt Controlserveste pentru activarea unui modul de intrerupere exetrna prin inscrierea valorii "1" logic in locatia specifca din acest registru. de exemplu.INTF0 =1 Modulul periferic ar putea fi comparat cu un GPIO avansat.

in acest scop este rezervat doar un bit situat pe pozitia bit0. R16 // Activarea intreruperii Int0 sei // Activarea globala a intreruperilor pentru activarea intreruperii in timpul executiei programului se recomanda utilizarea comenzii de setare a bitului in registrul periferic: sbi GICR.INTF2 Flag de detectie a intreruperii de la sursa EXT INT2 Biti 4. si se reseteaza la deservirea acestei ntreruperi.INTF0 Flag de detectie a intreruperii de la sursa EXT INT0 Bit 5 . ca o concluzie. flagurile s e seteaza automat la detectia intreruperii la pinul respectiv.MCUCR . acet registru nu este diponibil pentru modificare.reprezina colectia de flaguri indicatori de detectie a situatiilor de intreruperi de la diferite surse externe.INTF1 Flag de detectie a intreruperii de la sursa EXT INT1 Bit 6 . inregistrarea subrutinei de prelucrare a intreruperii in vectorul de intreruperi 6 . ldi R16.. pentru a configura sistemul conform figurii prezentate mai sus ca exemplu.rezervati .0 .GICR . vor fi necesare urmatoarele secvente in codul programului scris in ASM. Bit 7 . 1<<INT0 // incarcarea valorii 0b10000000 in R16 out GICR. pentru intreruperea INT0 vom avea: | ISC01 | ISC00 | mod de generare a intreruperii ------------------------------------------------- | 0 | 0 | pe nivel jos la pinul INT0 0-logic | 0 | 1 | orice schimbare la pinul INT0 | 1 | 0 | caderea nivelului de la 0 la 1 la pinul INT0 | 1 | 1 | ridicarea nivelului de la 1 la 0 la pinul INT0 similar pentru intreruperea INT1 vom avea: | ISC11 | ISC10 | mod de generare a intreruperii ------------------------------------------------- | 0 | 0 | pe nivel jos la pinul INT1 0-logic | 0 | 1 | orice schimbare la pinul INT1 | 1 | 0 | caderea nivelului de la 0 la 1 la pinul INT1 | 1 | 1 | ridicarea nivelului de la 1 la 0 la pinul INT01 pentru configurarea modului de detectie a intreruperii INT2 se va utiliza registrul EMCUCR (extensia registrului MCUCR). INT0 // Activarea intreruperii Int0 . situatia de intrrupere poate fi detectata pe nivel logic cat si pe schimbare a nivelului logic.reprezinta registrul de configurare a modului de detectare a situatii de intrrupere. | ISC2 | mod de generare a intreruperii ------------------------------------------------- | 0 | caderea nivelului de la 0 la 1 la pinul INT2 | 1 | ridicarea nivelului de la 1 la 0 la pinul INT2 Prin urmare..

deoarece aplicarea valorii 0 logic pe coloană şi apăsarea unui buton de pe această coloană implică schimbare pe linia la care e conectat butonul. iar în cadrul subrutinei de prelucrare a întreruperii se va detecta care anume tastă a fost apăsată. Având ca stare iniţială unităţi pe intrare. ca urmare însă. Modul de detectare a tastei apăsate va reprezenta aplicarea de stimuli la intrare. Altfel va fi situaţia atunci când se va aplica la o coloană 0 logic. Deci. vom spune că coloana este activată prin aplicarea valorii 0 logic. La fiecare intersecţie vom avea cîte un buton care scurt-circuitează conductoarele pentru linia cu coloana respectivă.initializarea/configurarea modulului de intreruperi in sectiune de initializare a programului principal (intreruperea reset. În starea iniţială pe coloane vor fi conectate la un set de pini orientaţi către ieşire iar conductoarele liniilor vor fi conecate la un set de pini setaţi pentru intrare. starea pinilor de pe linii nu va fi modificată deoarece firele de ieşire la fel vor avea valoarea logică 1 condiţionată de rezistenţele de pull up conectate la aceste fire. adică la firele coloanelor.coloana este pasivă 0. şi un buton de pe coloana respectivă este apăsat. Vom considera colecţia de fire a coloanelor ca intrare a tastaturii. vom pasiva coloana. Ca urmare vom avea: cod_tasta <= < linie : coloana > Pentru a evita scanarea continuă a tastaturii.) 1. apăsarea oricărui buton va implica transferul valorii logice 1 de pe coloana respectivă către linia respectivă la care este conectat butonul apăsat. iar cele de pe linii ca ieşire.coloana este activă Utilizând cele spuse mai sus. valoarea logică 0 va fi propagată către linia respectivă a butonului apăsat. În acest caz. O alta optimizare a metodei ar fi utilizarea intreruperii externe în acest scop. 1. 7 . ce va permite ca detecţia existenţei unei oarecare apăsări să fie automată de către sistemul de întreruperi. Codul tastei apăsate îl vom considera valoarea ca o concatenare a tuturor biţilor de pe linii şi de pe coloane. şi detectarea propagării acestor stimuli către ieşire. deci. şi verificarea existenii unei valori logice 0 pe oarecare linie. vom spune ca aplicând la coloană valoarea logică 1.3 Tastatura 4x4 reprezintă un set de butoane aranjate în rînduri şi coloane. Ca concluzie din cele spuse mai spus. schimbând valoarea logică a pinului menţinută de rezistenţa de pull up conectată. cu rezistenţa de pull-up activată. adică nu va implica careva schimbări pe linii. vom optimiza metoda de detecţie activând iniţial toate coloanele. pentru a detecta butonul apăsat vom elabora o metodă de scanare a tastaturii prin activarea consecutivă a coloanelor şi verificarea propagării valorii logice 0 pe linii.

pe care o implementează folosind un numărător care este incrementat periodic (conectat direct sau indirect la o unitate de ceas) și care este resetat la sfârșitul fiecărei perioade a PWM-ului. Perioada de timp corespunzătoare valorii ON dintr-un ciclu ON-OFF se numește factor de umplere (duty cycle) și reprezintă. sau pentru a executa anumite acţiuni în dependenţă de valoarea primită. Diodele deasemenea ne asigură dezlegarea electrică a liniilor necesară evitării propagării căderii nivelului logic de la o linie către alta 1. special pentru modul FastPWM Atenție! Există câte un tabel de configurare a biților COM pentru fiecare mod de funcționare a PWM-ului! Modul 1 0 pentru biții COM1A1 COM1A0 va lăsa semnalul de pe pinul OC1A pe 1 în timpul numărătorii (până la atingerea pragului) și va pune semnalul pe 0 de la atingerea pragului până la capătul unui ciclu (numărare completă pe 65536 elemente). presiune. Atmega32 dispune de 2 canale de PWM distribuite astfel:  Timer 2 (16biti) OCR1A. Declanşarea chemării subrutinei de prelucarea a întreruperii EXT_INT va fi condiţionată de căderea de potenţial detectată la pinii de ieşire.5 Convertorului Analog-Digital: Modulul Convertor Analog-Digital este utilizat pentru conversia tensiunii analogice într-o valoare digitală (în AVR pe 10 biţi).. Mai jos urmează o schemă simplificată a convertorului analog-digital prezent pe AVR: 8 . etc.4 PWM (Pulse Width Modulation) este o tehnică folosită pentru a varia în mod controlat tensiunea dată unui dispozitiv electronic. aici vom seta OCR1A = x * 65535 / 100 1. Există mai multe tipuri de conertoare. Deoarece avem tocmai 4 surse de întreruperi de la cele 4 linii.numărarea se face doar pe frontul crescător  Phase Correct PWM . Această metodă schimbă foarte rapid tensiunea oferită dispozitivului respectiv din ON în OFF și invers. se pot controla circuitele analogice din domeniul digital Din punct de vedere al Atmega32 există 2 tipuri de PWM:  Fast PWM . Pentru a obține un factor de umplere x%. dar cele utilizate în microcontrollerele AVR sunt convertoare cu aproximare succesivă. de pe linii. De exemplu. Când valoarea numărătorului este mai mare decât valoarea de referință. in medie. ce tensiune va primi dispozitivul electronic. Astfel. ieșirea PWM (output-ul) trece din starea HIGH în starea LOW (sau invers). Majoritatea microcontrollerelor oferă această facilitate.numărarea se face pe ambele fronturi. poate fi utilizat pentru perceptarea ieşirii de la un senzor (de temperatură. OCR1B Există un tabel pentru biții COM.) în anumite intervale. Pentru aceleasi configurații Phase Corrent PWM este de 2 ori mai lent. Modificările făcute asupra semnalului în funcție de prag și counter în acest mod se pot observa în desenul din Figura 4. Multe circuite digitale pot genera semnale PWM. colectarea căderilor de potenţial către un singur semnal îl vom face cu ajutorul unui set de diode a căror terminale Catod vor fi conectate către linii iar terminalele Anod vor fi conectate în comun şi vor servi drept sursă de semnal pentru declanşarea întreruperii pe front căzător.

În regim de conversie unară. iar una extinsă în 125 µs. Aceasta înseamnă ca este posibilă conversia a opt semnale (bineînţeles ca nu în acelaşi timp). Pentru a afla intervalul de timp necesar unei conversii se divide numărul de cicli necesari unei conversii la fregvenţa DAC. Normal. setat prin intermediul biţilor ADPS2:0 descrişi mai jos. care divite fregvenţa de clock la un anumit coeficient. ADMUX Acest registru este utilizat pentru selectarea unuia din cele 8 canale care v-a fi convertit. cînd este gata rezultatul este plasat în perechea de regiştri ADCH:L. şi nu se porneşte o altă conversie. avem 1024 valori posibile. adică dacă tensiunea de intrare Vin este egală cu 0. Conversia analog-digitală nu este infăptuită instantaneu. Regiştrii de stare şi control ai CAD CAD conţine 4 regiştri de I/O: ADMUX – ADC Multiplexer Select Register. Regimurile de operare a convertorului analog-digital (CAD) Convertorul Analog-Digital are două regimuri fundamental de funcţionare: Conversie Unară (singulară) şi Conversie Continuă. dar prima conversie (deodată după pornirea CAD) se îndeplineşte în 25 cicli de clock. În regim continuu. atunci valoarea convertită v-a fi zero. este necesar de a porni doar o dată conversia şi CAD v-a porni automat următoarea conversie în dată ce este finisată cea actual. este necesar de un anumit interval de timp timp. De exemplu dacă folosim un CAD la fregvenţa de 200kHz. Dacă este de ajuns o rezoluţie de conversie mai mică de 10 biţi. dacă Vin este egală cu Vref atunci valoarea convertită v-a fi 1023. ADCSR – ADC Control and Status Register. o conversie este îndeplinită în 13 cicli CAD. ADCH:L – ADC Data Register (High. Valoarea convertită poate fi calculată folosind următorea formulă: ADCH:L= ((Vin/Vref)*1023) Deoarece convertorul are o rezoluţie de 10 biţi. Tensiunea analogică la intrare trebuie să fie mai mare decît 0V. este necesar de a iniţializa fiecare conversie. bineînţeles ce produce o eroare numită eroare de cuantificare. care depinde de fregvenţa de clock folosită de CAD şi este proporţională cu fregvenţa de clock şi poate fi între 50-200 kHz. care este utilizat la selectarea între opt intrări analogice diferite. iar dacă Vin este ½ din Vref atunci valoarea ADCH:L este 512. şi mai mică decît tensiunea de referinţă a convertorului – AREF. Low). Tensiunea de referinţă este o tensiune externă care trebuie aplicată la pinul Aref a microcontrollerului. o conversie normală v-a fi îndeplinită în 65 µs.La intrare avem un multiplexor analog-digital. şi mai este numită “Conversie Extinsă”. Acest proces de conversie se mai numeşte cuantificare. deoarece regiştrii AVR au lăţime de 8 biţi este nevoie de o pereche p-u a stoca o valoare pe 10 biţi. La ieşire valoarea convertită este înscrisă în regiştrii ADCL şi ADCH. Tabelul de mai jos arată setările posibile ale acestui registru: 9 . frecvenţa CAD poate fi mărită prin ajustarea unui prescaler prezent în CAD.

sau este setat automat în 0 doar la executarea ISR corespunzător vectorului de întreruperi. alternativ poate fi setat în 0 înscriind 1 în acest bit. tabela de mai jos arată valorile posibile: Factorul de ADPS2 ADPS1 ADPS0 Diviziune 0 0 0 2 0 0 1 2 0 1 0 4 0 1 1 8 1 0 0 16 1 0 1 32 1 1 0 64 1 1 1 128 Seria ATMEGA conţin un CAD mai complex. cînd este setat în 1 şi SREG(I)=1 la apariţia ADIF se cheamă ISR corespunzătoare din vectorul de întreruperi.ADIF – ADC Interrupt Flag.ADIE – ADC Interrupt Enable. ADCSR Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 ADEN ADSC ADFR ADIF ADIE ADPS2 ADPS1 ADPS0 ADEN – ADC Enable. se setează în 1 la conversie continuă. setînd bitul dat în 1 este pornit CAD. Intrarea MUX2 MUX1 MUX0 Selectată 0 0 0 ADC0 0 0 1 ADC1 0 1 0 ADC2 0 1 1 ADC3 1 0 0 ADC4 1 0 1 ADC5 1 1 0 ADC6 1 1 1 ADC7 Dacă biţii MUX2:0 sunt modificaţi în timpul conversiei atunci selectarea dată v-a fi valabilă doar după finisarea conversiei actuale. care are aceleaşi funcţii de bază dar şi anumite posibilităţi mai avansate ca:  7 Canale de intrare diferenţiale  2 Canale de intrare diferenţiale cu amplificare 10x şi 200x  Ajustarea la stînga a regiştrilor ADCH:L (p-u rezoluţie de 8 biţi)  Tensiune de referinţă selectabilă de 2. Acest bit se setează în 0 automat la sfîrşitul oricărei conversii.ADPS2:0 – ADC Prescaler Select. acest bit este setat automat în 1 la finisarea unei conversii. conversiile următoare v-or fi pornite automat. Oprind CAD în timpul unei conversii v-a duce la anularea conversiei date. aceşti biţi determină factorul de divider a fregvenţei de clock pentru CAD. În regim de conversie unară acest bit trebuie setat la fiecare conversie necesară. ADSC – ADC Start Convertion. în regim de conversie continuă v-a fi necesar de setat acest bit doar la prima conversie. iar în 0 CAD este oprit.ADFR – ADC Free Running Mode.56V 10 .

Dispozitivul dat functioneaza in 3 regimuri. 4. Regim autonom-este setat prin apasarea butonului 1. 3.intrucit insasi dispozitivul la detectarea faptului ca salul este uscat porneste apa.dar sub forma de stropi mici de ploaie.La detectarea solului uscat porneste o semnaluzare implimentata de un set de luduri ce clipesc in truna .Rezolvarea problemei: Pentru a implimenta in practica problema pusa ca scop a lucrarii date am elaborat un dispozitiv.Permire lasarea autonoma.pompa lucreaza un timp de 30 s. 11 . pe o perioada indelungata de timp a plantei .Permite udarea florii in perioada de luminozitate in cintinuu.Detectarea se face folosind un Moisture Senzori()valoarea de pe care este captata si comparata cu o valoare de referinta prin intermediul unui AC.in functie de preferintele utilizatorului si in flunctie de planta ce este oprovizionata cu apa: 1.Regimul pentru amatorii de a uda de sinestatator planta. Daca solul ajunse la valoarea nominala(sol uscat 700kohm. Regim semiautonom-este pornit prin setarea butonului 2. Regim tropic-se porneste prin setarea butonului 3. “udare automat pentru plante de camera”. 2.E un regim creat in special pentru florile tropicale. Butonul 4 permite resetarea regimului ales.sol umed 300kohmi) atunci are loc pornirea unei pompe Kamoer New.

Vizualizarea solutiei: 1)Solutia implimentata in Proteus: 2)Solutia implimentata in scheme blok: 12 . 5.

13 .

Nu este o eroare mare dar . 6.fiind utilizat in alte dispozitive poate cauza probleme.minimum o intrerupere inafara de intreruperea RESET-ISR extern.Posibil o solutie mai perfecta ar fi utilizarea unui ADC. Prigramul executat indeplineste cu strictete cerintele puse de profesor intrucit cuprinde: minimum 2 module periferice in afara de GPIO-AC. Am utilizat un AtMega32.In timpul executiei observam ca AC nu ne permite determinarea unei valori fixe la care sa se porneasca pompa.Pentru o utilizare mai usoara a dispoztivului dat am introdus un afisor 7Seg.o subrutina e necesar sa fie implimentata in limpajul ASM.Proectul este functionabil .aceasta valoare poate devia +-1%. NrTo7Seg.TAIMER.Concluzii: Efectuînd această lucrare am acumulat abilitati practice de proiectare a circuitelor electronice in programul Proteus si de a implineta cod C pentru AtMga32 folosind Atmel Studio.delay.ADC.Acesta permite vizualizarea regimului ales. 14 . solutiile este realizate modular cu grupare pe fisiere si subrutine.fapt demonstrat de imaginile simularii din Proteus anexate.Cele 3 regimuri implimentate (dscrise mai sus) functioneaza.

easyelectronics.ru/post/210814/ 3. www.mcu-labs.ru/ 15 . Bibliografie: 1.md 2. http://habrahabr.

Functiile ASM uncluse in cod: delay.0 //verificam daca am ajuns la 0 brne delay_loop //daca nu e 0 repetam scaderea ret *///sugrutina de transformare a combinatiilor //pentru afisorul cu 7 segmente //finctia ASM va urma sa fie inclusa in codul C #define _SFR_ASM_COMPAT 1 #define _SFR_OFFSET 0 .ADC.Au fost folosite modulele periferice sus descrise.0xFF //incarcind in acesta valoarea maximal posibila delay_loop: sbiw R24.adica:GPIO.1 breq unu cpi R24. Z cpi R24.1 //scadem cite o unitate din val reg. NrTo7Seg .Programare structurata pe fisiere 4.Biblioteca personala Listingul programului: #define _SFR_ASM_COMPAT 1 #define _SFR_OFFSET 0 .2 breq doi cpi R24.Taimer.0 breq zero cpi R24. Anexa: Scurte explicatii: 1.AC.0xFF //initializam reg Z ldi R23.global delay //anuntam ca functie globala delay: ldi R24. Ext INIT. 3. 2.3 16 .global NrTo7Seg //anuntam ca functie globala //finctia ASM NrTo7Seg: cpi R24.

4 breq patru cpi R24.0b01001111 rjmp sub_end patru: ldi R24.0b01111101 rjmp sub_end sapte: ldi R24.h> #include <util/delay.9 breq noua zero: ldi R24. breq trei cpi R24.7 breq sapte cpi R24.0b01111111 rjmp sub_end noua: ldi R24.8 breq opt cpi R24.0b01100110 rjmp sub_end cinci: ldi R24.0b01101101 rjmp sub_end sase: ldi R24.0b00000110 rjmp sub_end doi: ldi R24.h> #include "keyboard_drv.0b00111111 rjmp sub_end unu: ldi R24.0b01101111 rjmp sub_end sub_end: ret #include <avr/interrupt.5 breq cinci cpi R24.0b01011011 rjmp sub_end trei: ldi R24.6 breq sase cpi R24.h" 17 .0b00000111 rjmp sub_end opt: ldi R24.

//salvam in variabila row valoarea rindului key = row | col.//nimic nu afiseaza } return key .. case 0b11011101 : key = 4 . col.7 iesire DDRC = 0x0f. char GetKey(void). case 0b11011110 : key = 3 ... PORTC = 0x0f.//4 break .//finctia returneaza pozitia tastei } //functia ce transfota pozitia tastei in cod //ce permite afisarea valorii tastei pe afisorul cu 7 segmente //parametru de intrare este combinatia ce dorum sa o transformam //returnam codul e ormeaza a fi transmis la afisor char keyToChar ( char key) { switch (key) { case 0b11101110 : key = 1 . key. //salvam in key valoarea tastei //reinitializam portul pentru urmatoarele manipulari DDRC =0xf0 .//2 break .3:iesire.//1 break . row = PINC. case 0b11101101 : key = 2 . char keyToChar ( char ). default: key=0b0000000.7 intrare DDRC = 0xf0. PORTC = 0xF0.//5 break . //functia ce permite citirea tastei abasate //tastele sunt puse pe portul B char GetKey(void) { int row..3:intrare.... //configuram portul ca 0. return key. //salvam in variabila col valoarea coloanei //configuram portul ca 0. PORTC = 0x0f. } 18 .4.4.. col = PINC.

// conectarea pinului ain0 la AComp ACSR |= (1<<ACIS1)|(1<<ACIS0) . // timer overflow interrup enable } void S30_Sec(){ int i. // interrupt enable } void InitTaimer(){ TCCR0 |= (1 << CS02) | (0 << CS01) | (1 << CS00) . } void PermitCom() { ACSR |= ( 1 << ACIE ) . // conectarea pinului ain1 la AComp ACSR &= ~(1<<ACBG) . 19 .h" void INIT_ADC(void){ //initializarea ADC si taimer1 SFIOR &= ~(1<<ACME) . } void IntrInit(void){ GICR|=(1<<INT0). } PORTB &= ~(1<<PB7). // setarea prescaler TIMSK |= (1 << TOIE0 ) . // rising edge ACSR |= ( 1 << ACIE ) . #endif #include <avr/io. if (i<30) { InitTaimer(). char keyToChar ( char) .h> #include "board_configuration.#ifndef keyboard_drv #define keyboard_drv char GetKey().

void S30_Sec(). } #ifndef board_configuration #define board_configuration #define FMCU 1000000 //fregventa MC #define F_T0 FMCU/256 //fregventa taimerului #define FINT_T0 F_T0/256 //fregventa la care are loc intreruperia #define TCNT0_INIT 256-(F_T0/FINT_T0) // void INIT_ADC(). void IntrInit().h> #include "stropitoare_drv. void InitTaimer(). //referinta externa ADCSRA |= (1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2).h" void InitAcdSTROPITOARE(){ ADMUX |= (1<<REFS1)|(1<<REFS0)|(1<<MUX0)|(1<<MUX1)|(1<<MUX2). TCCR1B |= (0<<WGM13)|(1<<WGM12)|(1<<CS11). //ADSC-pornim conversia //ADEN-permitem coversia //ADEI-permite ixecutia ISR //ADPS –configuram prescalerul AD convertor } void InitTaimerStrropitoare() { TCCR1A |= (1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0)|(1<<WGM11)|(1<<WGM10).taimer counter/8. void PermitCom().h> #include <util/delay. MCUCR |= (1<<ISC01)|(0<<ISC00). //com…-la detectarea coincidentei are loc trecerea in “1” a semnalului de PWM //WGM – configuratia pentru semnalul Fast PWM //CS –cloc select. #endif #include <avr/interrupt. } 20 .

int regim.ISR(ADC_vect){ char ch. InitTaimerStrropitoare(). void PORT_INIT(void){ DDRB |= (1<<7) .trans. //legatura cu asambler. 21 . } #ifndef board_configuration #define board_configuration void InitTaimerStrropitoare(). #endif #include <avr/io.h" #include "board_configuration. PORTB =(1<<PB7). ch=0b00000111.h" extern char NrTo7Seg(char). ADMUX|=ch. DDRC = 0xff . //pornim conversia din nou } void Stropitoare(){ DDRB &=~(1<<PB7). InitAcdSTROPITOARE().h> #include <util/delay. ADCSRA |= 1<<ADSC . OCR1A = ADC.includem functia extern char delay ().h> #include <avr/interrupt. PORTB &= ~ ((1<<7) ). void InitAcdSTROPITOARE(). int secunde. int key. void Stropitoare().h> #include "keyboard_drv.

} } ISR (INT0_vect){ key=GetKey(). PORTD =(1<<PD2)|(0<<PD7). break. DDRD |= (1<<PD7). //transformarea valorii tastei in simbolul ce urmeaza a fi afisat switch(trans){ case 1: trans=NrTo7Seg(trans). //afisarea la afisorul cu 7 segmente PermitCom(). case 2: trans=NrTo7Seg(trans). case 3: 22 . //apelam functia de initializare a intreruperii INIT_ADC() .PORTC = 0x00 . regim=1. regim=2. while(1){ //InitTaimer(). //afisarea la afisorul cu 7 segmente PermitCom(). } int main(void) { PORT_INIT() . //determinarea valorii tastei trans=keyToChar (key). sei() . PORTA=trans. PORTA=trans. IntrInit(). break. // vom folosi intreruperia zero DDRA = 0b01111111. PORTA = 0x00.

case 2: LedMeg(). PORTA=trans. //afisarea la afisorul cu 7 segmente } ISR(ANA_COMP_vect){ while ( ACSR & (1<<ACO) ) { // daca bitul ACO in ACSR este setat switch(regim) { case 1: PORTB |= ( 1 << PB7) . case 4: reset(). //afisarea la afisorul cu 7 segmente break. trans=NrTo7Seg(trans). default: PORTA|=0x00. Stropitoare(). } }*/break. /*if (secunde>3) { PORTB &= ~( 1 << PB7) . default: trans=0x00. InitTaimer(). break. case 3: Stropitoare(). break. break. } //PORTA=trans. } // aprinde ledu 23 .

PORTB &=~(1<<PD7). _delay_ms(1000). PORTD = 0x00. PORTB = 0x00. } 24 . PORTD &= ~(1<<PD3). PORTD |= (1<<PD3). } void reset(){ PORTA = 0x00. delay(). PORTC = 0x00. } void LedMeg() { DDRD |=(1<<PD3).} } ISR(TIMER0_OVF_vect)// PRElucrarea a intreruperii taimerului { TCNT0=TCNT0_INIT.

Rezultatele implimentarii solutiei date: 25 .

26 .