Sunteți pe pagina 1din 80
Laborator Microcontrolere Lucrarea 1 Microcontrolerul ATmega32. Utilizarea porturilor Scopul lucr’rii a) Nojiuni generale despre ATmega32 b) Setul de instructiuni al ATmega32 c) Porturile ATmega32 si exemple de utilizare 4d) Programarea unor aplicafii utilizind placa de dezvoltare Easy AVRW7 1. Nofiuni generale ATmega32 este un microcontroler RISC pe & bifi realizat de firma Atmel. Caracteristicile principale ale acestuia sunt: 32KB de memorie Flash reinscriptibilé pentru stocarea codului - 2KB de memorie RAM - 1KB de memorie EEPROM - doud numiratoare/temporizatoare de 8 bifi - un numiritor/temporizator de 16 biti - confine un convertor analog — digital cu intrari multiple - confine un comparator analogic = confine un modul USART pentru comunicatie serial - dispune de oscilator intern = oferi 32 de linii /O organizate in patru porturi Structura intern’ generali a controlerului este prezentati in Figura 1. Se poate observa c& existi o magistralé general de date la care sunt conectate mai multe module: - unitatea aritmetic’ si logic’ (ALU) - registrele generale - memoria RAM gi memoria EEPROM - liniile de intrare (porturile — I/O Lines) si celelalte blocuri de intrare‘iesire. Aceste ultime module sunt controlate de un set special de registre, fiecare modul avand asociat un numar de registre specifice. Memoria Flash de program impreund cu intreg blocul de extragere a instructiunilor, decodare gi executie comunic’ printr-o magistrala proprie, separati de magistrala de date mentionati mai sus. Acest tip de organizare este conform principiilor unei arhitecturi Harvad si permite controlerului si execute instructiunile foarte rapid Data Bus bt + Trtuston Decoder + Contr! Lines: Direct Adaressing Inereet Adoressing EEPROM Figura 1. Structura bloc general a microcontrolerului ATmega32 ATmega32 confine 32 de registre de uz general si 64 de registre speciale pentru modulele I/O. Aceste registre sunt mapate la adrese din memoria RAM cuprinse intre 0000h si 00SFh. Una din caracteristicile foarte importante pentru orice procesor si in particular pentru microcontrolere este sistemul de intreruperi, © intrerupere reprezinté un semnal generat de un modul extern unitiii centrale de procesare (CPU) pentru a anunja aparitia unui eveniment care trebuie tratat. Utilizarea unui astfel de sistem permite implementarea de module specializate care si execute operafii in paralel cu CPU §i s& solicite intervenfia acestuia numai la terminarea operafiilor sau in alte cazuri definite. ATmega32 dispune de 21 surse de intrerupere. Atunci cand una dintre ele devine activi se suspend cursul normal de execufie si se face salt automat la o adres prestabiliti din memoria program, Astfel, structura tipied a unui program confine la adresele respective instructiuni care apeleazi procedurile create special pentru fiecare intrerupere: mp RESET ‘imp EXT INTO vjmp EXT INTI “jmp EXT INT2 vimp TIM2_ COMP “jmp TIM2_OVE vjmp TIMI CAPT imp TIMI COMPA Limp TIMI COMPB ‘jmp TIMI_OVE ‘imp TIMO_COMP jmp TIMO_OVF limp SPI STC. mp USART_RXC ‘jmp USART_UDRE simp USART_IXC simp ADC ‘jmp EE_RDY jmp ANA_COMP imp THT jmp SPM_RDY RESET: Idi r 16 high(RAMEND) out SPH r16 Idi 16 Jow(RAMEND) out SPL,£16 Daci una din intreruperi nu este utilizati se recomanda ca pe pozigia acesteia si se introduci o instructiune de salt cltre eticheta RESET. Primele patru instructiuni care apar dup’ eticheta RESET sunt utilizate pentru a initializa pointer-ul de stiva definit de registrele SPH gi SPL. 2, Setul de instruetiuni ATmega32 dispune de un registru special de stare ai cdrui biti oferd informatii despre rezultatul ultimei instructiuni aritmetice sau logice executate. Componenta registrului de stare este prezentat’ in Figura 2. wi 1 : eT sto exits RRR 7a bavee 00 Figura 2. Registrul de stare Registrul de stare SREG contine urmatorii biti - bitul 7 —activare/dezactivare globala intreruperi Acest bit trebuie si aibi valoarea ..1” pentru a permite executia oricirei intreruperi. Daci are valoarea ,,0” orice sursi de intrerupere este dezactivati. = bitul 6 —bit de copiere - bitul 5 —indicator de transport la jumatate - bitul 4— indicator de semn - bitul 3 — indicator de depasire in cazul operaiilor in complement faja de doi - bitul 2 —indicator de rezultat negativ - bitul | — indicator de zero Acest bit devine ..1” daca rezultatul unei operafii aritmetice sau logice a fost zero. - bitul 0 — indicator de transport Acest bit devine .1” in cazul unei depasiri la operatii pe 8 biti ATmega32 dispune de un set de 131 de instructiuni grupate in mai multe categorii ce vor fi prezentate in continuare. 21 2.2. Instructiuni aritmetice si logice Cele mai uzuale instructiuni aritmetice gi logice sunt: - ADD Rd,Rr Efectul: se aduna confinutul registrului Rd cu cel al registrului Rr si rezultatul se pune in Rd - ADC Rd,Rr Efectul: se aduni confinutul registrului Rd cu cel al registrului Rr si cu indicatorul de transport si rezultatul se pune in Rd. - SUBRd,Rr Efectul: se scade confinutul registrului Rr din cel al registrului Rd gi rezultatul se pune inRd - ANDRdRr Efectul: se face .,$I logic” intre confinutul registrului Rd gi cel al registrului Rr iar rezultatul se pune in Rd. - INCRd Efectul: incrementeazi confinutul registrului Rd si pune rezultatul in Rd - DECRd Efectul: decrementeaz’ continutul registrului Rd si pune rezultatul in Rd Instructiuni de salt Cele mai uzuale instructiuni de salt sunt - JMPk Efectul: se face salt neconditionat cu ,k” pozitii fafi de adresa curenta din memoria program. Instrucfiunea se poate utiliza si in forma ,.JMP eticheta”. - RCALL subrutina Efectul: se apeleazi o subrutini. Pentru a reveni din aceasta se utilizeazi instructiunea RET. - RETI Efectul: se revenire dintr-o subrutina de tratare a unei intreruperi, - CPSE Rd,Rr Efectul: se compara valorile registrilor Rd gi Rr si in caz de egalitate instructiunea imediat urmitoare nu se mai executl. - CPRd,Rr Efectul: compari valorile registrilor Rd si Rr firi si modifice continutul acestora, Ca urmare a executici acestei instructiuni se vor schimba corespunzitor bifii registrului de stare. - SBRC Rd,b Efectul: dac& bitul b din registrul Rd are valoarea ,,0” instructiunea imediat urmatoare nu se mai executa. - SBRS Rd,b Efectul: daca bitul b din registrul Rd are valoarea ,,1” instructiunea imediat urmitoare nu se mai executa. 2.3. 3. 3.1 - SBIC P,b Efectul: daca bitul b din registrul de intrare/iesire P are valoarea ,.0” instructiunea imediat urmatoare nu se mai executi. - SBIS P,b Efectul: daca bitul b din registrul de intrare/iesire P are valoarea ,,1 instructiunea imediat urmitoare nu se mai executl. - BREQ eticheta Efectul; daca indicatorul Z are valoarea ,,1” se face salt la eticheta, Instructiuni de transfer Cele mai uzuale instructiuni de transfer sunt: - MOV RdRr Efectul: copiaz continutul registrului Rr in registrul Rd - LDIRdk Efectul: copiazi valoarea k in registrul Rd. Aceasti instructiune lucreazi numai cu registrele 116 — 131 - INRGP Efectul: copia’ continutul registrului de intrare/iesire P in registrul Rd - OUT P,Rr Efectul: copiazi continutul registrului Rr in registrul de intrare/iegire P. Instructiuni care lucreazé la nivel de bit Cele mai uzuale instructiuni care lucreazi la nivel de bit sunt: - SBIP,b Efectul: bitul b din registrul de intrare/iesire P ia valoarea 1”. Instrucfiunea se poate utiliza numai pentru registri P situati la adresele de memorie 20h — 3Fh. - CBIP,b Efectul: bitul b din registrul de intrare/iesire P ia valoarea .,0”, Instruotiunea se poate utiliza numai pentru registri P situati la adresele de memorie 20h — 3Fh. - LSLRd Efectul: Registrul Rd este deplasat logic la stiinga cu 0 pozitie. - RORRd Efectul: Registrul Rd este rotit la dreapta cu o pozitie prin bitul indicator de transport. Instructiuni speciale Instructiunile speciale sunt. - NOP - SLEEP - WDR Porturile ATmega32 Prezentare generald ATmega32 dispune de 32 de linii de 1/0 grupate in patru porturi de 8 bifi Porturile sunt denumite cu literele A, B, C si D. Fiecare pin al oricarui port se poate seta individual ca intrare sau jesire fara si afecteze ceilalfi pini. In plus, anumiti pini se pot utiliza pentru functii speciale ale microcontrolerului. In Figura 3 este prezentati structura general a unui pin. Tofi cei 32 de pini au fiecare cate o rezistenfa ,.pull-up” care poate fi activata sau dezactivati. a Con — pu Figura 3. Structura general a unui pin Operatiile cu porturile se fac prin intermediul unui set de patru registri alocagi fiecirui port: PORTx, PINx si DDRx, x poate fi A, B, C sau D. Acesti registri fac parte din categoria regigtri de intrare/iegire de aceea instructiunile care pot lucra direct cu ei sunt CBI, SBI, IN 5i OUT. Registrii DDRx stabilesc dac& un pin este intrare sau iesire. Astfel, un bit cu valoarea 1” in registrul DDRx face ca pinul corespunzitor si fie considerat iegire, altfel pinul va fi intrare. Registrii PORT sunt utilizagi pentru a serie o valoare in portul corespunzitor iar registrii PINx se folosese pentru a citi valoarea prezenti pe pinii unui port. Activarea sau dezactivarea rezistenfelor ,pull-up” este determinat% de bitul PUD din registrul SFIOR gi de valorile registrilor PORTx si DDRx aga cum se poate observa in tabelul urmitor. Bitul din DDRx | Bitul din PORTx | —Bitul PUD | Tipul pinului | Rezistenta pull-up o 0 mu conteazi- intrare inactiva, 0 1 or inirare activa 0 1 1 intrare inactiva L 0 mu conteaza, iegire inactiva 1 1 mu conteaza iesire inactiva, 3.2. Prezentare generalti a mediului software Atmel Studlio Atmel Studio este un mediu software dezvoltat de Atmel pentru scrierea in limbaj de asamblare sau C/C++, compilarea gi simularea de programe destinate microcontrolerelor produse de aceast companie Orice program seris in Atmel Studio este confinut intr-o structuri de tip proiect, Pasi care trebuie urmati pentru a crea un program nou sunt: - dup lansarea programului, apare o fereastr& similar’ cu cea din Figura 4. Se va alege optiunea ,.New Project”; 6 Figura 4, Fereastra de dialog primar din Atmel Studio - inacest moment se va afiga o fereastr§ aseminitoare cu cea din Figura 5. Se selecteazi ca Template Assembler” gi apoi , AVR Assembler Project” si se bifeazi optiunea Create directory for solution”. Apoi se completeazi campurile Name” si ,Location” i se apas’ butonul OK”, SSS TEE cE Type: Avene renee AVR it ener pre aed Temple 2) Bi stents se Mame ‘aserledgphaioal sete CiPrgrr ie ie) melee SucieSF Sion ame Acerblaigptestont Figura 5, Fereastra de dialog pentru denumirea proiectului (solution) - din fereastra care apare se selecteazi din list’ modelul de microcontroler — fn cazul acestui laborator ,ATmega 32” $i in final se apasi butonul ,OK”, | ene Name ‘App Boot Memory (Kbytes) Data Memory (oytes) EEPROM (by Device Info: ATmegai69PA 16 1024 312 *| Device Name; Almena32 ATmegal64 16 1024 512 oe ATmegal6HVA 16 2 255 Vee 27138 Aimegai6HVE 16 1024 52 ei. peoae Aimegai6HVBrev8 16 1024 siz ATmegai6Mi 16 1024 312 ‘Di Datasneats ATmegai6v2 16 sz S12 Atmegai6us 16 1280 512 Supported Tools Atmega2sed 255 a 2096 AimeliCE . ATmmega2561 256 au 4096 ‘ sasurmesr wn =a =1-—_ xe UU =i TES | Figura |. Schema bloc a modulului ADC Rolul oricdrui modul de conversie A/D este de a transforma o tensiune analogica intr-o valoare numerica. Cele mai importante elemente care definesc aceasta transformare sunt valoarea tensiunii de referinja gi rezolutia convertorului. Astfel, rezolutia stabileste numarul maxim de trepte in care se poate cuantiza tensiunea de intrare iar tensiunea de referin{a stabileste valoarea maxima a tensiunii de intrare. Daca notém cu N rezolutia si Veer tensiunea de referinfa, atunci treapta unui converter A/D sau 1 LSB se defineste ca: 1 LSB = Vyer/ 2% (V) Valoarea treptei se exprima in volti si in functie de aceasta si rezultatul conversiei C, se poate afla tensiunea de intrare in convertor Vi, pe baza relatiei Vin = C*1 LSB(V) Valoarea maxima a tensiunii de intrare care poate fi masurata este intotdeauna Vrer— 1 LSB. Modulul ADC din ATmega16 poate avea trei surse ca tensiune de referin{a: - valoarea de pe pinul AVCC - valoarea de pe pinul AREF =o tensiune generata intern cu valoarea de 2,56V in cadrul acestui laborator se va utiliza ca tensiune de referinta valoarea tensiunii de alimentare de 5V pe care placa de dezvoltare EasyAVRV7 0 conecteazA pe pinul AREF. Folosind formulele prezentate anterior, pentru rezolutia de 10 biti rezulta cd 1 LSB=4,88mV. Pentru a comanda si a utiliza modulul ADC, programatorul are la dispozitie un numéar de registrii care pot fi grupafi in urmatoarele categorii: = registrii ADCL si ADCH pentru stocarea rezultatului unei conversii - registrii generali de configurare: ADMUX si ADCSRA - registrul special de configurare SFIOR, utilizat si de alte module ale microcontrolerului 2.1. Configurarea si utilizarea modulului de conversie A‘D La finalul unei conversii, rezultatul acesteia se va regasi in registrii ADCH si ADCL. in mod normal, se citeste mai intai ADCL si apoi ADCH pentru a utiliza precizia completa de 10 biti, Cu toate acestea, daci s-a configurat alinierea rezultatului la sténga (Figura 3), utilizatorul poate citi numai registrul ADCH obtinand astfel 0 valoare mai usor de prelucrat dar care corespunde unei precizii a convertorului de numai 8 biti Convertorul poate masura tensiunea aplicaté pe oricare din cele opt canale reprezentate de pinii ADCO...ADC7, dar nu simultan. De aceea, numai unul dintre acestea va fi activ la un moment dat, selectia realizandu-se pe baza unor biti din registrul ADMUX. Trebuie avut in vedere ca acesti biti pot fi oricdnd modificati dar, la nivelul hardware, selectia unui nou canal se face imediat numai daca nici o conversie nu este in desfasurare. Altfel, selectia se va realiza dupa ce se termina conversia curenta. Registrii utilizati pentru configurare sunt ADMUX, ADCSRA gi SFIOR. O deseriere generala a bitilor registrului ADMUX este dati in tabelul de mai jos. Denumirea bitului Descriere 1 REFS1 REFS1 REFS0 an a o AREF ; 0 1 VOC 6 REFSO 1 0 ‘Neutilizat H 1 3.56V inter Valoarea 0 determina alinierea la dreapta a rezultatului conversiei, aga cum se poate vedea in 2 ADLAR Figura 2. Valoarea | determina alinierea la sténga a rezultatului conversiei, ca in Figura 3. 4 MUX4 Combinatia acestor bii selecteaza canalul de 3 MUX3 intrare pentru ADC. fn cadrul laboratorului se va 2 MUX2 utiliza doar setarea 00000 care corespunde 1 MUX1 canalului ADCO, adica pinul PAO al 0 MUX0 microcontrolerului. 6 4 8 et tt 5 poo Figura 2. ADCH si ADCL in cazul alinierii la dreapta a rezultatului conversiei 6s 4 ee tt it Eee Pe eS] = [xen] vt 7 > 7 7 7 Figura 3, ADCH si ADCL in cazul alinierii la stnga a rezultatului conversiei O descriere generala a bitilor registrului ADCSRA este dati in tabelul de mai jos. Utilizatorul trebuie s4 acorde atentie mai ales bitilor ADPSO...ADPS2 care stabilesc frecventa ceasului convertorului functie de frecventa de tact a procesorului, fox. Astfel, convertorul are nevoie de un semnal de tact cuprins intre S0kHz si 200kHz pentru a functiona corect. . Denumirea bitului Descriere bitului Acest bit trebuie sa fie 1 pentru ca modulul ADC 7 ADEN * ¢. si functioneze. Altfel, acesta este oprit 6 ADSC Cand acest bit devine | se initiaza inceperea unei conversii 4 ‘Cand acest bit este 1, dupa o prima conversie 5 ADATE initiata de utilizator, convertorul va realiza automat alte conversii in functie de evenimentele selectate in registrul SFIOR 4 ADIF Acest bit devine | la terminarea unei conversii A = Valoarea | activeaza intreruperea la finalizarea conversiei 2 ADPS2 ADPS2 ADPS1 ADPSO Ceasul ADC 0 0 7 Told ; 0 0 T fal? 1 ADPS1 0 T 0 Tol 0 T T fa/8 T 0 0 Tat 16 i 0 T Tag 32 o ADPSO H T 0 1/64 T T T Ta) DS Bitii 5 (ADTSO), 6 (ADTS1) si 7 (ADTS2) din registrul SFIOR selecteazd evenimentul care declanseaz4 o noua conversie in modul de functionare automat (ADATE=1). Aceste evenimente sunt de fapt semnale de intrerupere i utilizarea lor va determina activarea flagului corespunzator. Acesta trebuie s4 fie dezactivat dupa ce s-a realizat 0 conversie pentru a permite 0 noua autodeclansare la respectivul eveniment. Deoarece acest registru este utilizat si de alte module ale microcontrolerului, utilizatorul va avea grij4 s4 nu modifice decat valoarea bitilor 5..7 ale caror combinatii posibile sunt descrise in tabelul de mai jos. ADTs2 | ADTs1 | ADTSO Eveniment de autodeclansare a a a Functionare permanenta: dupa terminarea unei conversii se incepe imediat alta s a f Semnalul de intrerupere generat de comparatorul analogic a ; ; Semnalul de intrerupere generat de intreruperea externa 0 Semnalul de intrerupere generat cand o i i Timer/Counter0 atinge valoarea de prag Semnalul de intrerupere generat cdnd 1 0 0 T:, + . . Timer/Counter0 atinge valoarea maxima Semnalul de intrerupere generat cand 1 0 1 . timerul pe 16 biti atinge valoarea de prag B 1 1 } | Semmalul de intrerupere generat cand timerul pe 16 biti atinge valoarea maxima ji ; i Semnalul de intrerupere generat de unitatea de captura a timerului pe 16 biti 3 Prezentarea modulelor LCD alfanumerice Un modul LCD alfanumeric este format dintr-un ecran LCD gi o serie de circuite integrate care asiguri comanda gi controlul acestuia. Astfel, se pot afisa caractere si cifre prin intermediul unei interfete de tip magistrala formata din 8 sau 4 biti de date si 3 semnale de comanda: RS, R/W gi E. Orice modul LCD are prestabilit un anumit set de caractere si dispune de doua tipuri de memorii RAM: una pentru afigare de caractere si una pentru a memora modele pentru caractere noi. Ficarui caracter de pe ecran ii corespunde o locatie prestabilita din memoria RAM pentru afigare. Astfel, atunci cand utilizatorul doreste sa afiseze un caracter, el trebuie s& scrie codul caracterului in locatia RAM corespunzatoare. Dupa ce s-a efectuat o scriere, adresa RAM este automat incrementata de modulul de afisare astfel c&, daca se afigeaz pe pozitii succesive, nu mai este nevoie sa se seteze de fiecare data adresa. Pentru un afigor cu 2 rénduri a cate 16 caractere fiecare, corespondenta intre adresa_ din memoria RAM de afisare (valori in hexazecimal) si pozitia caracterului pe ecran este data in tabelul de mai jos. Poaeve Ti T2falafs|o]7[s]ofo[u]elulu|is| i Adres rind Yoo | or | o2 | 03 [ ot | 0s | 06 | 07 | os |» [oa | on | oc | op | or | oF ares rand | ao | at [a2 [a3 | as [as [ao | a7 | as | a9 [4a [an [ac | ap | ae | ae Setul prestabilit de caractere defineste codul asociat fiecdrui caracter pe care il poate afisa modulul respectiv si difera de la un producator la altul. Cu toate acestea, in majoritatea cazurilor cifrele, literele mari si mici, semnele de punctuatie precum si simbolurile matematice uzuale au acelasi cod ca cel din tabela ASCII Comunicarea cu un modul de afisare LCD se face prin intermediul unor comenzi descrise in documentatia producatorului, Aceste comenzi sunt definite de combinatia semnalelor RS, R/W si a unui numar de 8 biti de date. in plu semnalul E trece din 0 in 1, datele de pe magistrala de comunicatie (avand 8 sau 4 biti) sunt preluate de cdtre modulul de afisare. Atunci cand se lucreazi cu o magistrala de 4 bifi, se transmite mai intai partea superioara din cei 8 biti de date ai unei comenzi si apoi partea inferioara. Dupa ce a primit tofi bitii corespunzatori unei comenzi, modulul LCD incepe execufia acesteia. in aceasta perioada nu se mai poate transmite nici o alté comanda, prin urmare utilizatorul trebuie fie s& astepte timpul de executie minim specificat de producator, fie sa citeas in permanenta indicatorul Busy al modulului LCD pana cand acesta semnaleaza finalizarea comenzii. Setul de comenzi al unui modul LCD poate fi impartit in urmatoarele categorii generale = comenzi de initializare si configurare = comanda de selectie a unei adrese din memoria RAM pentru afigare de caractere - comanda de selectie a unei adrese din memoria RAM pentru memorarea de modele pentru caractere noi = comanda de citire a indicatorului Busy - comanda de scriere a datelor in una din memoriile RAM selectate - comanda de citire a datelor din una dintre memoriile RAM selectate Pentru a selecta o adresi din memoria RAM pentru afisare de caractere, semnalele R/W si RS trebuie sa fie 0, bitul de date 7 trebuie sa fie 1 iar bitii de date 0...6 trebuie 4 confind valoarea adresei care se selecteazai Pentru a scrie o valoare la o adresa selectata din oricare memorie RAM, semnalul R/W trebuie sa fie 0, semnalul RS trebuie sa fie | iar bitii de date trebuie sa confina valoarea care se doreste a fi scrisa. In cadrul acestui laborator se va utiliza un modul LCD cu 2 linii a cate 16 caractere fiecare, conectat pe o magistrala de 4 biti: PC4, PCS, PC6 si PC7. Semnalul RS este comandat de PA2, semnalul R/W este conectat in permanenta la OV iar semnalul E este comandat de PD6. Pe perioada de executie a unei comenzi de catre modulul de afisare se vor genera intervale de asteptare cu aproximativ 10% mai mari decat timpii de executie specificati de producator. 4. Exemple de programe a) Sas scrie un program care afigeaz pe randul 1 al modulului LCD textul Lab. microC pe randul 2 textul ,Mesaj test”. + Setare porturi ¥ Setare Timer 0 q Iniializare display q Selectare RAM rind 1 4 ‘Transmiter q Selectare RAM rind 2 t Transmitere text rind 2 ext rind 1 fe "ma2def inc” equ rs=PA2 equ e=PDS 1di r16,high (AMEND) out ldi out adi out ldi out adi out SPH, £16 116, Low (RAMEND) eli et ebi ldi out, SPL, £16 16, 0b11110000 DRC, r16 + pinii PCT...Pcé sunt iesiri 16, 001000000 DDRD, r16 + pinul PD6 este iesire 16, 0800000100 DORA, r16 + pinul PAZ este iesire ctrlye ctel2, rs 16,0000001000 ;setare timerO:nu se utiliz. pinul 0cO, timerul este oprit deocandata TCCRO, r16 pmodul va fi CTC cu prag dat de ocrd in ri6, TINSK andi r16,0b11111100 ;nu ge utiliz, nici o intrer., fara a modifica alti biti din TIMSK out TIMSK, r16 call init display di £17, 0510000000 call set_ram sprin £17 se seteaza adresa 0x00 pentru RAM de afisare Adi 117,7L" call put_char 1a 117, 7a" call put_char idi 117," call put_char idi 27,7." ppunct call put_char ldi z17,7 pspatiu call put_char ldi x17, 7m" call put_char ldi 217,74" all put_char ld x17,7e" all put_char ld x17,7r" call put_char ldi 117,70" call put_char ldi x17,70" call put_char ld x17," * call put_char ld 217,74" all put_char dai r17,0b11000011 ;prin r1? se seteaza adresa 0x42 pentru RAM de afisare call set_ram idi call put, ldi 17, 117,72" call put_char ldi 117,73" call put_char ldi x17,7a" call put_char ld 17,73" call put_char ld x17, call put_char 1ai 17,7" all put_char ida x17,7e" call put_char ld x17,78" call put_char ld 217,70" all put_char bucla: xjmp bucla init_displa cbi Strl2,r8 Idi 116, 0b00100000 out PoRTC, r16 sbi ctrl, call wait_deus ebi etrl,e Adi £16, 0b00100000 ‘out PoRTC, £16 sbi ctrl,< call wait_4us cbi ctrl,e Idi 116, db10000000 out PoRTC, r16 sbi ctrl,< call wait_4us chi ctrl,e call wait_30ms Adi £16, 000000000 owt PORTC, r16 sbi ctrl,e call wait_48us obi ctrl,e Adi 116, 0511000000 out PORTC, r16 sbi ctrl,< call wait_d8us cbi ctrl,e call wait_30ns Adi 116, 0500000000 out PORTC, r16 sbi ctrl,< call wait_4eus epi ctrl,e Idi £16, 0500010000 out PORTC, r16 sbi ctrl, call wait_4eus cbi ctrl,e call wait_30ms Adi £16, 000000000 out PORTC, r16 sbi ctrl, call wait 4us obi ctrl,e 1di 16, 0500100000 out PORTC, r16 sbi ctrl, call wait_49us obi ctrl,é call wait_30ms ret set_zan: epi ctri2,r8 mov x16, £17 andi r16,0xF0 se retine doar nibble (4 biti) superior out PORTC, £16 sbi ctel,< nop nop ebi ctrl,e mov r16,£17 10 andi r16, 0x08 swap r16 out PORTC, r16 sbi ctrl, nop nop cbi ctrl,e call wait_4eus ret put_char: sbi ctrl2, re mov £16, £17 andi £16, 0x60 out PORTC, r16 sbi ctzl,6 nop nop cbt ctzl,e mov £16, £17 andi r16,0x0F swap 116 out PORTC, £16 sbi ctrl,< nop, nop obi ctrl,e call wait _48us ret wait_4gus: 1di F16, 0x00 out TCNTO, £16 ldi 116, 0x06 out OCRO, r16 in rl6,76CRO andi ri6,0b11111000 fori 16, 0b00000011 out TCCRO, r16 wait: in r16,TIER sbrs ri6,0ceD xjmp wait in 116,TIFR ori £16, 0b00000010 out TIFR, £16 in r16,TCCRO andi ri6,0b11111000 out TCCRO, £16 wait_30ms: 1di F16, 0x00 out TCNTO, r16 lai 116, Oxe0 out CRO, r16 in 116,7CcRO andi r16,0b11111000 ori r16,0b00000101, out TCCRO, £16 waitl: in 116,T1FR sbrs r16,0CEO rjmp wait) in r16,TIFR fori £16, 0b00000010 out TIER, r16 in r16,TCCRO andi ri6,0b11111000 out TCCRO, £16 ret, jse retine doar nibble (4 biti) inferior pinterschimba nibble (4 biti) sup. cu nibble (4 biti) inf. se retine doar nibble (4 biti) superior 7 se retine doar nibble (4 biti) inferior } Anterschinba nibble (4 biti) sup. cu nibble (4 biti) inf. }se incarca valoarea de prag: Ox06=6 76 * 1/(8Miz/64) =48us ;se porneste timerul si este setat sa numere : la fiecare 64 perioade de ceas, fara a modif. alti biti Fse asteapta atingerea pragului ocrO pae reseteaza flagul pse opreste timerul ise incarca valoarea de prag: 0xF0=240 #240 * 1/(eMiiz/1024) =~ 30ms ise porneste timerul si este setat sa numere : la fiecare 1024 per. de ceas, fara a modif. alti biti fee asteapta atingerea pragului ocro pse reseteaza flagul pse opreste timerul nH b) Sa se scrie un program de tip .VU-metru” care aprinde succesiv ledurile conectate pe pinii PBO...PB7 in functie de valoarea tensiunii aplicat& pe pinul ADC6 al microcontrolerului Setare porturi I Setare ADC Ia finalizare conversie? Citire valoare converse Stingere leduri DA NU PORTB=0b00000001 DA NU PORTB=0b00000011 Valoare conversie f=1h2 in ri6,TCCRO andi ri6,0b11111000 fse porneste timerul si este setat sa numere ori 116, 000000011 pla fiecare 64 pericade de ceas, fara a modifica alti biti out TCCRO, r16 bucla: xjmp bucla refresh: in 120, SREG out PORTA, mx pse selecteaza digitul corespunzator Adi r16, 000001000 cp mux, r16 }se incarca cifra corespunzatoare bene PCH ? digitului selectat nov rl7,digitl rjmp refresh out lai 116, 000000100 op mux, r16 bene PC+3 nov r17,digit2 rjmp refresh_out 1ai 116, 000000010 op mux, r16 brne PC+3 mov rl7,digit3 rjmp refresh_out mov rl7,digitd refresh cut: Adi mH, high (2*cifn #se identifica codul ldi 2h,1ow(2*cifre) r corespunzator cifrei 1di tempi, 0x00 Fe alese add 21, r17 ade 2H, temp ‘pm templ,Z Lai £16, 000000010 ppenteul digitul 3 ep mux, r16 i trebuie sa aprind si virgula brne PC+2 ori templ,0b10000000 out PORTC, templ sin templ este codul corespunzator cifrei selectate ler mux pee pregateste selectia urnatorulul digit 1di 716, 0x00 op mux, £16 brne PCH Adi r16, 000001000 mov mux, £16 out SREG, 120 revi citire_temp: in 120,SREG call wire reset Idi temp, Oxcc peomanda "skip ROM" call wire write ;trimite 1a DS1820 continutul registrului temp 1di temp, 0x44 peonanda de initiere conversie call wire write obi wirectrl,wirepin temp wait: sbis wirein,wirepin pastept sa termine conversia rjmp temp wait call wirereset 7a terminat conversia, vol citi rezultatul Adi temp, Oxcc 10 call wire_write Idi temp, OxBE poomanda de citire scratchpad call wire write call wire read ise citeste in registrul temp primil octet din scratchpad call wirereset care este octetul inf al conversiei di 117, 0x00 ler temp pse extrage in carry bitul indicator de 1/2 grad bree cz Lai £17, 0x05 nov digitd,r17 pdigitul 4 (cel mai din dreapta) afiseaza 1/2 grad 1di 216, 0x00 nov digitl,rié nov digit2,r16 mov digit3,r16 temp_buclal: spe baza rezultatului conversiei ine digit? Fs se calculeaza cele 3 cifre zecinale Adi £16, 0x08, ? care se vor afisa ep digit3, ri6 bene buclal_next elr digit3 anc digit? Adi £16, 0x08, cp digit2,rl6 bene PC+3 clr digit2 ine digit] buclal_next: dec temp. breq PC#2 jmp temp_buclat out SREG, £20 revi, wire_reset: sbi Wirectrl,wirepin obi wireport,wirepin eli Idi 16,34 1/34 * 113 cicluri * 0,125us =~ a80us 1di_ temp2, 10 wx_Loopl: “lus 1/8 cicluri dec temp2 7/1 cielu brne wr_loopl 7/2 cicluri 1a salt inapoi; 1 ciclu altfel 1di temp2, 10 7 cielu dec ri6 7/1 ciclu brne we_loopl//2 cicluri la salt inapoi; 1 ciclu altfel ebi wirectrl,wirepin 7/2 cicluri Idi 116,50 1170, 5s wr_Loop?: us dec rie brne wr_loop? sbis wirein,wirepin //se verifica daca senzorul a raspuns rjmp Pc+3 sbi PORTD, 0 //sengorul nu a raspuns, aprind un led xjmp PC+2 chi PoRTD,0 //senzorul @ raspuns, sting Ledul ldi 116,29 //29 * 113 cicluri * 0,125us =~ 410us Adi temp2,10 ‘ex_Loops _lus 7/8 cicluri dec temp2 —_//1 ciclu brne wr_loop3//2 cicluri la salt inapoir 1 ciclu altfel Adi temp2,10 //1 ciclu dec rié JA ciclu brne wr_loop3 //2 cicluri la salt inapoi; 1 ciclu altfel ret nH wize_write: eli 1di_vemp2, 0x08 ‘wa_sendl Ls temp bres PCH rjmp wo write 1 rjmp wi_nextbit wi0: wwrite_o wu_nextbit: dec temp2 breg BCH jmp ww_sendl ret cli ds temp2, axae wr_getl: sbi wirectrl,wirepin cbi wireport,wirepin _lus Tins Tins Tins Tins Tins Tins Gbi wirectel,wirepin “tus Tius Tins Tius: “ius Thus Thus ctus Tus Bec //iciclu ; presupun ca am primit 1 sbis wirein,wirepin cle ror temp jin temp se va memora octetul primit 1di rle,s0 //50 * 11 ¥ 0,125us =~ 68. 75us, wre_loopi: lus dec rié Drne wre_loopl dec temp? breq Pc+2 rjmp ws_getl ret 12

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