This shows you the differences between two versions of the page.
|
pm:lab:lab2-2023 [2025/03/16 22:36] andrei.batasev [3. Exerciții] |
pm:lab:lab2-2023 [2026/03/09 10:53] (current) jan.vaduva [2.4. Lucrul cu Timer-ul] |
||
|---|---|---|---|
| Line 371: | Line 371: | ||
| { | { | ||
| TIMSK1 |= (1 << OCIE1A); | TIMSK1 |= (1 << OCIE1A); | ||
| + | // ... | ||
| } | } | ||
| int main() | int main() | ||
| { | { | ||
| - | sei(); // activăm primirea întreruperilor | ||
| init_timer1(); // apelăm funcția de inițializare | init_timer1(); // apelăm funcția de inițializare | ||
| + | sei(); // activăm primirea întreruperilor | ||
| // ... | // ... | ||
| } | } | ||
| Line 420: | Line 421: | ||
| **Task 1. (2p)** | **Task 1. (2p)** | ||
| + | Implementați o funcție ''uptime_ms()'' care returnează numărul de milisecunde scurse de la pornirea microcontrolerului. | ||
| - | * 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. | + | |
| + | * folosiți un timer și întreruperi pentru a genera un tick periodic de aproximativ 1 ms | ||
| + | |||
| + | * la fiecare întrerupere incrementați un contor global | ||
| + | |||
| + | * funcția ''uptime_ms()'' trebuie să returneze valoarea acestui contor | ||
| <note tip> | <note tip> | ||
| Line 428: | Line 435: | ||
| </note> | </note> | ||
| + | Configurați ''USART0'' cu aceiași parametri ca în laboratorul anterior și transmiteți către PC mesajul: | ||
| + | <code> | ||
| + | Uptime: <valoare> ms | ||
| + | </code> | ||
| - | **Task 2. (2p)** | + | Mesajul trebuie trimis la fiecare **1 secundă**. |
| + | |||
| + | |||
| + | |||
| + | <note> Funcția ''USART0_transmit(char data)'' este blocantă (blochează executia restul instrucțiunilor din main). Determinați limita minimă a intervalului de timp dintre mesaje pentru care acestea pot fi transmise corect, în funcție de BAUD rate și de numărul de caractere din mesaj. </note> | ||
| + | |||
| + | |||
| + | **Task 2.1 BTN Interrupt (2p)** | ||
| + | |||
| + | Configurați **pin change interrupt** pentru butonul BTN1 (PB2). | ||
| + | |||
| + | Implementați rutina de tratare a întreruperii ''ISR(PCINT<n>_vect)''. In ISR setați un flag atunci când butonul este apăsat. In ''main()'' detectați flag-ul și transmiteți pe USART mesajul: "**PRESS**". | ||
| + | |||
| + | **Task 2.2 Debouncing (1p)** | ||
| + | |||
| + | Când se apasă un buton, generați un eveniment "**PRESS**" o singură dată, chiar dacă contactul bounce-uiește. | ||
| + | Implementați debouncing cu o fereastră de 30–50 ms bazată pe ''uptime_ms()'' (din Task 1), dar fără să blocați execuția în main. | ||
| - | * Citiți ''PD6'' folosind întreruperi și trimiteți un mesaj prin ''USART0'' (configurată ca la laboratorul anterior). | ||
| **Task 3. (3p)** | **Task 3. (3p)** | ||
| - | * Folosind buzzer-ul, transmiteți un cuvânt cu literele codificate in alfabetul Morse astfel: | + | |
| - | * 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). | + | Folosiți buzzer-ul și butoanele: |
| - | * La fiecare apăsare a butonului ''PB2'' transmiteți următoarea literă. | + | |
| + | * BTN1 (''PB2'') schimbă frecvența sunetului generat de buzzer. Frecvența poate avea 3 valori diferite (200 Hz, 400 Hz, 800 Hz). | ||
| + | * BTN2 (''PD6'') este „gate”: buzzerul sună doar cât timp BTN2 este ținut apăsat. | ||
| + | |||
| + | (generați semnalul pentru buzzer folosind un timer și întreruperi) | ||
| - | **Task 4. (3p)** | + | **Task 4. Mini scheduler (2p)** |
| - | * Implementați pentru exercițiile anterioare debouncing la buton folosind întreruperi. | + | Folosiți funcția ''uptime_ms()'' pentru a implementa un mini-scheduler cooperativ care execută mai multe taskuri periodice. Implementați în bucla principală un mecanism care verifică periodic momentul curent (''now = uptime_ms()'') și execută următoarele taskuri: |
| + | * T1 – Heartbeat (periodă 1000 ms) - Comută starea LED-ului albastru. | ||
| + | * T2 – Logger (periodă 500 ms) - Transmite pe USART mesajul: **t=<uptime_ms> ms** | ||
| + | * T3 – Status (periodă 3000 ms) - Comută starea LED-ului roșu. | ||