Differences

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

Link to this comparison view

pm:lab:lab1-2022 [2022/03/13 13:42]
alexandru.predescu [2. Instrumente necesare]
pm:lab:lab1-2022 [2023/03/16 15:37] (current)
alexandru.predescu [4. Exerciții]
Line 1: Line 1:
-====== Laboratorul 2USART. Digital Debugging ======+/** 
 + * uncomment this to publish the solution: 
 + * ~~SHOWSOLUTION~~ 
 + */ 
 +~~SHOWSOLUTION~~
  
 +====== Laboratorul 1: USART. Digital Debugging ======
  
 Ca în toate lucrările de inginerie, bug-uri pot și vor apărea si în sisteme incorporate. În condiții de funcționare,​ este important să avem o modalitate de comunicare cu dispozitivul integrat. Pentru o imagine de ansamblu asupra metodelor de depanare posibile, vom face o scurtă introducere,​ apoi vom studia în detaliu interfața serială USART, folosită în mod uzual pentru comunicația serială dintre două dispozitive. Ca în toate lucrările de inginerie, bug-uri pot și vor apărea si în sisteme incorporate. În condiții de funcționare,​ este important să avem o modalitate de comunicare cu dispozitivul integrat. Pentru o imagine de ansamblu asupra metodelor de depanare posibile, vom face o scurtă introducere,​ apoi vom studia în detaliu interfața serială USART, folosită în mod uzual pentru comunicația serială dintre două dispozitive.
Line 72: Line 77:
 Se transmite un **bit de start**, apoi un cuvânt de date. Urmează un **bit de partitate**,​ opțional, cu rolul de a face o verificare simplă a corectitudinii datelor, și **unul sau doi biți de stop**. ​ Se transmite un **bit de start**, apoi un cuvânt de date. Urmează un **bit de partitate**,​ opțional, cu rolul de a face o verificare simplă a corectitudinii datelor, și **unul sau doi biți de stop**. ​
  
-Microcontroller-ul ​Atmega328p ​include un periferic **USART** (Universal Synchronous-Asynchronous Receiver/​Transmitter) pentru interfața serială. În partea de inițializare a acestui periferic trebuie efectuați următorii pași:+Microcontroller-ul ​ATmega328p ​include un periferic **USART** (Universal Synchronous-Asynchronous Receiver/​Transmitter) pentru interfața serială. În partea de inițializare a acestui periferic trebuie efectuați următorii pași:
   * alegerea vitezei pentru transmisia de date - baud rate-ul (valori uzuale: 9600, 19200, 38400, 57600, 115200)   * alegerea vitezei pentru transmisia de date - baud rate-ul (valori uzuale: 9600, 19200, 38400, 57600, 115200)
   * alegerea formatului cadrului (câți biți de date, de stop, dacă va conține sau nu bit de partitate)   * alegerea formatului cadrului (câți biți de date, de stop, dacă va conține sau nu bit de partitate)
Line 169: Line 174:
     /* pune datele în buffer; transmisia va porni automat în urma scrierii */     /* pune datele în buffer; transmisia va porni automat în urma scrierii */
     UDR0 = data;     UDR0 = data;
 +}
 +
 +char USART0_receive()
 +{
 +  /* asteapta cat timp bufferul e gol */
 +  while (!(UCSR0A & (1 << RXC0)));
 +
 +  /* returneaza datele din buffer */
 +  return UDR0;
 } }
 </​file>​ </​file>​
Line 220: Line 234:
 void loop() void loop()
 { {
-  if (Serial.available()){+  if (Serial.available()) {
     char a = Serial.read();​     char a = Serial.read();​
     char buf[20];     char buf[20];
Line 239: Line 253:
   * "​off"​ - stinge un led   * "​off"​ - stinge un led
   * "​blink"​ – blink un led la interval de 200 ms   * "​blink"​ – blink un led la interval de 200 ms
-  * "​get"​ - afișează prin interfața serială starea unui buton apăsat+  * "​get"​ - afișează prin interfața serială starea unui buton
  
 Fiecare comandă va fi urmată de caracterul de control: "​\n"​ (newline). Configurați terminalul serial să trimită (doar) acest caracter după fiecare mesaj. Implementați un program în Arduino care să recunoască aceste comenzi și să realizeze acțiunile corespunzătoare pentru fiecare dintre ele. Folosiți pin-ul 13 (PB5) pentru LED și pin-ul 2 (PD2) pentru buton. Fiecare comandă va fi urmată de caracterul de control: "​\n"​ (newline). Configurați terminalul serial să trimită (doar) acest caracter după fiecare mesaj. Implementați un program în Arduino care să recunoască aceste comenzi și să realizeze acțiunile corespunzătoare pentru fiecare dintre ele. Folosiți pin-ul 13 (PB5) pentru LED și pin-ul 2 (PD2) pentru buton.
Line 246: Line 260:
   * Comenzile on/off vor opri funcția blink.   * Comenzile on/off vor opri funcția blink.
  
-<note important>​Pentru a putea primi comenzi pe serială, este de dorit să nu existe delay-uri sau funcții blocante în programul principal (în loop). Funcția blink ar trebui să fie non-blocantă. Vom folosi funcția millis() pentru a măsura durata de timp (în loc să ținem programul blocat până expiră delay-ul) astfel:+<note tip> 
 +  * pentru a primi un șir de caractere de la interfața serială, puteți folosi un vector de caractere pe post de buffer 
 +  * pentru a verifica dacă șirul de caractere primit corespunde cu comanda, puteți folosi funcția //​strcmp()//,​ ex. //strcmp(a, b) == 0//      
 +</​note>​ 
 + 
 + 
 +<note important>​Pentru a putea primi comenzi pe serială, este de dorit să nu existe delay-uri sau funcții blocante în programul principal (în loop). Funcția blink ar trebui să fie non-blocantă. Vom folosi funcția ​//millis()// pentru a măsura durata de timp (în loc să ținem programul blocat până expiră delay-ul) astfel:
  
 <​code>​ <​code>​
Line 262: Line 282:
  
 {{:​pm:​lab:​lab1_2022:​task1.png?​600|Schema Task 1}} {{:​pm:​lab:​lab1_2022:​task1.png?​600|Schema Task 1}}
 +<​hidden>​
 +<​solution>​
  
-<​hidden>​  +Arhiva cu soluțiile o puteți descărca aici: {{:pm:​lab:​lab1_2022:​lab1-solved.zip}}
- +
-[[https://​github.com/​cs-pub-ro/​laborator-pm/​tree/​master/​laborator/​lab2/​task1 | Solutie task1]]+
  
 +</​solution>​
 </​hidden>​ </​hidden>​
- 
 **Task 2** (3p) **Task 2** (3p)
  
Line 292: Line 312:
  
 <note important>​Terminalul serial din Arduino este configurat implicit în mod 8N1, doar baud rate-ul fiind configurabil. Pentru a avea control mai precis asupra formatului se poate folosi un terminal serial dedicat, precum [[https://​www.putty.org/​|Putty]].</​note>​ <note important>​Terminalul serial din Arduino este configurat implicit în mod 8N1, doar baud rate-ul fiind configurabil. Pentru a avea control mai precis asupra formatului se poate folosi un terminal serial dedicat, precum [[https://​www.putty.org/​|Putty]].</​note>​
- +<​hidden>​ 
-<​hidden>​  +<​solution> ​ 
- +[[https://​github.com/​cs-pub-ro/​laborator-pm/​tree/​master/​laborator/​lab1/task2 | Solutie task2]] 
-[[https://​github.com/​cs-pub-ro/​laborator-pm/​tree/​master/​laborator/​lab2/task2 | Solutie task2]] +</​solution>​
 </​hidden>​ </​hidden>​
  
Line 305: Line 324:
   * Aprindeți led-ul (PB5) pentru 500 ms atunci când este recepționat un mesaj. Pentru a nu bloca programul (și implicit recepționarea mesajelor), nu folosiți funcția delay.   * Aprindeți led-ul (PB5) pentru 500 ms atunci când este recepționat un mesaj. Pentru a nu bloca programul (și implicit recepționarea mesajelor), nu folosiți funcția delay.
   * Atenție la realizarea conexiunilor RX/TX (RX1 la TX2, TX1 la RX2) și GND (GND1 la GND2, dacă plăcile Arduino sunt conectate la PC-uri diferite)   * Atenție la realizarea conexiunilor RX/TX (RX1 la TX2, TX1 la RX2) și GND (GND1 la GND2, dacă plăcile Arduino sunt conectate la PC-uri diferite)
 +  * În caz că firele nu sunt suficient de lungi pentru a conecta direct cele două Arduino (legate în același timp la 2 PC-uri prin cabluri USB), folosiți breadboard-urile și realizați conexiunile prin mai multe fire.
  
 {{:​pm:​lab:​lab1_2022:​task3.png?​800|Schema Task 3}} {{:​pm:​lab:​lab1_2022:​task3.png?​800|Schema Task 3}}
Line 312: Line 332:
 În cazul în care nu avem nevoie de conexiunea la PC, putem conecta un al doilea dispozitiv pe liniile RX și TX. Dacă însă am vrea să facem debug sau să trimitem mesaje de la PC, conexiunea nu mai funcționează corect, deoarece interfața serială nu permite conectarea a mai mult de 2 dispozitive (cel puțin pe linia TX). În cazul în care nu avem nevoie de conexiunea la PC, putem conecta un al doilea dispozitiv pe liniile RX și TX. Dacă însă am vrea să facem debug sau să trimitem mesaje de la PC, conexiunea nu mai funcționează corect, deoarece interfața serială nu permite conectarea a mai mult de 2 dispozitive (cel puțin pe linia TX).
  
-O altă constrângere este că avem o singură interfață USART pe ATmega328P, fapt pentru care vom avea nevoie de simularea unei a doua interfețe seriale în software.+O altă constrângere este că avem o singură interfață USART pe ATmega328p, fapt pentru care vom avea nevoie de simularea unei a doua interfețe seriale în software.
  
 **Găsiți un exemplu în Arduino IDE: Files > Examples > SoftwareSerial > SoftwareSerialExample** **Găsiți un exemplu în Arduino IDE: Files > Examples > SoftwareSerial > SoftwareSerialExample**
Line 318: Line 338:
 </​note>​ </​note>​
  
-<​hidden> ​ 
- 
-[[https://​github.com/​cs-pub-ro/​laborator-pm/​tree/​master/​laborator/​lab2/​task3 | Solutie task3]] 
- 
-</​hidden>​ 
  
 **Bonus** (2p) **Bonus** (2p)
Line 330: Line 345:
  
   * {{:​pm:​atmel-7810-automotive-microcontrollers-atmega328p_datasheet.pdf|Datasheet Atmega 328p}}   * {{:​pm:​atmel-7810-automotive-microcontrollers-atmega328p_datasheet.pdf|Datasheet Atmega 328p}}
-  * Arduino UNO pinout +  * Arduino UNO pinout  
-  ​* ​{{:​pm:​lab:​uno.jpg?​800|pinout Arduino UNO}}+{{:​pm:​lab:​uno.jpg?​600|pinout Arduino UNO}}
   * Responsabil:​ [[alexandru.predescu@upb.ro | Alexandru Predescu]]   * Responsabil:​ [[alexandru.predescu@upb.ro | Alexandru Predescu]]
 +
 +<​solution>​
 +<​hidden>​[[https://​github.com/​cs-pub-ro/​laborator-pm/​tree/​master/​laborator/​lab1/​task3 | Solutie task3]]</​hidden>​
 +</​solution>​
  
pm/lab/lab1-2022.1647171764.txt.gz · Last modified: 2022/03/13 13:42 by alexandru.predescu
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