This shows you the differences between two versions of the page.
cn2:laboratoare:07:exercitii [2022/12/05 20:20] george_mircea.grosu |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | <note tip> | ||
- | **Ce trebuie modificat?**\\ | ||
- | Pentru rezolvarea exercițiilor 1 - 3 trebuie să modificați următoarele fișiere: | ||
- | * ''timer_unit.v'' | ||
- | </note> | ||
- | |||
- | **Task 1 (2p)** Construiți logica de prescaling pentru ceasul timer-ului 0. | ||
- | |||
- | **Task 2 (3p)** Decodificați biții din registrele de control ''TCCR0A'' și ''TCCR0B''. Implementați logica de selecție a modului de operare și a valorii maxime de numărare (TOP). Implementați logica de incrementare a contorului. | ||
- | |||
- | <note> | ||
- | În cadrul acestui laborator vom adresa doar modurile de funcționare corespunzătoare valorilor 0, 2, 3 și 7 din WGM0. | ||
- | </note> | ||
- | |||
- | **Task 3 (3p)** Implementați logica ieșirilor ''OC0A'' și ''OC0B''. | ||
- | |||
- | **Task 4 (2p)** Scrieți și simulați un program în {{:cn2:laboratoare:avrasm.zip|avrasm}} care: | ||
- | * Configurează timer-ul 0 in modul ''fast PWM, TOP == OCR0A'' | ||
- | * HINT: Ce biți controlează modul de operare al timer-ului? Ce valoare trebuie să aibă acei biți? În ce registre se află acei biți? | ||
- | * Setează ceasul timer-ului 0 la ''clkI/O / 8 (From prescaler)'' | ||
- | * HINT: Ce biți controlează sursa de ceas a timer-ului? Ce valoare trebuie să aibă acei biți? În ce registru se află acei biți? | ||
- | * Configurează timer-ul 0 să schimbe starea pinului OC0A astfel: ''Toggle OC0A on Compare Match'' | ||
- | * HINT: Ce biți controlează pinul OC0A? Ce valoare trebuie să aibă acei biți? În ce registru se află acei biți? | ||
- | * Configurează timer-ul 0 să schimbe starea pinului OC0B astfel: ''Clear OC0B on Compare Match, set OC0B at BOTTOM | ||
- | (non-inverting mode)'' | ||
- | * Setează valoarea lui OCR0A și OCR0B la 5 | ||
- | * Simulați pentru a vedea semnalul PWM | ||
- | |||
- | - De ce nu sunt egale cele 2 semnale? | ||
- | - Ce se întâmplă dacă setați valoarea registrului OCR0B la 10? Explicați comportamentul observat. | ||
- | |||
- | <hidden> | ||
- | * Urcați pe plăcuță | ||
- | * HINT: Un LED a fost legat la ieșirea 0C0A, iar celelalte 7 LEDuri au fost legate la 1-logic (Uitați-vă in ''nexys_top.v'' pentru a vedea care este LEDul legat la OC0A) | ||
- | </hidden> | ||
- | |||
- | <note> | ||
- | Puteți consulta din nou sectiunea 3 și datasheet-ul la capitolul 11 pentru mai multe detalii. | ||
- | Adresele registrelor I/O noi (''TCCR0A'', ''TCCR0B'', ''TCNT0'', ''OCR0A'', ''OCR0B'') au fost deja trecute În ''defines.vh'', însa pot fi găsite și în [[http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-8235-8-bit-AVR-Microcontroller-ATtiny20_Datasheet.pdf| datasheet]] la pagina 203 dacă este nevoie de ele. | ||
- | </note> | ||
- | <hidden> | ||
- | |||
- | <note important> | ||
- | Pentru a aplica un prescaler suplimentar (exterior time_unit.v), `SW[4:0]` (switches) au fost configurate pentru a selecta valoarea acestui prescaler. (`CTRL + SHIFT + F` dupa `HOW_TO_USE_PRESCALER` pentru detalii de implementare. Aceasta logica este facuta deja! | ||
- | </note> | ||
- | |||
- | <note> | ||
- | Pentru a usura lucrul cu adresele din IO (pentru a evita repetarea adreselor in cod), avrasm poate lucra cu aliasuri. Putem sa ne definim: | ||
- | |||
- | <code> | ||
- | TCCR0A equ 0x19 | ||
- | TCCR0B equ 0x18 | ||
- | TCNT0 equ 0x17 | ||
- | OCR0A equ 0x16 | ||
- | OCR0B equ 0x15 | ||
- | PORTA equ 0x02 | ||
- | DDRA equ 0x01 | ||
- | </code> | ||
- | |||
- | Apoi in fisierul de input pentru avrasm putem folosi DDRA, inloc de 0x01. | ||
- | |||
- | |||
- | Exemplu de fisier de intrare pentru avrasm: | ||
- | <code> | ||
- | |||
- | TCCR0A equ 0x19 | ||
- | TCCR0B equ 0x18 | ||
- | TCNT0 equ 0x17 | ||
- | OCR0A equ 0x16 | ||
- | OCR0B equ 0x15 | ||
- | PORTA equ 0x02 | ||
- | DDRA equ 0x01 | ||
- | |||
- | |||
- | ldi r16, 0b01111111 | ||
- | out DDRA, r16 ; DDRA = 0b01111111 | ||
- | </code> | ||
- | </note> | ||
- | </hidden> | ||