Archive for the 'PIC' Category

PIC Timer Calculator for iPhone

Lunes, marzo 14th, 2011

Hola a todos.

Esta vez no traigo un montaje electrónico, sino una aplicación relacionada con la programación de microcontroladores PIC.

¿No os ha pasado nunca el estar programando para PIC , necesitar un timer y liaros con las farragosas fórmulas de los timers? ¿y no tener el ordenador a mano para usar un programa calculador?. A mí si, un montón de veces y siempre tengo algo a mano: el teléfono móvil.

Así que me he decidido a programar una aplicación que pueda llevar en el móvil y poder hacer los cálculos en cualquier parte.

Su funcionamiento es muy sencillo:

Tenemos:

  • Cuadro de texto para la frecuencia del cristal (Frequency). La frecuencia tambien se puede seleccionar entre las más habituales en el selector inferior.
  • Cuadro de texto  “Load timer” para seleccionar la precarga del timer. Esta precarga tambien se puede modificar con los botones a los lados del cuadro de texto y con el slider inferior.
  • Un selector para elegir el tipo de timer ( 8 ó 16 bits ).
  • Dos selectores deslizantes (pickers) para una tabla de frecuencias habituales y prescalers.

Una vez configurados los datos, el programa nos muestra en la zona inferior el tiempo en que el timer va a tardar en desbordarse.

Muy simple y muy práctico.

La aplicación tiene una única particularidad: sólo puede instalarse en un teléfono con Jailbreak, ya que actualmente aún no dispongo de licencia de desarrollador para subirla a la App Store.

Por tanto necesitaréis además del iPhone con Jailbreak, tener instalado el AppSync para instalarlo por iTunes.

Salu2,
Droky.

Descargas

e-Candies(1). Acelerómetro Digital MMA7455

Miércoles, diciembre 1st, 2010


A long time ago…

Bueno, de vuelta poco a poco.

En esta ocasión vamos a hacer un pequeño repaso a esas “golosinas” que suponen nuestros mini módulos que usamos habitualmente en nuestros montajes previos a una integración total con la PCB final, que reutilizamos mil y una vez y que algunas veces nos dan algún quebradero de cabeza, en especial cuando implementamos algún tipo de chip nuevo con el que vamos a experimentar.

En este primer post, me voy a centrar en el acelerómetro digital MMA7455 de Freescale.
Este es un modelo de acelerómetro 2G/4G/8G que se puede interconectar por SPI o I2C.

Tiene una resolucion de 8 bits y hasta 10 bits en modo 8G.

Es muy fácil de configurar modificando simplemente valores en sus registros internos.

Y los datos también son muy sencillos de leer de los propios registros de los ejes o de configuración.

Dispone de dos interrupciones configurables por el usuario y la posibilidad de setear los registros de los ejes para calibrar el dispositivo.

Se alimenta entre 2,5 – 3,6 vDC y tiene un consumo mínimo en standby de 26uA por uno de max 3mA en funcionamiento.

Es un cacharrito interesante para alimentarlo con una pila tipo coin cell (botón).

He optado por hacer una PCB que pueda servir para usarlo de los dos modos posibles. En el caso del SPI usando SDA/SDO en una sola patilla.

La soldadura, teniendo en cuenta que el encapsulado es LGA-14 no ha sido muy complicada. Eso sí, usando pasta de estaño.

La implementación de las comunicaciones tambien he decidido hacerla por I2C, con lo que en este caso será necesario añadir al circuito 2 resistencias de pull-up de 4k7 ohms entre SDI, SDO y Vcc.

Este es el esquema del circuito, que como podeis ver, no es más que un adaptador a SIL (Single In Line) para poder pinchar en la protoboard:

Y esta la PCB resultante:

Implementación en CCS

La implementación de la comunicación I2C del acelerómetro es bien simple. Sólo hay que configurar en el inicio el modo de funcionamiento del acelerómetro y posteriormente leer los registros de los ejes para obtener los datos de aceleración.
Voy a hacer una configuración básica. Lo voy a configurar con un rango +/-2G y en modo de medición, que es el más habitual.
Abrimos el datasheet del acelerómetro, extraemos las tablas de configuración del registro de control del modo de funcionamiento ($16) y vemos que para seleccionar el modo +/-2G debemos poner los bits GLVL[1:0] a 01:

Y para el modo de funcionamiento de medición, los bits MODE[0:1] hemos de ponerlos a 01:
Con lo cual nuestro dato a escribir en el registro $16 va a ser 0b0000101 (0×05).

Para poder escribir y leer datos en el acelerómetro, necesitamos direccionarlo primero en el bus I2C. El datasheet nos dice que la dirección del dispositivo es $1D (0x1D).

Tenemos que fijarnos ahora en los gráficos de escritura y lectura de 1 byte en el acelerómetro para no cometer un error típico en el manejo de dispositivos serie.

La longitud de la dirección del dispositivo ($1D en nuestro caso) es de 7 bits [6:0], no de ocho, ya que la dirección se desplaza 1 bit hacia la izquierda para añadir en el bit menos significativo el flag de lectura o escritura (W/R):

Para escritura, desplazamos y añadimos un 0:
(0x1D)=00011101 desplazamos 1 bit a la izquierda y le sumamos 0 => 00111010 = 0x3A
Y para lectura, desplazamos y añadimos un 1:
(0x1D)=00011101 desplazamos 1 bit a la izquierda y le sumamos 1 => 00111011 = 0x3B
Con lo que para una escritura, enviaríamos:

  • [Start bit]
  • [0x3A] Device Address + W
  • Esperamos Ack
  • [Registro a escribir]
  • Esperamos Ack
  • [Byte a escribir]
  • Esperamos Ack
  • [STOP bit]

Podeis verlo en el siguiente cronograma, escribiendo 0×05 en el registro de configuración 0×16:

Para la lectura de un registro, el procedimiento será:

  • [Start bit]
  • [0x3A] Device Address + W
  • Esperamos Ack
  • [Registro a escribir]
  • Esperamos Ack
  • [0x3B] Device Address + R
  • [Leemos 8 bits]
  • Enviamos NAck
  • [STOP bit]

Podéis verlo tambien en el siguiente cronograma, leyendo el registro de configuración 0×16 que en este caso ya está cargado con 0×05:


Ya podemos hacer algo interesante con él y este podría ser el código que manejara el MMA7455:

//*****************************************************************
//                            MM7455.c
//
//   Librería para control de acelerómetro Freescale MM7455
//   por bus I2C
//   Author codigo C: Droky
//   Released at 19/09/2010
//
//
//*****************************************************************
// --------------------------------------------
// Definición de BUS I2C
// --------------------------------------------
#use i2c(master,fast,sda=PIN_B5, scl=PIN_B4)

//-----------------------------
//Comprobacion de acelerometro
//-----------------------------
BOOLEAN accel_ready() {
   int1 ack;
   i2c_start();            // Si el comando de escritura recibe ACK
   ack = i2c_write(0x3A);  // el dispositivo está listo.
   i2c_stop();
   return !ack;
}
//------------------------------
// Inicializacion Acelerometro
//------------------------------
void  accel_init(){
   i2c_start();
   i2c_write(0x3A); //0x1D desplazado con un 0
   i2c_write(0x16); //Registro MODE CONTROL
   i2c_write(0x05); //Medición contínua
   i2c_stop();
}
//-----------------------------------
// Escritura 1 registro
//-----------------------------------
void  accel_write(int reg, int data){
   i2c_start();
   i2c_write(0x3A); //0x1D desplazado con un  0
   i2c_write(reg);  //Registro a escribir
   i2c_write(data); //Dato a escribir en registro
   i2c_stop();
}
//-----------------------------------
// Lectura 1 registro
//-----------------------------------
int   accel_read(int reg){
   int   data;
   i2c_start();
   i2c_write(0x3A); //0x1D desplazado con un  0
   i2c_write(reg);  //Registro a leer
   i2c_start();
   i2c_write(0x3B); //0x1D desplazado con un  1
   data=i2c_read(0); //Dato leido->data
   i2c_stop();
   return(data);
}
//----------------------------------
// Lectura de 3 ejes de forma
// consecutiva y almacenado en
// 3 variables globales Xdata,
// Ydata y Zdata
//----------------------------------
void accel_read_3axis(){
   i2c_start();
   i2c_write(0x3A); //0x1D desplazado con un  0
   i2c_write(0x06); //Primer registro a leer (eje X)
   i2c_start();
   i2c_write(0x3B); //0x1D desplazado con un 1
   Xdata=i2c_read(); //Lectura eje X
   Ydata=i2c_read(); //Lectura eje Y
   Zdata=i2c_read(0); //Lectura eje Z
   i2c_stop();
 }

Y esto ha sido todo por ahora.
Nos vemos en la próxima entrega de e-candies. Quizás un conversor serial a Bluetooth para comunicarnos inalámbricamente con nuestro aparatito.
Droky.

Descargas

Pong con acelerómetro en matriz de leds

Domingo, diciembre 14th, 2008

Siguiendo con los experimentos con acelerómetro y la matriz de leds, ahora le toca el turno a un mini juego de Pong.
La pala se maneja moviendo la placa hacia los lados, con la particularidad que ésta es ligeramente elástica y rebota contra las paredes laterales.
La velocidad de la pelota varía según el tipo de golpe que se le de y la fuerza de empuje lateral que lleve la pala.
Ahí os dejo un video del funcionamiento:

Salu2

Conversor USB<>TTL ( 5v y 3,3v )

Lunes, junio 23rd, 2008

Seguro que alguna vez habéis necesitado conectar vuesro circuito con PIC, Arduino, Atmel, un GPS, una placa entrenadora o cualquier cosa a un puerto serie de vuestro ordenador y os habéis encontrado que los portátiles modernos ya no llevan conector RS232 y necesitais un adaptador y luego un convertidor de niveles a TTL. Y si resulta que necesitáis que el circuito funcione con niveles de 3,3v pues el lío aún es mayor.

Este circuito permite conseguir esa comunicación serie tan necesaria a veces y además podemos seleccionar el tipo de niveles de tensión con los que vamos a comunicarnos: 5v o 3,3v simplemente con un pequeño jumper de soldadura en la placa.
Añadiría un plus al circuito, y es que puede alimentar un circuito conectado a él ( a 5v o 3.3v ) y hasta un máximo de 100mA de consumo. No esta mal…

El circuito

El circuito gira alrededor de un chip de FTDI, el FT232RL que es un chip con “USB to serial UART interface” integrado. No necesita ningún tipo de programación, solo conectarse con unos pocos componentes alrededor y listo.
Observamos el esquema que es prácticamente uno de los App Note del fabricante pero modificado para el tipo de placa simple y pequeña que me apetecía desarrollar.
Tenemos 5 condensadores de desacoplo de las diferentes tensiones de alimentación que existen en el circuito, que son :
La tensión de salida del USB, la misma tensión después de pasar por el filtro de ferrita (Ferrite Bead), la tensión de salida de 5v, la tensión de salida de 3.3v y la tensión de alimentación del FT232RL. Estos valores se han tomado siguiendo el consejo del fabricante.
JMP1 es el jumper que permite seleccionar la tensión de trabajo del circuito entre 3.3v y 5v, que será la misma que proporcionará a la salida por el pin 1 del conector SV1.
Y R1 es una resistencia de 0 ohm usada como jumper para poder resolver la PCB a una sola cara uniendo dos planos de masa.

La PCB

He intentado que fuera lo más pequeña posible y a una sola cara, para no complicar el asunto de la PCB y desechando componentes tamaño 0805 porque no podia pasar pistas entre las patillas, me decidí por el tamaño 1206 que también es más cómodo de posicionar. Para reducir espacio ( mi prototipo mide 38×17 mm ) usé un conector miniUSB tipo B y el FT232RL tiene un encapsulado SSOP de 28 pines.
El conector de salida es una tira de 5 pines con las siguientes conexiones:
1-VCCOut, 2-TX, 3-RX, 4y5-GND
Así me quedó la placa usando un nuevo proceso para crear el fotolito con impresora laser que aún estoy perfeccionando:

Y este es el fotolito de la PCB:


El resultado final con la simulacion en Eagle 3D:

Los Drivers
Una vez comprobado todo de posibles cortocircuitos y soldado todo ( impresiona ver como se va todo al sitio en el horno de soldadura ) llega el momento de la verdad, así que conectamos el circuito a nuestro puerto USB y parece que nos lo detecta sin problemas:

Le damos el DRIVER DEL FABRICANTE y ya lo tenemos instalado como un nuevo puerto serie:


La Prueba

Pues con un programa de comunicaciones tipo terminal, envío una trama en hexadecimal por el nuevo puerto serie creado, tal que: 0A0F0A0 y esto es lo que obtengo en el pin TX del circuito:
Para JMP1=5v:

Y para JMP1=3.3v

El resultado es que envía datos y como tenía que probar la recepción y la transmisión, que mejor que una fonera y conectada a niveles de 3.3v. Sueldo el Jumper JMP1 para modo 3.3v y preparo un adaptador ( sin quererlo casi se conecta directamente a la fonera ) para conectar con la fonera.

Con el hiperterminal , me conecto a la fonera. Me sale la consola de RedBoot y pulso Control+C … ya está, envío y recibo. El circuito funciona perfectamente.

Descargas:

Power Booster para puerto serie. Por jjavivi

Viernes, mayo 16th, 2008

Cuantas veces habeis intentado programar un PIC con el puerto serie de un portátil y no lo habéis conseguido porque la energía suministrada por el puerto no es suficiente para autoalimentarlo?
Pues este diseño enviado por jjavivid puede ser la solución a ese problema.
El diseño es original de EB4EQA y jjavivi lo ha desarrollado con Eagle y montado.
El circuito está desarrollado en torno al MAX205 de Maxim que es similar en comportamiento al famoso MAX232 pero posee 5 receptores y 5 drivers, y no necesita condensadores externos, lo cual simplifica mucho el circuito y reduce el espacio usado por los condensadores.
El circuito es tan simple como:
Si conectamos las salidas TTL de los receptores RS-232 a las entradas TTL de los drivers RS-232, obtenemos la misma señal RS-232 pero con corriente suficiente para hacer funcionar nuestro programador. Supongo que también podrá ser útil en los conversores USB-RS232 que no funcionan con ningún tipo de programador. Ya contaréis si alguien lo prueba.

Este es el esquema:


Y esta la PCB. Observad que hay dos lineas ( las rojas) que no han sido resueltas en la placa y necesitan ser cableadas al montarlo:

La simulacion en Eagle3D:

Y ojo al lado de las soldaduras, que es donde están los condensadores de filtro del regulador de tensión y la resistencia limitadora del led:

Descargas:


Copy Protected by Tech Tips's CopyProtect Popup Images .