| Línia 117: | Línia 117: | ||
{|class=wikitable | {|class=wikitable | ||
!colspan= | !colspan=16|Header | ||
|- | |- | ||
!colspan=8|Byte 0 | !colspan=8|Byte 0 | ||
| Línia 128: | Línia 124: | ||
|B7||B6||B5||B4||B3||B2||B1||B0 | |B7||B6||B5||B4||B3||B2||B1||B0 | ||
|B7||B6||B5||B4||B3||B2||B1||B0 | |B7||B6||B5||B4||B3||B2||B1||B0 | ||
|- | |||
!colspan=4|TYPE | |||
!colspan=2|CH | |||
!colspan=10|BLOCK_LEN | |||
|- | |- | ||
|} | |} | ||
Revisió del 08:44, 12 feb 2013
Introducció
En algunes màquines el LDST no funciona, i la informació que es pot veure en els arxius de log és insuficient per sol·lucionar el problema. Fins ara la alternativa era connectar-se a una unitat de dades que s'entengues amb aquesta màquina concreta i reproduir els missatges que enviava la màquina a la unitat de dades mirar que responia, modificar el programa per que seguis el mateix comportament i tornar-ho a provar...
Els problema que té aquest mètode, és que es perd informació al passar la senyal per el adaptador RS232<->USB (Si el adaptador no pot decodificar la senyal, la ignora). A més a més ens limita a només senyals compatibles RS232
El problemes d'aquest sistema són:
- Lent, s'ha de reproduir el problema contra la unitat de dades, capturar la resposta, modificar el programa i tornar-ho a intentar contra la màquina, repetir per cada comportament inesperat...
- Poc robust. Si no es saben previament una serie de parametres (baudrate,data bits,stop bits,paritat) la captura fallarà.
- Inprecís. Per culpa dels adaptadors RS232<->USB, tots els temps entre diferents events del RS232 tenen un error mínim de 20ms (Ex: Si rebem 1 byte i 10ms més tard DTR canvia d'estat, no queda clar si ha passat en aquest ordre o a l'inrevés. També qualsevol puls de duració inferior a 20ms en una linia d'estat, pot ser perdut). Tampoc tenim accés al bit de paritat.
- Limitat al RS232. Com indica el nom els adaptadors RS232<->USB. No soporten capturar comunicacions que no siguin RS232.
Disseny del sniffer
L'sniffer intenta superar aquestes limitacions usant un sistema diferent per capturar les dades. L'sniffer està pensat per capturar una comuniació entre la màquina i la unitat de dades, sense interferir.
Per reutilitzar el màxim de peces i simplificar el desenvolupament del HW s'ha optat per utilitzar el mateix xip que s'utilitza per la versió 2 de la capsa de comunicacions: el FT2232H.
Aquest xip a part del mode RS232 soporta altres modes de treball. Per el sniffer s'ha optat per usar el mode FT245 Async FIFO. Aquest mode ens ofereix 2 canals (A i B) de 8bits cada un, amb capacitat de capturar 1M/Sample per canal i ens permet treballar amb freqüencies relativament baixes (1MHz i per sota).
El canal A s'ha dedicat a la captura exclusiva de senyals RS232. Això limita l'sniffer a la captura d'un màxim de 8 senyals RS232.
El canal B s'ha dividit en 2 sub-canals. Cada un dels sub-canals s'ha conectat a un PIC12LF1840 que s'utilitza per capturar nivells de voltatge.
També s'ha inclòs en la placa l'adaptació de senyal necessaria per rebre les transmissions PCM que sembla que utilitzen les unitats de dades més modernes.
Finalment, el conexionat entre l'electrònica del sniffer i el connector SUB25 es fa amb jumpers cosa que permet que es pugui canviar les linies a capturar.
Mòdul RS232
Per l'adaptació de nivell de les senyals RS232 s'ha optat per usar el MC1489, ja que és fàcil d'obtenir, barat i només requereix 5V per l'alimentació. S'ha posat un latch entre els MC1489 i el FT2232H per evitar problemes de meta-establilitat i sincronitzar les entrades amb les escriptures de dades. També s'ha posat un bloc de LEDs que permet veure l'estat de les linies directament.
Mòdul analògic
Per fer la conversió d'analògic a digital, s'ha utilitzat un PIC12LF1840, malgrat que no és el component més adequat, ja es disponia d'ell. A més a més al ser un micro-controlador, permet ser reprogramat per realitzar altres funcions.
El PIC12LF1840 internament captura el valor del voltatge amb 10bits de precisió però només s'envien 6bits en 2 blocs de 4bits. Al haver-hi 2 canals
| CLK | Byte Canal B | |||||||
|---|---|---|---|---|---|---|---|---|
| B0 | B1 | B2 | B3 | B4 | B5 | B6 | B7 | |
| CK_n | A0 | A1 | A2 | 1 | B0 | B1 | B2 | 1 |
| CK_n+1 | A3 | A4 | A5 | 0 | B3 | B4 | B5 | 0 |
Adaptació de senyal
Per adaptar la senyal,s'ha utilitzat el mateix transformador que l'unitat de dades de Mayer. Per amplificar la senyal s'ha utilitzat el integrat TLV274 que conté 4 Op-Amps.Per desgràcia, la senyal d'entrada és bipolar i en principi els Op-Amps requereixen una font d'alimentació simètrica per poder treballar-hi correctament.
Per evitar usar una font d'alimentació simètrica (Ex: +5V,0V,-5V) s'ha sacrificat un dels Op-Amps per generar una referència de 2.5V i usar-la com a '0V'. De manera que per la resta d'Op-Amps veuen una font d'alimentació simètrica de +2.5V (+5V per la resta de la cicuiteria),0V (2.5V),-2.5V (0V).
Per cada canal analògic s'ha usat un Op-Amp en mode amplificador inversor, ja que així carrega menys la font de 2.5V i també permet atenuar la senyal en cas de necessitat. El factor de guany té un rang des de 0 fins a -10.
L'últim Op-Amp,s'ha connectat de manera que no interfereixi en el circuit.(Un Op-Amp sense connexió a les entrades pot començar a oscil·lar i generar interferències en la resta de la placa)
Control
Per sincronitzar la resta de integrats i generar la senyalització necessaria per que el FT2232H capturi les dades s'ha utilitzat un altre PIC12LF1840. Malgrat que és excessiu, ja que segurament unes poques portes lògiques serien suficients, s'ha utilitzat aquest xip, ja que es tenia en stock, ocupa menys espai en la placa i finalment, si algun dia es decideix canviar la lògica de control, es pot fer amb facilitat.
Conexions de programació/depuració
Ja que aquesta és una placa experimental, s'han afegit una serie de conectors per facilitar l'accés a certes senyals i simplificar la programació dels xips de la placa.
La placa disposa dels següents conectors per programació/depuració:
- JP0 + ICSP-0..2 permeten reprogramar els PIC12LF1840 sense treure'ls de la placa
- JP1 permet forçar el 74LS573 en mode transparent.
- JPA/JPB permeten testejar l'adquisició de dades analògiques substituint la senyal per un valor de voltatge conegut.
- JP_TEST facilita conectar un osciliscopi per veure la senyal abans de l'amplificació.
Esquemàtic del sniffer
[[Image:sniffer-sch.jpg]]
Software
Inicialment s'havia optat per usar el libftdi per evitar tractar amb els problemes de parlar directament amb el dispositiu, però per culpa d'alguns problemes amb la llibreria (en alguns casos donava error, poc soportada), finalment s'ha optat per usar el libusb i parlar directament amb el dispositiu. També s'ha optat per usar la verisió 1 del libusb (tot i que és molt menys extesa que la versió anterior) ja que soporta una API asincrona que facilita escriure un programa que llegeixi ràpid les dades del USB per evitar buffer-overruns en l'sniffer.
Per mostrar les dades capturades s'ha decidit usar OpenGL, ja que el programa no requereix una interacció complexa amb l'usuari i si que requereix poder mostrar gràfics de manera ràpida. Per evitar tractar directament amb les X s'ha usat la llibreria glut que ofereix una interfície minimalista per crear un context OpenGL i capturar events de teclat.
El programa està dividit en 2 threads:
- captura: està tota l'estona llegint dades del USB i copiant-les a un buffer i si s'escau, l'escriu a disc.
- GUI: Respon a les peticions del usuari i es dedica a redibuixar la pantalla cad 10ms i mostrar les dades capturades que hi han al buffer.
Comandaments
La interfície gràfica interpreta les següents tecles com a ordres:
- f/F:Conmuta entre pantalla completa i finestra normal
- s/S: Inicia/para la captura a disc. Les dades es guarden a un fitxer anomenat capt_nnn.bin
- q/Q/ESC: Tanca el programa de captura.
Format del Fitxer de captura
El fitxer consta de diversos blocs, cada bloc té el següent format:
| Iinici | Longitud | Descripció |
|---|---|---|
| 0 | 2 | Header |
| 2 | 0-1023 | Dades |
| Header | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Byte 0 | Byte 1 | ||||||||||||||
| B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
| TYPE | CH | BLOCK_LEN | |||||||||||||