This is an old revision of the document!


Laboratorul 07 - GPIO 2: Intrări

1. Registrele de control al perifericelor și al porturilor I/O

Î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:

  • DDRx: Port x Data Direction Register (ie: DDRA și DDRB)
  • PORTx: Port x Data Register (ie: PORTA si PORTB)
  • PINx: Port x Data Input Register (ie: PINA și PINB)

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.

PORTA (recapitulare)

În laboratorul trecut am învățat ce efect avea schimbarea unui bit din registrul PORTA:

  • PORTAn: dacă bitul n este 0 atunci pinul respectiv va lua valoarea LOW, iar dacă bitul este 1 atunci pinul va lua valoarea HIGH.
DDRA

Registrul DDRA controleaza direcția pinilor din portul A astfel:

  • DDRAn: dacă bitul n este 1 atunci pinul va funcționa ca și ieșire (microcontroller-ul va putea impune o tensiune electrică pe acel pin), iar dacă bitul este 0 atunci pinul respectiv va funcționa ca și intrare (microcontroller-ul nu va impune nicio tensiune pe linie)
PINA

Din registrul PINA putem citi valoarea tensiunii de pe pinii portului A astfel:

  • PINAn: dacă bitul n este 0 atunci pinul respectiv are valoarea LOW, iar dacă bitul este 1 atunci pinul are valoare HIGH

3. TL;DR

Pentru a modifica valoarea unui registru I/O putem sa folosim:

  • instructiunea OUT cu masca de biti:
 LDI R16, 7 
 OUT 0x01, R16 ; DDRA = 00001111
  • instructiunile SBI si CBI pentru a modifica un singur bit
 LDI R16 0 
 OUT 0x01, R16 ; DDRA = 00000000
 SBI 0x01, 5   ; DDRA = 00100000
 SBI 0x01, 4   ; DDRA = 00110000
 CBI 0x01, 5   ; DDRA = 00010000

4. Exerciții

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.

5. Resurse

cn2/laboratoare/07.1574053601.txt.gz · Last modified: 2019/11/18 07:06 by tudor.visan
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0