domingo, 24 de mayo de 2015

Generador de números pseudoaleatorios en display de 7segmentos

Este proyecto,  desarrollado en PICBASIC PRO  para el micro 16F630, tiene por objeto mostrar en un display de 7 segmentos números pseudoaleatorios de 4 dígitos.
Para ello utilizamos la función RANDOM del compilador, la cual genera números de 16 bits ( 0 - 65635 ). Como disponemos de cuatro dígitos en el display, solo se mostrarán los primeros cuatro dígitos del número generado.

El programa se muestra a continuación:


Como tenemos que multiplexar los dígitos, utilizamos un lazo que muestra el número generado durante unos segundos. Luego mostramos cuatro guiones en el display para indicar que se va a generar un nuevo número.





domingo, 17 de mayo de 2015

Números pseudo aleatorios en microcontroladores

Los números aleatorios son importantes para temas como el encriptado de información y la generación de claves de acceso.
El obtener números aleatorios no es algo trivial, y para ello se requiere utilizar principios físicos como el ruido presente en componentes y circuitos electrónicos. Algo que por lo general es indeseable, en este caso tiene una utilidad práctica.
Si no contamos con circuitos externos no podemos obtener números aleatorios verdaderos.
Por lo general todos los compiladores incluyen un función que permite generar números pseudoaleatorios, es decir números que se aproximan pero no son estadísticamente aleatorios verdaderos. Estas funciones generan secuencias de números que después de cierto tiempo se repiten.
Como la generación de números aleatorios o pseudoaleatorios es importante para temas de seguridad, se han hecho muchos estudios al respecto, y hay disponible una gran cantidad de algoritmos en internet.
Es evidente que un algoritmo es mejor mientras la secuencia de números que genere esté mejor distribuida desde el punto de vista estadístico.
Uno de los algoritmos disponibles lo podemos ver en este programa en CCSC C para el micro 16F628A:



EL programa genera números enteros pseudoaleatorios de 32bits y el equivalente de punto flotante en el rango (0,1).
Si invocamos la función random1()  con un parámetro distinto a 0, este valor se toma como la semilla (seed).
Podemos ver que en la subrutina init() invocamos la función y utilizamos como parámetro el valor del timer 0, de esta forma nos aseguramos que cada vez que el circuito empieza a funcionar la semilla, y la sequencia de números generados, es diferente.
El valor de la semilla es muy importante, por lo que se han ideado muchos procedimientos para una selección de la misma. Además de la lectura del reloj interno podemos mencionar:
  • Al inicio leer una posición de memoria ram: En principio el valor no es predecible.
  • Guardar en memoria eeprom el valor del reloj interno al ocurrir algún envento específico (por ejemplo la lectura de información por el puerto serial). Al inicio se lee este valor y se utiliza como semilla.
Podemos ver una imagen donde tenemos cuatro sets de números : int32 y punto flotante generados por el algoritmo y un entero generado por la función incluida en el compilador.


La ventaja del algoritmo en relación a la función incluida en el compilador es que en lugar de generar un número entero de 16bits tenemos uno de 32bits, lo cual, en principio, nos asegura que la secuencia de números disponibles es mayor antes de que la misma se repita.

sábado, 16 de mayo de 2015

Matemáticas y microcontroladores

No tiene mucho sentido tratar de resolver problemas matemáticos utilizando microcontroladores. Para empezar, el uso básico de un microcontrolador es tomar decisiones en base a señales físicas (digitales o analógicas) y generar otras señales (digitales o analógicas). Por otro lado, los microcontroladores no incluyen coprocesador matemático, por lo que todas las funciones matemáticas se calculan mediante rutinas incluidas en los compiladores a utilizar.
Sin embargo, y seguramente sin ningún uso práctico, me parece interesante ver hasta donde podemos llegar con estos animalitos con tan pocos recursos de cálculo.
A continución podemos ver un programa (en lenguaje CCSC C) para el micro 16F628A que permite generar los números de fibonacci, lucas y el famoso coeficiente de oro (golden ratio). Aunque utilizamos variables enteras de 32bits, solo podemos calcular hasta el número 46. Podemos ver que el golden ratio se estabiliza muy rápidamente. Recordemos que este micro tiene apenas 2KWords flash y 224Bytes ram.
La primera columna es el contador , la segunda el número de fibonacci, la tercera el número de Lucas y la cuarta el godlen ratio.




Si quisieramos utilizar un micro mas modesto , por ejemplo el 16F630 ( que sólo tiene 1KWord flash y 64Bytes ram ) no podríamos calcular el golden ratio porque no tendríamos flash suficiente para el código generado (el cálculo en punto flotante consume casi 500Words).

A continuación tenemos otro programa (también en lenguaje CCSC C y para el 16F628A) que genera los valores de seno(x),coseno(x),tangente(x) y como validacion la fórmula sen(x)*sen(x)+cos(x)*cos(x),  que debe ser el número 1. Podemos ver que no utilizamos las subrutinas del compilador, en su defecto hemos creado unas a partir de aproximaciones Chebyshev para valores de x entre 0 y 45º. Estas aproximaciones son algo mas precisas que las que vienen en el compilador (en la última cifra significativa) y el código generado es mas pequeño.




martes, 7 de abril de 2015

Conexión de shift register 74LS595 a 16F676

Cuando utilizamos un micro como el 16F676 los puertos disponibles deben aprovecharse al máximo, ya que su  número es reducido.
En este proyecto queremos medir una señal analógica (fotodiodo) y mostrar el valor en un display cuadruple de 7 segmentos.
Para ahorrarnos puertos podemos utilizar un registro de desplazamiento serial a paralelo (shift register) , en este caso el 74LS595, con el objeto de controlar los siete segmentos del display. La información se envia en modo serial al 74LS595 y este lo distribuye a los 7 segmentos. De esta forma en lugar de utilizar 7 pines utilizamos 3.

Los cuatro primeros pines del puerto C del micro se utilizan para seleccionar el display que corresponda, ya que vamos a utilizar multiplexado, es decir , seleccionamos un display y enviamos el dígito  respectivo, y asi en un ciclo sin fin.

A continuación tenemos el  programa en PICBASIC PRO:

 
 
La señal analógica proveniente del fotodiodo se lee diez veces para obtener un valor promedio.
Es importante comentar que se llama a la subrutina display en el lazo de lectura analógica ya que tenemos que refrescar el display.

La subrutina look determina que pines se encienden/apagan dependiendo del dígito a mostrar. Luego se utiliza la instaruccion Shifout para enviar el byte con la información al 74LS595. Los valores presentes en la instrucción Lookup corresponden a las conexiones entre las salidas del 74LS595 y los pines de los siete segmentos del display para cada dígito 0,1,2,3...9.

En la imagen el proyecto en protoboard:


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