This shows you the differences between two versions of the page.
pm:lab:lab2-2023 [2024/03/17 13:08] aungureanu1002 |
pm:lab:lab2-2023 [2025/03/16 22:36] (current) andrei.batasev [3. Exerciții] |
||
---|---|---|---|
Line 362: | Line 362: | ||
<file c > | <file c > | ||
+ | #include <avr/interrupt.h> | ||
ISR(TIMER1_COMPA_vect) | ISR(TIMER1_COMPA_vect) | ||
Line 418: | Line 419: | ||
===== 3. Exerciții ===== | ===== 3. Exerciții ===== | ||
- | **Task 1.1** | + | **Task 1. (2p)** |
- | * Implementați o funcție asemănătoare cu ''millis()'' din biblioteca Arduino. Aceasta ar trebui să returneze intervalul de timp trecut de la pornirea (sau ultimul reset) al uC-ului. Configurați interfața USART0 cu aceeași parametri folosiți în laboratorul trecut și transmiteți către PC un mesaj ales de voi la intervale de 1 secundă. | + | * Implementați o funcție asemănătoare cu ''delay(int ms)'' din biblioteca Arduino. Aceasta ar trebui să oprească execuția programului pentru numărul de milisecunde dat. Implementarea se va face folosind întreruperi. |
- | HINTS: | + | <note tip> |
* Frecvența de ceas a uC-ului este de 12MHz. Folosiți formulele prezentate anterior pentru a obține valorile potrivite pentru prescaler și registrul de comparație ale timer-ului ales astfel încât întreruperile generate de acesta să se declanșeze la intervalul de timp dorit. | * Frecvența de ceas a uC-ului este de 12MHz. Folosiți formulele prezentate anterior pentru a obține valorile potrivite pentru prescaler și registrul de comparație ale timer-ului ales astfel încât întreruperile generate de acesta să se declanșeze la intervalul de timp dorit. | ||
* Timer2 poate fi utilizat cu un număr mai mare de valori ale prescaler-ului. | * Timer2 poate fi utilizat cu un număr mai mare de valori ale prescaler-ului. | ||
+ | </note> | ||
- | **Task 1.2** | ||
- | * Pentru a putea citi în mod corect apăsări scurte ale butoanelor este necesară o metodă de debouncing. Cum ar putea fi rezolvată problema citirilor eronate cu ajutorul funcției ''millis()''? Concepeți o funcție (în pseudocod) care să ilustreze soluția găsită. | ||
- | |||
- | **Task 2.** | ||
- | |||
- | * Reluați exercițiul 3 din primul laborator și implementați-l folosind timer-e și întreruperi pentru citirea butoanelor și efectul de clipire al LED-urilor. | ||
- | |||
- | <spoiler **Reminder Ex. 3, lab 0**> | ||
- | * La apăsarea succesivă a BTN1, LED-ul RGB trebuie să își schimbe culoarea (Red -> Green -> Blue -> Red) | ||
- | * BTN2 trebuie să controleze efectul de clipire al LED-ului aprins | ||
- | </spoiler> | ||
- | **Task 3.** | + | **Task 2. (2p)** |
- | * Folosiți butoanele ''PD6'' și ''PB2'' pentru a controla buzzer-ul: | + | |
- | * Unul dintre butoane selectează frecvența sunetului generat de buzzer (dintre 3 valori, de ex. 100Hz, 200Hz, 300Hz) | + | |
- | * Buzzer-ul funcționează doar când mențineți al doilea buton apăsat | + | |
- | * Puteți folosi LED-ul RGB pentru a indica frecvența aleasă | + | |
- | **Task 4. (BONUS)** | + | * Citiți ''PD6'' folosind întreruperi și trimiteți un mesaj prin ''USART0'' (configurată ca la laboratorul anterior). |
- | * Funcția implementată la primul exercițiu va acumula o anumită eroare din cauza faptului că frecvența de ceas nu poate fi divizată perfect. | + | **Task 3. (3p)** |
- | * Încercați să calculați după câte cicluri de funcționare a timer-ului eroarea devine semnificativă (peste 1 ms). | + | * Folosind buzzer-ul, transmiteți un cuvânt cu literele codificate in alfabetul Morse astfel: |
- | * Propuneți o metodă prin care se poate reduce această eroare | + | * Un simbol (''.'' sau ''-'') va dura 500 ms, iar durata dintre simboluri va fi tot 500 ms. Pentru a diferenția între ''.'' și ''-'', alterați frecvența buzzer-ului (de exemplu, 500 Hz versus 1500 Hz). |
- | * Încercați implementarea metodei propuse | + | * La fiecare apăsare a butonului ''PB2'' transmiteți următoarea literă. |
+ | **Task 4. (3p)** | ||
+ | * Implementați pentru exercițiile anterioare debouncing la buton folosind întreruperi. | ||