domingo, 29 de marzo de 2015

Escritura y Lectura de memorias eeprom externas 24LCxxB (16F630 16F676)

En ocasiones necesitamos guardar información en memoria que no debe perderse si la fuente de alimentación de nuestro circuito deja de funcionar.
Para ello se puede utilizar la memoria interna eeprom del micro. Sin embargo, esta memoria no suele ser muy gande. Es entonces cuando podemos utilizar las memorias eeprom externas.

En el mercado hay una gran variedad de memorias de este tipo. Vamos a trabajar con la familia 24LCxxB de Microchip, que utiliza la interfase I2C.
Los números presentes en los dígitos xx indican el número de kilobits de la memoria. Por ejemplo, el código 24LC04B nos indica que tenemos 4kilobit de memoria (4016 bits), lo cual equivale a 512 bytes. Esta es la memoria que vamos a utilizar para nuestro proyecto.



Las memorias de 1,2,4,8 y 16 Kbits tienen una dirección de acceso única, sin embargo las memorias de mayor capacidad (32Kb, 64Kb,etc) disponen de tres pines para establecer la dirección de acceso al chip.

Otra característica de las memorias de menor capacidad es que deben ser accesadas por bancos de 256 bytes. Esto quiere decir que en nuestro caso tenemos 2 bancos de 256 bytes.

Si utilizamos el compilador PICBASIC PRO para programar el micro tenemos a nuestra disposición las instrucciones I2CREAD e I2CWRITE para leer y escribir en la memoria. El tercer parámetro de estas instrucciones (control) indica , entre otras cosas, el banco en el cual estamos trabajando. De tal forma que si queremos leer alguna posición desde 0 hasta 255 , debemos indicar que trabajamos con el banco 0, y para posiciones superiores a 255 debemos indicar que vamos a trabajar con el banco 1.

En el programa anexo hemos elaborado dos subrutinas de lectura/escritura que generan automaticamente los bits correspondientes.


En la sección init: escribimos en cada posición de memoria el primer byte de su dirección.
En la sección mainloop: leemos la memoria y mostramos el contenido en la pantalla del ordenador mediante un puerto serial/software.

En la pantalla adjunta podemos ver el resultado de la escritura/lectura en la utilidad Serial Communicator del compilador PICBASIC PRO



domingo, 22 de marzo de 2015

Programadores PIC

Un programador es un dispositivo que nos permite grabar en la memoria flash del micro el código hexadecimal generado por el compilador/ensamblador de nuestra preferencia.
Tenemos dos opciones: Adquirir uno en el mercado o construirlo nosotros mismos.
Los programadores mas populares son los de la empresa Microchip o sus clones, ya que esta empresa liberó los esquemas electrónicos de los mismos asi como también el software asociado.
Originalmente estos dispositivos utilizaban los puertos serial o paralelo para comunicarse con el computador. Hoy en día estos puertos han sido sustituidos por puertos USB.
Hay dos posibilidades para conectar el micro al que deseamos grabar el código hexadecimal:
  • Mediante una base donde se coloca el micro
  • Mediante programación en el circuito (ICSP) : No tenemos que retirar el micro del circuito, sin embargo, no todos los micros aceptan esta tecnología.
A continuación una relación reducida de algunos programadores:

El programador requiere para su utilización del software necesario para grabar el archivo hexadecimal en el micro.
Algunos programas disponibles:


lunes, 16 de marzo de 2015

Reloj interno, cristal o resonador ?

Cuando trabajamos en un proyecto una de las decisiones que debemos tomar está relacionada con el oscilador del microcontrolador.
En general tenemos tres opciones : Reloj interno del micro (en caso de que lo tenga), cristal de cuarzo o resonador cerámico.
A continuación las ventajas y desventajas:
  • Reloj interno: Es la opción mas económica ya que no necesitamos adquirir componentes adicionales. Por otro lado dejamos libres dos pines del micro que pueden ser utilizados como puertos de entrada/salida. La desventaja es su precisión, que por lo general tiene un error del 1%.
  • Resonador cerámico: Es la opción mas económica si necesitamos mayor precisión. El error suele estar entre 0.1% y 1%. Además del costo de un componente adicional tenemos que dedicar dos pines para su conexión.
  • Cristal de cuarzo : Es la opción mas precisa , en el rango de 10 a 50 partes por millón, aunque mas costoso que el resonador. Al igual que con el resonador debemos utilizar dos pines del micro y se requiere adicionalmente dos condensadores iguales entre los dos pines y tierra , por lo general de 22pf o 33pf.
 En resumen podríamos decir:
  • Un proyecto personal : Utilizar el reloj interno del micro. En caso de que no lo tenga utilizar un cristal de cuarzo. La diferencia de precio con el resonador es asumible.
  • Proyecto masivo donde no se necesita precisión y no se dispone de reloj interno: Usar el resonador. La diferencia en precio con el cristal se vuelve significativa cuando hablamos de cantidades grandes.
  • Proyecto donde se requiere preción: Utilizar cristal de cuarzo.

sábado, 14 de marzo de 2015

Contador con display de siete segmentos 16F630

Este proyecto utiliza todos los pines del micro 16F630 y su objetivo es desarrollar un contador de minutos/segundos utilizando un display cuadruple de 7 segmentos.



Como podemos ver en la figura no utilizamos resistencias para los segmentos , las utilizamos para los pines de selección de cada dígito, con lo que la luminosidad será diferente dependiendo del número mostrado.
El boton de reset permite iniciar el contador a 00:00
Tomando en cuenta que se utiliza el oscilador interno, la precisión no es muy buena (se adelanta un segundo cada 10 minutos con el micro utilizado).
El programa se muestra a continuación:


El proyecto utiliza interrupciones generadas por el reloj interno TMR0 .
Es interesante mencionar la línea al principio del programa :

  @  __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_ON & _CP_OFF 

Esta línea establece los parámetros del micro (fuses), ya que en el archivo 16F630.INI se comentó la misma línea para poder incorporarla en todos los programas y seleccionar los  valores de interés.


PIC Fuses PICBASIC Pro

Cuando compilamos un programa en PICBASIC Pro el compilador agrega a nuestro código las definiciones presentes en el archivo INC correspondiente al micro utilizado.
Si por ejemplo estamos utilizando el micro 16F630 tendremos el siguiente contenido:

Podemos observar que dependiendo del ensamblador que utilicemos (PM o MPASM) el encabezado es diferente.
Si quisieramos modificar alguno de los fusibles en nuestro programa, por ejemplo deshabilitar la función MCLR del micro 16F630 y utilizar el pin en su función como PORTA.3 , tenemos dos opciones:
  • Modificar el archivo 16F630.INI y colocar _MCLRE_OFF en lugar de _MCLRE_ON (para MPASM). En este caso la modificación aplicaría para todos los programas que compilemos.
  • Comentar la línea en el archivo 16F630.INI colocando punto y coma al principio de la misma, y agregando la línea @  __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_ON & _CP_OFF  al principio de nuestro programa (en el caso de MPASM). De esta forma podemos seleccionar valores diferentes para cada programa.


Interrupciones por Reloj 16F630

Ya sabemos que los micros PIC tienen relojes internos (de 8 y 16 bits) y manejan interrupciones.
La combinación de estos dos conceptos permite la generación de una interrupción a partir de uno de los relojes internos del micro.
Aunque el concepto es sencillo, para su implementación hay que ser muy cuidadoso y tomar en cuenta varios puntos fundamentales.
Vamos a analizar un programa muy sencillo en PICBASIC Pro  (basado en otros aportes de la web) utilizando el micro 16F630. El objetivo del programa es encender y apagar un led  conectado al pin 0 del puerto A (se utiliza un led colocado en el pin 1 del mismo puerto para validar cada vez que se produce una interrupción).


Puntos a considerar:
  • Vamos a utilizar el oscilador interno del micro. En el caso del 16F630 ( y otros ) se necesita calibrar dicho oscilador. Para ello se utiliza la instrucción  Define OSCCAL_1K 1  (ya que tenemos un micro con 1K de flash, en el caso de micros con 2K de flash la instrucción sería Define OSCCAL_2K 1 ). Esta instrucción toma un valor grabado de fábrica ubicado en las posiciones finales de la memoria flash, de ahí la importancia de indicar si el micro tiene 1K o 2K de flash.
  • Como el reloj interno es de 4Mhz, debemos indicarle al compilador dicho valor mediante la instrucción DEFINE OSC 4 .
  • Lo siguiente que debemos hacer es utilizar los registros internos del micro  para establecer los parámetros del timer y las interrupciones. Para ello tenemos que revisar la hoja de especificaciones del micro que estemos utilizando.  En nuestro caso, para el 16F630, dichos registros son OPTION_REG e INTCON.
  • La instrucción OPTION_REG = %11010101 permite utilizar un divisor  de 1/64 , lo que equivale a 16.384 milisegundos.
  • La instrucción INTCON  = %10100000 activa las interrupciones en general y la del reloj en particular.
  • La instrucción On Interrupt Goto tickint permite que cada vez que ocurra una interrupción se ejecute el codigo ubicado en la etiqueta tickint.
  • Revisando el código de la etiqueta tickint podemos ver los siguientes detalles:
    • Antes de la etiqueta tickint tenemos la instrucción DISABLE , ya que no queremos que ocurran otras interrupciones mientras estamos procesando la presente.
    • La instrucción INTCON.2 = 0 al final de la sección permite poner a cero el reloj
    • La instrucción RESUME permite regresar al código donde estabamos antes de la interrupción.
    • ENABLE habilita de nuevo las interrupciones
  •  En el lazo principal (mainloop) procesamos el valor de la variable update . Como tampoco queremos que ocurran otras interrupciones mientras ejecutamos este código, utilizamos las instrucciones INTCON = %10000000 e INTCON = %10100000 que deshabilita y habilita las interrupciones a partir del reloj interno.
En la literatura disponible en la web hay cierta confusión en relación a la ubicación de las instrucciones ENABLE y DISABLE .  En una subrutina lo lógico es que estas instrucciones estén dentro de la misma, pero en este caso no es una subrutina, por lo que su posición es diferente.

También debemos considerar que la interrupción se ejecuta entre instrucciones, por lo que si estamos ejecutando una instrucción particular, como SERIN/SERIN2 , la interrupción se procesará después de ejecutarse la misma.

lunes, 9 de marzo de 2015

Microcontroladores PIC

Mis primeras experiencias con microcontroladores fueron hace muchos años, y con la familia MCS-51 de la Intel (años aquellos). Después de mucho tiempo alejado del tema, volví a los micros a traves del Arduino. Que diferencia !!!
Arduino es un concepto  muy interesante y muy exitoso que trasciende los micros Atmel.
Parece dificil de creer, pero aunque había oido de los micros PIC de Microchip, no había tenido la oportunidad de "jugar" con ellos.
Recientemente me decidí  a probar las bondades de estos micros.
Y entonces me di cuenta de las diferencias entre el Arduino y la familia PIC.
Mi idea no es contribuir a la controversia entre PIC y Arduino. Creo que muchas veces lo que vemos en la red realmente no aporta ningún valor.
Mi opinión es que son dos conceptos diferentes, cada uno tiene sus ventajas y sus desventajas, que se manifestarán dependiendo del proyecto en cuestión.
Y el punto es ese, si podemos decidir, lo mas sabio es seleccionar el micro que mas se adecue a nuestras necesidades.
Entonces entremos en materia.
Para trabajar con un micro PIC debemos tener:
  • Un PC. En mi caso voy a trabajar con un portatil con el S/O windows Vista.
  • Un programador de PICS : Hay muchos en el mercado. Yo me decidí por un clon del PICKit2
  • Un programa para grabar el PIC : En mi caso viene con el programador
  • Un ambiente de desarrollo
  • Un micro PIC
Los tres primeros requisitos son los mas sencillos, pero los dos últimos son para meditar.
La razón es que en el mercado hay muchos ambientes de desarrollo y la empresa Microchip tiene una cantidad impresionante de diferentes micros.
En otra entrada detallaré mi experiencia con diferentes ambientes de desarrollo, sin embargo, por los momentos, me decidi por la combinación del IDE Micro Code Studio y el compilador PICBASIC Pro
En relación al micro, empecé por dos de la gama baja:
  • 12F675 : 8 pines, 1KW flash, 64B ram,128B rom, 6 puertos, 4 A/D 10 bits
  • 16F684 : 16 pines, 2KW flash, 128B ram, 256B rom, 12 puertos, 8 A/D 10 bits
Tal vez mi decisión parecerá muy modesta, pero siempre me ha interesado el sacar el máximo provecho de un micro, y mas importante, no deja de deslumbrame lo que podemos hacer con un micro de 8/16 pines !!!

El proyecto que voy a presentar tiene por objeto utilizar varias funcionalidades del 16F684:
  • Uso de pines digitales para encender/apagar leds
  • Comunicación serial a traves de cualquier pin
  • Generación de sonido mediante un altavoz conectado a un puerto digital
El programa utilizado (tomando como base aportes previos en la web) es el mostrado a continuación:

 
 
Un punto a tener en consideración del programa mostrado es que se trata de ordenar en secciones las diferentes funciones del mismo, lo cual le da "elegancia" y ayuda mucho a la hora de realizarle modificaciones.
Para poder utilizar la interfase serial debemos conectar un convertidor serial/usb a los puertos C.0 y C.1
Adicionalmente debemos hacer uso de un programa de comunicación serial en nuestro PC (uno muy utilizado es putty), sin embargo yo utilizo uno propio (MiniTerminal).

Podemos ver en la imágen el mensaje inicial del micro y la ejecución del comando r


El altavoz va conectado al pin C.5 mediante un condensador electrolítico de 10uF