viernes, 18 de marzo de 2011

Manejando Display 7-seg

Ahora mostrare un sencillo programa que muestra una cuenta ascendente de cuatro dígitos, que se almacenan en memoria (CUENTA1:CUENTA2:CUENTA3:CUENTA4), en 4 displays de 7-segmentos.

Link Programa

Agregaremos una macro más a nuestro archivo macros.inc:

MACRO

MOVIF toma un inmediato (@1) y lo guarda en una posición de memoria (@0).

El programa tiene dos rutinas, una llamada muestra y otra llamada incrementa.

Muestra toma cada dígito y lo envía a su respectivo display. También genera un retardo antes de pasar el siguiente display, ya que esto permite visualizar el dígito.

Incrementa va aumentando en 1 el valor de la cuenta, la cuenta será de 0-9999.

prog1

prog2

El circuito en el cual se usan displays con ánodo común es el mostrado abajo.

DISPLAY

En el siguiente vídeo se muestra la simulación del programa, aunque no se aprecia muy bien debido al programa de captura.


lunes, 7 de marzo de 2011

ADC - Analog-to-digital Converter

El ADC en los ATmega, cómo en otros uC´s de 8bits, tiene una resolución máxima de 10bits. Dependiendo de el uC se encontrara un número diferente de canales simples o diferenciales.
La formula clásica para convertir el valor que se obtiene de los registros ADCH:ADCL es:

Vin=5*(ADCH:ADCL )/1024

5/1042 es aproximadamente 48828e-7, entonces Vin=((ADCH:ADCL )*48828)e-7.

Ahora mostrare un ejemplo de la configuración del ADC en un ATmega324P.
Agregaremos unas macros a las nuestro archivo macros.inc:

macros

La macro “PUTM” no hace otra cosa que obtener el valor de una posición de la ram y enviarlo al LCD.
Las otras dos macros realizan una multiplicación como es indicado. Estas se usan para multiplicar ((ADCH:ADCL )*48828).
También se ha usado una rutina para convertir el resultado de la multiplicación a código ascii, esto es para poderlo mostrar en el lcd.

ascii

Antes de llamar a esta rutina Z debe apuntar al dato que se quiere convertir (LSB), Y debe apuntar a la posición de la ram donde se quiere guardar los datos en ascii (MSB).

El programa principal es el siguiente:





SELEC_CH recibe en R16 el canal que se muestreara, luego de escoger el canal se habilita el conversor (ADEN) y se inicia la conversión (ADSC).
ESPERA_ADC esperará hasta el final de la conversión.
CALCULA_VOL obtiene los 10 bits de la conversión en R17:R16 y lo multiplica con R19:R18=48828, luego ese valor convertido la convierte a código ascii y lo pone en la ram (Y=0x0100).
El resultado de la simulación es el mostrado:

fig1

En la ram se puede ver uno de los valores en ascii (000023486268=23486268). La coma decimal debe correr 7 posiciones (debido al factor e-7), entonces el voltaje es 2.34862.


martes, 1 de marzo de 2011

“delay_ms(ms)” y “delay_us(us)” para cualquier frecuencia

En un post anterior mostré como generar una rutina de retardos en milisegundos, ésta rutina funcionaba muy bien pero el problema era volver a calcular valores para una frecuencia diferente.
Ahora mostrare otra rutina que junto con sus macros permiten tener retardos en milisegundos y microsegundos, pero a diferencia de la anterior ya no hay que calcular valores para generar los retardos, solamente se deberá cambiar la frecuencia a la cual se trabajara (F_CPU).

Esta rutinas pueden soportar valores de 0-65535. Descarga

Las rutinas y las macros son las siguientes:

macros

retardo

Su uso es muy sencillo, aquí se muestra:

main

Los resultados los puede ver en la parte izquierda del simulador.

cpu

Espero éste sencillo ejemplo les sea útil.