Differences

This shows you the differences between two versions of the page.

Link to this comparison view

cn2:laboratoare:07 [2019/11/18 07:06]
tudor.visan [2. Instrucțiunile SBI și CBI]
— (current)
Line 1: Line 1:
-===== Laboratorul 07 - GPIO 2: Intrări ===== 
  
-{{page>​cn2:​laboratoare:​07:​obiective&​nofooter}} 
- 
-==== 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 
- 
-{{page>​cn2:​laboratoare:​07:​continut&​nofooter}} 
- 
-==== 3. TL;DR ==== 
-Pentru a modifica valoarea unui registru I/O putem sa folosim: 
-  * instructiunea OUT cu masca de biti:  
-<code asm> 
- LDI R16, 7  
- OUT 0x01, R16 ; DDRA = 00001111 
-</​code>​ 
-  * instructiunile SBI si CBI pentru a modifica un singur bit 
-<code asm> 
- LDI R16 0  
- OUT 0x01, R16 ; DDRA = 00000000 
- SBI 0x01, 5   ; DDRA = 00100000 
- SBI 0x01, 4   ; DDRA = 00110000 
- CBI 0x01, 5   ; DDRA = 00010000 
-</​code>​ 
- 
-{{page>​cn2:​laboratoare:​07:​tldr&​nofooter}} 
- 
-==== 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. 
- 
- 
-{{page>​cn2:​laboratoare:​07:​exercitii&​nofooter}} 
- 
-==== 5. Resurse ==== 
-  * {{ :​cn2:​laboratoare:​07:​skel:​lab07_skel_v5.zip | Scheletul laboratorului}} 
-<​hidden>​ 
-  * {{ :​cn2:​laboratoare:​07:​sol_mcss:​lab07_sol_v5.zip | Soluția laboratorului}} 
-</​hidden>​ 
-  * [[http://​www.atmel.com/​Images/​Atmel-8235-8-bit-AVR-Microcontroller-ATtiny20_Datasheet.pdf | Datasheet ATTiny20]] 
-  * [[http://​ww1.microchip.com/​downloads/​en/​devicedoc/​atmel-0856-avr-instruction-set-manual.pdf| Setul de Instrucțiuni AVR]] 
-  * [[https://​www.xilinx.com/​support/​documentation/​university/​XUP%20Boards/​XUPNexys3/​documentation/​Nexys3_rm.pdf| Datasheet Digilent Nexys]] 
-  * {{:​cn2:​laboratoare:​avrasm.zip | avrasm}} - tool java pentru a genera cod mașină AVR. 
- 
-{{page>​cn2:​laboratoare:​07:​resurse&​nofooter}} 
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