This shows you the differences between two versions of the page.
pm:prj2025:ccristi:rares_andrei.ticus [2025/05/27 01:24] rares_andrei.ticus [Documentație] |
pm:prj2025:ccristi:rares_andrei.ticus [2025/05/27 04:20] (current) rares_andrei.ticus [Documentație] |
||
---|---|---|---|
Line 5: | Line 5: | ||
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ă. | 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 ===== | ===== Descriere generala ===== | ||
Line 78: | Line 78: | ||
* tipul evenimentelor acceptate - ''interrupt_event_t'' | * tipul evenimentelor acceptate - ''interrupt_event_t'' | ||
* macro-uri peste ''interrupt_event_t'' | * macro-uri peste ''interrupt_event_t'' | ||
- | * funcția de adăugare a unei rutine în vectorul de întreruperi - ''void addInterrupt(interrupt_event_t event, irq_func isr)'' | + | * funcția de adăugare a unei rutine în vectorul de întreruperi - ''void addInterrupt(interrupt_event_t event, irq_func_t isr)'' |
- ''timer.h'' - oferă declarația funcției ''void init_timer()'' | - ''timer.h'' - oferă declarația funcției ''void init_timer()'' | ||
Line 97: | Line 97: | ||
- ''uart.cpp'' - acest fișier conține implementarea mai multor funcționalități | - ''uart.cpp'' - acest fișier conține implementarea mai multor funcționalități | ||
* definirea inițializării modulelor UART - se inițializează 2 module (SPI2, baudarate 19200 și SPI9, baudrate 115200). Pe SPI2 microcontroller-ul așteaptă un caracter literă mare de la calculator și, în rutina întreruperii cauzate de primirea mesajului, încearcă să trimită înapoi caracterul mic aferent. Pe SPI9 se trimit datele culese de la GPIO. | * definirea inițializării modulelor UART - se inițializează 2 module (SPI2, baudarate 19200 și SPI9, baudrate 115200). Pe SPI2 microcontroller-ul așteaptă un caracter literă mare de la calculator și, în rutina întreruperii cauzate de primirea mesajului, încearcă să trimită înapoi caracterul mic aferent. Pe SPI9 se trimit datele culese de la GPIO. | ||
- | * definirea mecanismului de trimitere pe seriala SPI2. Practic, de fiecare dată când transmisia pe SPI9 este posibilă, programul verifică dacă mai are ceva de transmis din buffer-ul de transmisier, iar, în caz contrar, încarcă în buffer prima înregistrare de stare GPIO netrimisă. | + | * definirea mecanismului de trimitere pe seriala SPI2. Practic, de fiecare dată când transmisia pe SPI9 este posibilă, programul verifică dacă mai are ceva de transmis din buffer-ul de transmisie, iar, în caz contrar, încarcă în buffer prima înregistrare de stare GPIO netrimisă. |
- | - ''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 buffer-ul circular de stări ce este transmis în uart.cpp. | + | - ''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 === | === 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. | 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: {{:pm:prj2025:ccristi: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 ===== | ===== Planificare - Diagrama Gantt ===== | ||
Line 111: | Line 127: | ||
Datasheet microprocesor RA4M1 - https://cdn.sparkfun.com/assets/b/1/d/3/6/RA4M1_Datasheet.pdf | 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 | Schema electronică a microcontroller-ului - https://docs.arduino.cc/resources/schematics/ABX00087-schematics.pdf | ||
- | Documentație biblioteca matplotlib (Pyhton) - https://matplotlib.org/ | + | |
+ | Documentație matplotlib (Pyhton) - https://matplotlib.org/ |