domingo, 23 de junio de 2013

Analizador Lógico


Hola hace tiempo que no escribía por aquí; pues como les comenté, compré unos analizadores lógicos y está bastante bien la relación precio-funcionalidad, para lo que nos sirve, funcionan con el software de http://www.saleae.com/ , pues en realidad es un clon; como lo dije, el original y desde mi punto de vista está a buen precio en Estados Unidos ($150USD) para ser un producto de calidad de 8 canales, tristemente no estamos en Estados Unidos, estamos en México y aquí es mucho más caro ya que nos viene saliendo en $250 USD sin la importación lo cual ya vendrían siendo unos $ 3,000 pesos más lo de paquetería y la verdad así ya no vale la pena creo yo.


Pues les explico qué es una analizador lógico. La definición de wikipedia nos dice que: “es un instrumento de medida que captura los datos de un circuito digital y los muestra para su posterior análisis, de modo similar a como lo hace un osciloscopio, pero a diferencia de este, es capaz de visualizar las señales de múltiples canales. Además de permitir visualizar los datos para así verificar el correcto funcionamiento del sistema digital, puede medir tiempos entre cambios de nivel, número de estados lógicos, etc. La forma de capturar datos desde un analizador lógico es conectando una punta lógica apropiada en el bus de datos a medir” 


Pues como lo dice, es un instrumento que mide señales digitales, este no lo hace en tiempo real sino que tú le indicas si correr o que espere un disparo en una X señal y empieza a leer datos, pero este tiene la ventaja de que si estás usando un protocolo serial como CAN, DMX-512, I2C, I2S/PCM, Manchester, 1-wire, Async Serial (UART), Paralelo, SPI o UNI/O (protocolo serial de Microchip para sistemas embebidos) tú le dices en el canal 1 tengo SDA y en el canal 2 tengo SCL del I2C, canal 3 tengo MOSI y canal 4 MISO del SPI y los demás son señales simples o algún otro protocolo y te da el dato que se está enviando.


image


Como ven en la imagen a la derecha más o menos al centro se ven todos los protocolos que tiene el software del analizador lógico.


Pues para probar lo que puede hacer el analizador lógico hice una aplicación muy simple.


El material que utilicé fue una tarjeta XPLAIN XMEGA-A3BU o el micro controlador que está dentro de ella que es un XMEGA256A3BU, un sensor ultrasónico HC-SR04, un módulo bluetooth y el analizador lógico.


511


La aplicación consiste en hacer una lectura del módulo ultrasónico, procesar el dato (convertirlo a centímetros) y enviarlo vía bluetooth a una terminal, ya sea en la PC o en un teléfono, en este caso estoy usando la del teléfono, desde aquí pueden bajar la aplicación. Actualmente estoy usando el AVR software framework debido a que AVR GCC es del 2010 y ya no le dan soporte y el Atmel software framework  (ASF) está bastante bien (es muy parecido al AVR GCC). Una de las cosas que me gustó mucho del ASF es que todo está en estructuras (al menos para los XMEGA que son los que he usado), por ejemplo para los puertos de entrada o salida pones PORTA.DIR, PORTA.OUT , USARTE0.DATA, USARTE0.CTRLA, USARTE0.CTRLB, TCC0.CTRLA, TCC0.CTRLB, TCC0.TCNT, etc …. La verdad no sé si esté así para los ATtiny o ATmega con el ASF pero para los XMEGA sí y los he estado usando bastante y he comparado precios con los ATmega. A mi punto de vista vale mucho más la pena comprar un XMEGA, que son más baratos y hacen muchas más cosas, la curva de aprendizaje no es nada extravagante para los que ya saben usar los ATmega o ATtiny ya que sólo basta aprender los demás dispositivos que tienes disponibles como DMA y Event system, tienen muchos más dispositivos a la mano en muchos puertos, hay 2 USART´s, también 2 timer´s, el ADC es más preciso(12-bit´s), SPI´s, I2C´s, encriptación AES y DES en hardware, cálculo del CRC en hardware, salidas analógicas, etc…… en fin. Son mucho más baratos y tienen muchas más cosas creo que vale la pena aprender a usarlos, si andas tratando de aprender algún micro controlador te recomiendo que aprendas los XMEGA, puedes comprar algún XPLAIN con un XMEGA y pues te vas a gastar no más de 400 pesos, aparte el IDE de C es gratuito (Atmel Studio 6) y esta mucho mejor que otros IDE´s que he visto como de fujistu (softune), TI (Code composer) o Freescale (Codewarrior). Todos esto tiene sus desventajas claro pero pues la verdad no son tan desventajas, si lo son si eres principiante, no encuentras los chips en empaquetado DIP solo en montaje superficial como QFP, QFN, etc … y la segunda trabajan a máximo 3.6 Volts lo que quiere decir que si son interfaces de 5 Volts habrá que poner convertidores de nivel, no lo he probado pero he leído que las entradas no son tolerantes a 5v y se queman si les pones 5 volts.


Ahí está el código pero no lo explicaré muy bien porque el punto es que conozcan más un analizador lógico.

   1:  #define F_CPU 32000000UL  //32 MHZ clock

   2:  #define triger    (1<<0)|(1<<1) //Pin used as triger one for the triger and the other for the logic analyzer

   3:  #include <avr/io.h>

   4:  #include <util/delay.h>

   5:  #include <stdlib.h>

   6:   

   7:  typedef union{                    //union definition of 16 bits

   8:      uint16_t    palabra;        //accessing as a word

   9:      uint8_t        bytes[2];        //accessing as to bytes

  10:      }w_16bits;

  11:      

  12:  char BCD_dis[6];    //pointer to array of the value to send

  13:      

  14:  volatile uint32_t distancia;    //read value

  15:  volatile uint8_t i;

  16:   

  17:  void clk_config(void);  //clock configuration for 32 MHZ

  18:   

  19:  int main(void)

  20:      {

  21:      clk_config();                                //configuration of the clock

  22:      PORTA.DIR|=triger;                            //port to trigger the ultrasonic sensor

  23:      EVSYS.CH6MUX=0b01100000;                    //event system channel 6 configured to PORTC PIN 0

  24:      PORTC.PIN0CTRL=0x00;                        //PORTC PIN 0 set as input sensing both edges

  25:      TCC0.CTRLA|=TC0_CLKSEL2_bm;                    //division factor by 8 so the clock is 32000000/8=4000000

  26:      TCC0.CTRLB|=TC0_CCAEN_bm;                    //activate output compare A

  27:      TCC0.CTRLD|=TC0_EVACT2_bm|TC0_EVACT1_bm|TC0_EVSEL3_bm|TC0_EVSEL2_bm|TC0_EVSEL1_bm;  //pulse width capture and event channel 6

  28:      USARTE0.CTRLB=(1<<4)|(1<<3);                //UART configuration

  29:      USARTE0.CTRLC=0b00000011;                    //UART configuration

  30:      USARTE0.BAUDCTRLA = 12;                        //UART configuration

  31:      USARTE0.BAUDCTRLB = (1<<6);                    //UART configuration

  32:      PORTE.DIR|=(1<<3);                            //set UART port as output

  33:      BCD_dis[4]=0x0A;                            //fill the array to send with a LF

  34:      BCD_dis[5]=0x0D;                            //fill the array to send with a CR

  35:      while(1)                                    //main program while cycle

  36:      {

  37:          PORTA.OUT|=triger;                        //triger action

  38:          _delay_us(11);                            //minimum time for triger

  39:          PORTA.OUT&=~(1<<0);                        //turning of trigger

  40:          PORTA.OUT&=~(1<<1);                        //turning of trigger

  41:          _delay_ms(60);                            //wait you can only do one read every ~ 60 ms

  42:          distancia=(TCC0.CCA/232);                //convert the read value to centimeters avoiding floating point math

  43:          itoa(distancia,BCD_dis,10);                //Change the 16bit value to a readable number un a console

  44:          for(i=0;i<=5;i++)                        //cycle for sending characters

  45:              {

  46:                  USARTE0.DATA=BCD_dis[i];        //character send

  47:                  while((USARTE0.STATUS&(USART_TXCIF_bm))==0);//check for the send flag

  48:                  USARTE0.STATUS|=USART_TXCIF_bm;    //clear the send flag

  49:              }

  50:      }

  51:  }

  52:   

  53:  void clk_config(void)

  54:  {

  55:      OSC.PLLCTRL=0x80;                            //Oscillator configuration

  56:      OSC.CTRL |= (1<<OSC_RC32MEN_bp);            //Oscillator configuration

  57:      while((OSC.STATUS & (OSC_RC32MRDY_bm)) == 0);//Oscillator configuration

  58:      CCP = CCP_IOREG_gc;                            //Oscillator configuration

  59:      CLK.CTRL |= CLK_SCLKSEL_RC32M_gc;            //Oscillator configuration

  60:      OSC.CTRL &= ~OSC_RC2MEN_bm;                    //Oscillator configuration

  61:  }




Como les comenté hay que dar un pulso al sensor ultrasónico para que comience la secuencia, se manda el pulso de aproximadamente 10ms.




image


Como se alcanza a ver en la imagen en el canal 0 que dice Triger me da la anchura del pulso, el periodo y la frecuencia, todos estos datos son útiles, el periodo no es igual al del código debido a que como es la función de _delya_us pues no es exacta pero se aproxima mucho.


Seguido del pulso, el sensor ultrasónico nos regresa un pulso, dependiendo de la anchura de este pulso es la distancia medida con un límite de 300 centímetros que yo vi que son como 250 centímetros.




image



Esto lo podemos ver en el canal 1 que dice Echo la anchura del pulso es de 10.887 ms y el periodo debe de ser igual al del triger debido a que están relacionados, tomando esos 10.887 ms y viendo la hoja de datos del sensor HC-SR04 la fórmula dice tiempo en cms = tms/58 sabiendo que 10.887 ms son 10887, aplicamos la formula: 10887/58 y sale 187.7068 cms y la lectura que hace el microcontrolador es de 194, quizás no es exacta pero es muy acertada, puede ser error de la fórmula por que no considera pequeñas variables y como estoy eliminando datos de punto flotante pierdo precisión.



image




Como se ve en el canal 3 dice Serial TX, estos datos son seriales y es el protocolo que usé, el primero es un 1 seguido de 9 después un 4 y un 0 los \n y \r son retorno de carro y salto de línea, aquí lo interesante es que si se fijan tengo un 0, ese 0 es un cero hexadecimal que envió el hardware debido al programa y los demás no son ceros sino que son los números 31, 39 y 34 que corresponden al 1, 9 y 4, esto se puede ver que el 0 tiene todos los bits en bajo y los demás no debido a que la configuración se conforma por el bit de inicio seguido por el menos significativo y así sucesivamente hasta el séptimo bit que es de paro y sin paridad.




2013-06-23 20.02.04




Por ahí se ve el 194 que vimos, me costó trabajo agarrarlo (como lo hace 15 veces por segundo es complicado). Guardé los datos para que los bajen y los puedan abrir en el software de http://www.saleae.com/downloads y aquí esta el link de la sesión.




Aquí una foto de lo que hice físicamente la verdad está hecho un desastre.




2013-06-23 20.28.29




Como se ve en el lado izquierdo está el depurador para el micro, en el centro la Xmega-A3BU Xplained después en la orilla derecha el analizador lógico, en la parte de abajo al centro está el sensor ultrasónico y a su lado derecho un poco más arriba el módulo bluetooth.




Pues ya vieron más o menos lo que hace. Es bastante útil para los que diseñamos sistemas digitales y que manejamos protocolos seriales, un osciloscopio nos sirve pero pues este para protocolos seriales es muy muy bueno. Compré varios de estos y por si les interesa los estaré vendiendo en mercadolibre (link) y si les interesa alguna otra cosa tmb la puedo conseguir sólo contáctenme ya saben por correo, un comentario o mi twitter @lams_007


Saludos