Table of Contents

Analizor logic

Introducere

Proiectul implementează un analizor logic, capabil să citească mai mulți pini de intrare și să transmită informații despre pulsurile înregistrate către un PC. Pe PC va rula un script care va afișa valorile măsurate de aparat. Pentru a testa funcționalitatea dispozitivului, se va simula o comunicație UART normală între microcontroller și PC, iar 2 pini de intrare vor măsura semnalul de pe pinii RX și TX ai microcontroler-ului.

Scopul acestui sistem este de a oferi sprijin pentru depanarea sistemelor embedded la un preț redus. Astfel, el se preteaza foarte bine pentru observarea semnalelor de frecvență redusă.

Descriere generala

Schema bloc

Sistemul va fi alcatuit din microcontroler-ul Arduino UNO R4 Wifi, care va comunica folosind UART cu laptop-ul / PC-ul. 4 pini ai acestui controler vor fi folositi pentru a detecta semnalul digital, iar rezultatele vor fi trimise pe laptop, unde vor fi afisate intr-un format grafic. Pentru testarea functionalitatii, alti 2 pini de intrare sunt folositi pentru a monitoriza un al doilea canal UART intre Arduino si Laptop, folosind un cablu USB to TTL.

Diagrama de control

Microcontroler-ul așteaptă 3 evenimente: 1. Timer-ul ce indică momentul transmisiei către PC termină de numărat - atunci se va realiza transmiterea informațiilor către PC 2. Un pin GPIO de input își schimbă starea - se va stoca această informație pe microcontroler (până la urmatoarea transmisie) 3. Microcontroler-ul primește un mesaj de pe canalul UART - va transmite un byte aleator (comunicația are unic rol de testare a analizorului)

Schema electrică

Această schemă minimală indică modul în care se realizează măsurarea pinilor responsabili de comunicația UART. Cei 4 pini de intrare care nu sunt folosiți în măsurarea semnalului apar ca nefolosiți, în realitate ei având legate cabluri cu clești. Atât placa Arduino, cât și conectorul TTL-USB se conectează la laptop / PC (acesta având și rolul de sursă de energie).

Descriere hardware

Componente folosite

  1. Arduino UNO R4 Wifi - am ales să folosesc varianta R4, deoarece aceasta are mult mai multă memorie RAM (32KB RAM vs 2KB RAM la Arduino UNO R3), ceea ce este important pentru stocarea datelor între transmisiile către PC
  2. Cabluri de lăgatură și cleme de contact
  3. Cablu USB-C - USB-C
  4. Cablu USB to TTL
  5. Laptop / PC
  6. Breadboard (conectare pini de testare)

Poze

Descriere software

Mediu de dezvoltare

  1. Visual Studio Code, cu extensia PlatformIO
  2. Proiectul propune 2 aplicații:
    1. O aplicație C++ încărcată pe microcontroller
    2. Un script Python ce rulează pe calculator și are rolul de a gestiona comunicația pe serială și de a afișa datele primite în format grafic.
  3. Biblioteci folosite (Arduino): nu am folosit nicio librărie externă. În schimb, folosesc locațiile regiștrilor microporcesorului RA4M1 definite în Arduino.h.
  4. Biblioteci folosite (Python): am folosit biblioteca matplotlib pentru afișarea graficelor dependenței nivelelor logice de timp.

Arhitectura programelor

Aplicație Arduino

Programul pentru sistemul încorporat este spart în următoarele fișiere:

- gpio.h - oferă declarația funcției void init_gpio(), responsabilă de setarea pinilor GPIO

- interrupts.h - oferă un mecanism facil de adăugare a unor rutine de tratare a întreruperii în vectorul de întreruperi. Astfel, sunt declarate:

- timer.h - oferă declarația funcției void init_timer()

- uart.h - oferă suport pentru lucrul cu seriala. Astfel, sunt declarate:

- main.cpp - conține logica principală a aplicației

- timer.cpp - conține implementarea inițializării timer-ului, pentru care se folosește doar canalul 0, în mod saw-wave PWM, up-counting.

- interrupts.cpp - conține implementarea adăugării unei rutine în vectorul de întrerupere. Practic, funcția realizează legătura către tipul întreruperii prin setarea unui registru IELSRn și adaugă pointer-ul la funcție în vectorul de întrerupere manual.

- uart.cpp - acest fișier conține implementarea mai multor funcționalități

- gpio.cpp - acest fișier conține definirea funcției de inițializare a pinilor de input, în care acești pini sunt trecuți pe modul de input cu rezistență de pull-up și generarează întrerupere pe ambele fronturi. Totodată, se introduce rutina de tratere a întreruperii pe porturile 1, 3 și 4. Această rutină preia starea curentă a pinilor și timpul curent (counter-ul numărătorului) și le introduce în coada (circulară) de stări ce este transmisă în uart.cpp.

Script rulat pe calculator

Programul executat pe laptop/PC se bazează pe un singur fișier Python. Aplicația este multithreaded, folosindu-se de 2 thread-uri pentru comunicația pe cele 2 canale seriale către Arduino (COM5 și COM6). Pe thread-ul răspunzător de COM6 (portul corespunzător SPI2 a Arduino), se așteaptă mesaj de la tastatură și se trimite șirul de caractere către microcontroller. Pe thread-ul ce gestionează COM5 (portul legat la SPI9 a Arduino) se așteaptă mesaj cu starea și, când acesta sosește, se adaugă într-o coadă. Pe thread-ul principal se afișează dinamic evoluția nivelului logic pe RX și TX folosind animații (odată la un interval de timp, dacă s-a detectat o stare nouă, se glisează tot conținutul original în stânga și se adaugă noua valoare în buffer-ele celor 2 legături). Graficele afișate au pe axa orizontală timpul exprimat în us.

Surse cod

- Link github: https://github.com/raresh001/Logical-Analyzer/tree/master

- Arhivă cod: ticusrares_logicalanalyzer.7z

Rezultate obținute

Link videoclip demonstrație: https://youtu.be/VTMEd0hsHNk

Concluzii

Sistemul a reușit cu succes să detecteze comunicația pe serială (atât bitul de start, cât și codificarea caracterelor). În urma unor rulări succesive cu litera A (în care 5 biți de 0 consecutivi), am observat că diferența maximă de timp pentru transmisie între 2 rezultate a fost de aproximativ 7 ciclii ai ceasului folosit de GPIO (iar transmsia celor 5 biți dura aproximativ 700 de ciclii de ceas).

În ceea ce privește beneficiile acestui proiect, consider că analizorul logic m-a ajutat să învăț să gestionez microprocesoare cu o documentație mai puțin clară (nu există exemple de cod în datasheet, iar în general utilizatorii acestui procesor folosesc librăriile oferite de firma Renesas pentru a abstractiza lucrul cu regiștrii).

Planificare - Diagrama Gantt

Documentație

Datasheet microprocesor RA4M1 - https://cdn.sparkfun.com/assets/b/1/d/3/6/RA4M1_Datasheet.pdf

Schema electronică a microcontroller-ului - https://docs.arduino.cc/resources/schematics/ABX00087-schematics.pdf

Documentație matplotlib (Pyhton) - https://matplotlib.org/