Table of Contents

Laboratorul 2: Digital Debugging, USART

Ca în toate lucrările de inginerie, bug-uri pot și vor apărea si în sisteme încorporate.

1. Ce este diferit fata de depanarea uzuala?

Motivul pentru care depanarea embedded este mai dificilă decât depanarea obișnuită a software-ului provine din mai multe probleme:

Cu toate acestea, principiile de debugging sunt aceleasi ca si în cazul software-ul de nivel înalt: Trebuie sa comparați ce se dorește de la sistem (cod / circuit) cu ceea ce, de fapt, face si, pentru asta, ai nevoie de vizibilitate.

2. Instrumente necesare

Vizibilitatea la nivel hardware se realizează printr-o formă de InputOutput (dacă este disponibilă):

Instrumente de măsurare:

Exemplu de flux de depanare

Un exemplu de flux de depanare ar putea fi următorul:

3. Interfața serială USART

Interfața serială este cel mai facil mod de a comunica cu microcontroller-ul vostru pentru citirea de date sau trimiterea de comenzi. Din perspectiva microcontroller-ului, comunicația serială se bazează pe doar două linii de date:

Comunicația este full-duplex, se poate transmite concomitent cu recepția.

Transmisia asincronă de date se face la nivel de cadre (frames), fiecare cadru fiind format din mai mulți biți, având formatul descris în figură.

 Transmisia serială

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:

Ambele părți implicate în comunicație trebuie să aibă aceeași configurație! De exemplu, în terminalul serial folosit pe calculator, trebuie configurat același baud rate și același format al cadrului ca cel din codul de pe microcontroller.

Baud rate este numărul de simboluri/pulsuri pe secundă al semnalului. În esență, reprezintă viteza de transmisie și este foarte important ca și transmițătorul și receptorul să folosească același baud rate pentru transmisia corectă a datelor. Una dintre cele mai comune probleme cu USART este setarea diferită a baud rate-ului pe transmițător și pe receptor. Această neconcordanță se manifestă prin recepția unor date greșite (transmițătorul trimite caracterul 'a', receptorul primește caracterul '&')

Descrierea completă pentru:

  • cele trei registre de control
  • registrul pentru baud rate
  • registrele pentru buffer-ele de transmisie/recepție

Se gaseste în datasheet la capitolul 19. Deoarece biblioteca Arduino vine cu suport foarte bun pentru comunicație serială, nu vom insista asupra lucrului direct cu registre.

Utilizarea interfetei seriale de pe Arduino UNO

Arduino UNO se conecteaza la PC prin intermediul interfetei seriale, dar utilizeaza un convertor serial-to-USB integrat pe placa. Prin intermediul acestei interfete si utilizand IDE-ul dedicat Arduino se poate programa microprocesorul, dar se poate asigura si un canal de debug. Astfel, prin mesaje simple, se poate afla starea sistemului, se pot afisa valorile variabilelor, sau chiar se pot trimite comenzi, interfata functionand bidirectional. Mai multe detalii se pot gasi aici

Configurația implicită pentru interfața serială USART folosește 8 biți de date, un bit de stop, fără paritate (8N1).

Următorul program poate trimite mesaje de la Arduino către PC, prin USB (sau folosind emulatorul din Tinkercad)

void setup()
{
  Serial.begin(9600);
  Serial.println("in function setup");
}
 
void loop()
{
  Serial.println("in function loop");
  delay(1000);
}

Următorul program poate primi mesaje trimise de PC, prin USB (sau folosind emulatorul din Tinkercad)

void setup()
{
  Serial.begin(9600);
  Serial.println("astept comenzi");
}
 
void loop()
{
  if (Serial.available()){
    char a = Serial.read();
    char buf[20];
    sprintf(buf, "%s: %c", "primit caracter", a);
    Serial.println(buf);
  }
}

4. Exerciții

Task 0 Incercati voltmetrul

Task 1 Faceti un Arduino Uno sa seteze 1 si 0 pe un pin (echivalent cu blink la un led) si conectati voltmetrul.

Task 2 Studiati functia analogWrite. Determinati de ce nu functioneaza schema de mai sus cu codul urmator:

void setup() {
  pinMode(12, OUTPUT);
}

void loop() {
  analogWrite(12, 200);
}

Modificați codul astfel încât să obtineti o valoare de 2V la bornele voltmetrului.

Task 3 Folosind interfața serială, trimiteti următoarele comenzi catre placuta

5. Resurse

6. Linkuri utile