This is an old revision of the document!
În laboratorul trecut am învățat că dacă un pin are funcția de GPIO, atunci vom putea să îi controlăm direcția și valoarea în mod programatic prin scrieri și citiri în/din anumite registre.
Registrele care controlează comportamentul unui port sunt:
Aceste registre sunt toate pe 8 biți iar fiecare bit controlează comportamentul unui pin al portului respectiv. Ca și în laboratorul trecut, ne vom limita la portul A al microcontroller-ului.
În laboratorul trecut am învățat ce efect avea schimbarea unui bit din registrul PORTA:
Registrul DDRA controleaza direcția pinilor din portul A astfel:
Din registrul PINA putem citi valoarea tensiunii de pe pinii portului A astfel:
Pentru a modifica valoarea unui registru I/O putem sa folosim:
LDI R16, 7 OUT 0x01, R16 ; DDRA = 00001111
LDI R16 0 OUT 0x01, R16 ; DDRA = 00000000 SBI 0x01, 5 ; DDRA = 00100000 SBI 0x01, 4 ; DDRA = 00110000 CBI 0x01, 5 ; DDRA = 00010000
Task 01 (4p) Extindeți modulul gpio astfel încât să suporte și intrări și ieșiri. Urmăriți comentariile marcate cu TODO 1 din gpio.v și cpu.v.
Task 02 (2p) Decodificați instrucțiunile sbi și cbi și completați logica necesară execuției lor. Urmăriți comentariile marcate cu TODO 2 din signal_generation_unit.v, decode_unit.v și control_unit.v.
Task 03 (1p) 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.
Task 04 (1p) Urcați programul de la punctul precedent pe placa de dezvoltare. Portul A va fi mapat pe cele 8 led-uri astfel: PA0 - LED0, …, PA7 - LED7. Portul B va fi mapat pe cele 8 switch-uri astfel: PB0 - SW0, …, PB7 - SW7.
Task 05 (2p) Scrieți un program care să aprindă led-urile în următoarea secvență folosind instructiunle SBI si CBI. Încărcați-l pe placa de dezvoltare:
t0 *------* t1 -*----*- t2 --*--*-- t3 ---**--- t4 ---**--- t5 --*--*-- t6 -*----*- t7 *------*
Task 06 (Bonus 2p) Modificați programul de la punctul 5 astfel încât viteza de derulare a secvenței să fie controlată prin intermediul portului B. Încărcați-l pe placa de dezvoltare.