Folosind GPIO (General-Purpose Input/Output) putem controla un pin al unui circuit integrat. De exemplu, putem aprinde un led folosind instrucțiuni AVR sau putem citi starea unui pin - LOW sau HIGH. Pinii ce suportă GPIO sunt grupați în porturi (grupuri de 8 pini logici numite A
sau B
) controlate de registre speciale (pe câte 8 biți):
În memoria microcontrollerului de la 0x00 la 0x3F gasim I/O Space. Aici se află toate registrele de lucru cu periferice și, desigur, DDRx, PORTx și PINx. De exemplu registrul PORTA are adresa 0x02.
Pentru a scrie citi date din I/O Space putem folosi instrucțiunile LDS/STS, însă recomandat este să folosim instrucțiunile speciale pentru lucru de memoria I/O Space ce se execută mai rapid:
OUT A, Rr
: Scrie (Store) în I/O Space la adresa A valoarea din registrul Rr IN Rd, A
: Citește (Load) din I/O Space de la adresa A și pune în registrul Rd
Pentru a modifica un singur bit dintr-un registru de configurare putem folosi instrucțiunile SBI
/CBI
.
I
din SREG
este 1)
Task 01 (2p) Scrieți un program care setează portul A ca ieșire, portul B ca intrare, apoi, într-o buclă, citește valoarea de pe portul B și o scrie pe portul A. Folosiți tool-ul avrasm pentru a-l scrie în fișierul rom.v
.
Task 02 (3p) Extindeți programul de la punctul 1 astfel încât să configurați Timer0 folosind valoare introdusă folosind portul B pentru ajustarea factorului de umplere al modulării. Verificați comportamentul celor două ieșiri folosind LED-urile 8 și 9.
fast PWM, TOP == OCR0A
clkI/O (No prescaling)
Clear OC0A on Compare Match, Set OC0A at BOTTOM (non-inverting mode)
Set OC0B on Compare Match, Clear OC0B at BOTTOM (inverting mode)
OCR0A
la valoarea citită de pe portul B
.
Task 03 (2p) Folosind semnalele de ieșire OC0A
și OC0B
ale Timer-ului configurat anterior controlați unul din LED-urile RGB pentru a obține culoarea verde
. Atenție, nu priviți direct spre LED-urile RGB deoarece intensitatea acestora este ridicată.
Task 04 (3p) Modificați programul existent astfel încât să pe LED-urile legate la port A să afișați o bară de încărcare, adică să aprindeți pe rând de la dreapta la stânga (sau invers) fiecare LED.