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ă.
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).
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:
typedef void (*irq_func_t)(void)
interrupt_event_t
interrupt_event_t
void addInterrupt(interrupt_event_t event, irq_func_t isr)
- timer.h
- oferă declarația funcției void init_timer()
- uart.h
- oferă suport pentru lucrul cu seriala. Astfel, sunt declarate:
void init_uart()
void sendDigitalData()
- main.cpp
- conține logica principală a aplicației
setup()
inițializează modulul de UART, timer-ul și pini de GPIO și activează întreruperile.loop()
trimite date către calculator pe serială.
- 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.
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.
- Link github: https://github.com/raresh001/Logical-Analyzer/tree/master
- Arhivă cod: ticusrares_logicalanalyzer.7z
Link videoclip demonstrație: https://youtu.be/VTMEd0hsHNk
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).
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/