Usando Macros

March 18, 2008 at 5:23 pm | Posted in HowTo, Tutorial | 10 Comments

El uso de subrutinas lo vimos por primera vez en el tutorial Encendiendo y apagando LED’s… ahora con retardo! Ahí se vio la manera en la que se llama y se regresa de las subrutinas. También se dijo que el empleo de subrutinas hacía el código más entendible, otra forma de hacer el código entendible es mediante el uso de Macros.

Las macros son de alguna forma similares a las subrutinas ya que son conjuntos de intrucciones que se ejecutan de manera secuencial mediante una llamada a una orden de ejecución, sin embargo tiene diferencias muy significativas. Mientras que una subrutina aparece una sola vez en el código, cada vez que se “invoca” una macro se inserta el código de esta en el programa. Otra diferencia es que a una macro se le pueden especificar parámetros de entrada y a una subrutina no.

Lea el artículo completo en el blog Circuitos electronicos.

Advertisements

Cómo multiplexar una matriz de leds

January 5, 2008 at 12:48 pm | Posted in Multiplexación, Rutinas, Tutorial | 47 Comments

Ya empezó un nuevo año así que vamos a empezar con un nuevo tutorial, esta vez con un cómo sobre multiplexación, cómo multiplexar una matriz de leds.

Si se quisiera controlar una sola columna de una matriz de 5×7 leds se necesitaría un puerto completo de un pic, 7 pines para controlar las filas y 1 para controlar la columna, eso significa que para controlar todos los leds de la matriz se necesitarían 4 puertos de 8 bits, demasiado para un microcontrolador, sobre todo para un 16F628a.

Para reducir el número de pines requeridos las cinco columnas de la matriz son multiplexadas, esto significa que solamente se necesitarán siete pines, uno por cada fila de la matriz, y cinco para habilitar cada una de las columnas.

Lea el artículo completo en el blog Circuitos electronicos.

Temporizador Timer 2

June 24, 2007 at 11:45 pm | Posted in Tutorial | 8 Comments

El Timer 2 es un temporizador de 8 bits que tiene la particularidad de tener un preescalador y un post-escalador. Además este módulo cuenta con un registro de periodo PR2 que marca el valor máximo que puede alcanzar la cuenta del registro TMR2. A diferencia de los otros temporizadores, el temporizador Timer 2 no incrementa su cuenta hasta llegar a 0xFF y después al desborde sino que incrementa su cuenta desde 0x00 con cada ciclo de instrucción hasta que el valor del registro TMR2 coincide con el del registro PR2 y después, en el siguiente ciclo reinicia la cuenta desde 0x00.

Este módulo cuenta con un preescalador y un post-escalador. El preescalador tiene la misma función que en los otros dos timers y sirve como divisor de frecuencia antes de cada incremento.

Lea el artículo completo en el blog Circuitos electronicos.

Temporizador Timer 1

June 24, 2007 at 8:17 pm | Posted in Tutorial | 9 Comments

El Timer 1 es un módulo temporizador/contador de 16 bits, que consiste en dos registros de 8 bits (TMR1H y TMR1L) que son de lectura y escritura. Este módulo incrementa su cuenta desde 0x000 hasta 0xFFFF y al desbordarse vuelve a 0x0000. Al presentarse el desborde la bandera de interrupción TMR1IF se pone a 1 y, si está habilitada, la interrupción se presenta.

Este módulo al igual que el Timer 0 puede funcionar en modo temporizador y en modo contador. En modo temporizador el par de registros TMR1 se incrementa en cada ciclo de instrucción, este modo se selecciona poniendo a 0 el bit TMR1CS del registro T1CON. En modo contador el par de registros TMR1 se incrementa en cada flanco ascendente de una señal de reloj externa, este modo se selecciona poniendo a 1 el bit TMR1CS del registro T1CON.

El preescalador del Timer 1 tiene un valor máximo de 8 y se selecciona con los bits T1CKPS1:T1CKPS0 de la siguiente manera:

Lea el artículo completo en el blog Circuitos electronicos.

Temporizador Timer 0

June 24, 2007 at 12:33 pm | Posted in Tutorial | 11 Comments

El Timer 0 es un modulo temporizador/contador de 8 bits que cuenta con un preescalador programable también de 8 bits. Puede funcionar como temporizador o como contador. En modo temporizador el valor del registro TMR0 se incrementa con cada ciclo de instrucción (o cada X ciclos dependiendo del preescalador). En modo contador el valor del registro TMR0 se incrementa en cada flanco (ascendente o descendente) del pin RA4/T0CKI. En ambos casos al desbordarse (pasar de 0xFF a 0x0) el registro TMR0 la bandera de interrupción del timer 0 (bit T0IF del registro INTCON) se pone a 1.

El modo temporizador se selecciona poniendo a cero el bit T0CS del registro OPTION. Poniendo a uno ese bit el modulo trabaja en modo
contador
, en este modo de operación además se debe seleccionar si el incremento se producirá en cada filo ascendente o descendente, al poner a cero el bit T0SE del registro OPTION se selecciona el filo ascendente.

El preescalador es compartido por el Timer 0 y por el Watchdog. Se asigna a un módulo o a otro mediante el bit PSA del registro OPTION. Poniendo el bit a 1 el preescalador se asigna al Watchdog y poniendolo a 0 el preescalador se asigna al Timer 0. El valor del preescalador se selecciona con los bits PS2:PS0 de la siguiente manera:

Lea el artículo completo en el blog Circuitos electronicos.

Binario a BCD – Recorre y Suma+3

June 21, 2007 at 4:25 pm | Posted in Ensamblador, Rutinas, Tutorial | 41 Comments

Numero Binario de 8 bits a BCD mediante el algoritmo Recorre y Suma+3

En la entrada anterior se encuentra una rutina para convertir un numero Binario de 8 bits a BCD empleando un metodo de division po restas sucesivas. En esta ocasion presento una rutina para lograr la misma conversion de Binario a BCD empleando el algoritmo Recorre y Suma+3.

El algoritmo funciona de la siguiente manera:

  • Recorre 1 bit a la izquierda el numero binario.
  • Si se han hecho 8 corrimientos, el numero BCD se encuentra en las columnas CENTENAS, DECENAS y UNIDADES.
  • Si el valor binario de cualquiera de las columnas BCD es 5 o mayor, se suma 3 al valor en esta columna BCD.
  • Si se desea convertir un byte despues de haber efectuado 8 corrimientos la conversion ha finalizado, para 2 bytes se necesitarian 16 y asi sucesivamente.

Lea el artículo completo en el blog Circuitos electronicos.

Conversion Binario a BCD – Convertir un numero de 8 bits

June 21, 2007 at 9:41 am | Posted in Ensamblador, Rutinas, Tutorial | 17 Comments

Convertir un numero Binario de 8 bits a BCD

El Codigo binario decimal (BCD) es un codigo para numeros decimales en el que cada digito es representado por su propia secuencia binaria. Su principal ventaja es que permite una conversion facil a digitos decimales para su despliegue y permite tambien realizar calculos decimales mas rapidos.

Aqui se presenta una rutina para convertir un numero binario a BCD, precisamente un numero de 8 bits (1 byte) a su equivalente BCD. El valor maximo de un byte es 0xFF = 255, asi que al convertir un numero binario de 8 bits se obtienen 3 digitos BCD.

Esta rutina convierte el numero binario a su equivalente BCD empaquetado. El resultado de la conversion del numero binario a BCD ocupa un byte y medio y se representa en las variables de memoria BCDH y BCDL. El numero binario a convertir debe estar almacenado en la variable BIN.

Lea el artículo completo en el blog Circuitos electronicos.

Manejo de Interrupciones

June 8, 2007 at 4:47 pm | Posted in Rutinas, Tutorial | 20 Comments

Una interrupción es un evento que hace que el microcontrolador deje de ejecutar la tarea que está realizando para atender dicho acontecimiento y luego regrese y continue la tarea que estaba realizando antes de que se presentara la interrupción. El pic 16F628 (y el 16F628A) tiene 10 fuentes de interrupción, si las interrupciones están habilitadas cada vez que una de estos acontecimientos se presente el pic dejará de ejecutar el programa para ir a atender la interrupción y al termino de la misma continuará ejecutando el programa donde lo había dejado. Las fuentes de interrupción son:

  • Interrupción externa RB0/INT
  • Interrupción por cambio lógico en el puerto B (pines RB7 a RB4)
  • Interrupción por desborde del timer 0 (TMR0)
  • Interrupción por desborde del timer 1 (TMR1)
  • Interrupción por comparación exitosa exitosa en TMR2
  • Interrupción del comparador
  • Interrupción del transmisor del USART
  • Interrupción del receptor del USART
  • Interrupción del módulo CCP
  • Interrupción del EEPROM

Aunque el pic cuenta con 10 fuentes distintas de interrupción solamentetiene un vector de interrupción por lo que si se habilitan varias interrupciones al momento de presentarse cualquiera de ellas el programa saltara a la misma rutina de interrupcion y es responsabilidad del programador crear una rutina que identifique la fuente de la interrupcion.

Lea el artículo completo en el blog Circuitos electronicos.

Leer botones e interruptores

April 13, 2007 at 10:25 pm | Posted in HowTo, Rutinas, Tutorial | 15 Comments

Ya hace casi un mes y medio desde la última entrada, había estado ocupado con la escuela y por esa razón dejé un poco de lado este proyecto, pero ahora para continuar un poco por donde íbamos vengo con una nueva entrada, ahora sobre leer botones e interruptores.

Los botones e interruptores son dispositivos que nos sirven para introducir datos a algun sistema eléctrico o electrónico. Leer botones (e interruptores) es una tarea muy sencilla, solamente hay que tener en cuenta que estos, al ser dispositivos mecanicos, no cierran (ni abren) instantaneamente sino que presentan un fenomeno conocido como rebote, que no es otra cosa mas que un ruido electrico que genera errores en al detectar que se presionó un botón y que hace que parezca que el botón se presiono muchas veces.

Teniendo en cuenta eso podemos programar algunas rutinas anti-rebotes con el pic. Dos maneras sencillas de lograrlo son: crear un ciclo para verificar el estado de un bit y no salir de este hasta que el estado sea estable; o verificar el estado de un bit, llamar a un retardo (de alrededor de 10ms, aunque este retardo depende del tipo de interruptor y no es un valor fijo) y despues volver a verificar el estado del bit, si el estado es el mismo entonces el boton se presiono.

Lea el artículo completo en el blog Circuitos electronicos.

Instalar MPLAB en Ubuntu 6.06

March 1, 2007 at 8:40 am | Posted in HowTo, MPLAB, Tutorial | 34 Comments

Este es un pequeño tutorial para todos aquellos que utilicen Linux y se vean en la necesidad de usar el ambiente de desarrollo MPLAB. Está basado en una excelente guía de William Spinelli (Installing MPLAB on Ubuntu 6.06) con algunas pequeñas correcciones. La instalacion de MPLAB se hara a traves de Wine y WineTools, se instalara la version 7.31 (aun no he probado si la version 7.50 o 7.51 se pueden instalar mediante este proceso) en la version 6.06 de Ubuntu.

Instalar Wine

Como la version de Wine que se encuentra en el repositorio (0.9.12) no soporta la instalacion de Internet Explorer 6 (IE6) usando WineTools, la instalacion se hace en dos pasos: primero se instala una version antigua de Wine (0.9.8) y despues se actualiza a la ultima version disponible.

Primero se debe instalar la version antigua de Wine
 $ wget http://umn.dl.sourceforge.net/sourceforge/wine/wine_0.9.8-winehq-1_i386.deb
 $ dpkg -i wine_0.9.8-winehq-1_i386.deb

Lea el artículo completo en el blog Circuitos electronicos.

Next Page »

Create a free website or blog at WordPress.com.
Entries and comments feeds.