Differences

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

Link to this comparison view

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 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ț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 ​diferenția între ''​.''​ și ''​-'',​ alterați frecvența buzzer-ului ​(de exemplu500 Hz versus 1500 Hz). +Folosiți ​buzzer-ul ​șbutoanele
-    La fiecare apăsare a butonului ​''​PB2'' ​transmiteți următoarea literă.+ 
 +  ​BTN1 (''​PB2''​) ​schimbă frecvențsunetului generat de buzzerFrecvența poate avea 3 valori diferite ​(200 Hz400 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 periodiceImplementaț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.
pm/lab/lab2-2023.1742157415.txt.gz · Last modified: 2025/03/16 22:36 by andrei.batasev
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