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 găsim 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 lucrul cu 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 valoarea introdusă pe 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 == OCR0AclkI/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 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.