Cartel

Cartel de Leds en ASM Posted on 14 Septiembre, 2010 by Suky Aquí voy a mostrar una forma sencilla de hacer un cartel de

Views 418 Downloads 0 File size 588KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Cartel de Leds en ASM Posted on 14 Septiembre, 2010 by Suky

Aquí voy a mostrar una forma sencilla de hacer un cartel de leds en asm que tendrá algunas limitaciones, pero entendiendo como es el funcionamiento y el esfuerzo de ustedes

podrán

romper

esas

barreras!

Para mostrar un ejemplo sencillo vamos a usar una tabla para guardar el mensaje a mostrar y una sola variable (8 bits) para indicar el largo y control de la posición a enviar. Por ello el largo del mensaje estará restringido a 255 bytes que se reducen en 6 por

la

La

forma

posición de

de

guardar

la cada

tabla letra

en del

la

memoria mensaje

será

de

programa.la

siguiente:

Cada byte indica una columna de la letra, donde un 0 es led apagado y 1 led encendido. Nota: Es una forma de hacerlo, la cual la aprendí del amigo BrunoF en uno de sus tantos aportes Luego el mensaje puede ser mayor al cartel utilizado para mostrarlo así que es necesario efectuar un desplazamiento del mensaje sobre el cartel o lo que es lo mismo desplazar el cartel sobre el mensaje. Para ello se utilizará una variable que indica la posición inicial dentro del mensaje, en la cual comienza a mostrarse en el cartel. Como deseamos que el mensaje sea rotativo el problema se presenta en las últimas posiciones donde se debe mostrar la parte final del mensaje y empezar a mostrar el inicio Lo que hacemos es dividir en 2 la forma de mostrar el mensaje, cuando Posición Inicial + Largo del Cartel sea menor a Largo del mensaje y cuando sea mayor:

Bueno, más o menos se ha explicado como vamos a trabajar con el mensaje, ahora se debe entender como va a funcionar el multiplexo de los leds. Vamos a realizar la multiplexación por filas, ósea que vamos a seleccionar una fila y vamos a actualizar sus valores por medio de registros de desplazamientos. El tiempo de actualización no debe superar los 20ms! Para actualizar usaremos una variable que indique que fila ha de actualizarse, por ejemplo para actualizar la fila uno la variable FilaActual será 00000001. Ahora para saber que valores tenemos que mandar a los registros de desplazamiento iremos tomando cada una de las columnas (PosicionEnviar) a actualizar, aremos un AND con FilaActual y determinaremos si enviar un 1 o un 0.( PosicionEnviar (AND) FilaActual ) = FilaActual? Si -> Enviamos un 1 No-> Enviamos un 0 Hardware para simulación:

; CARTEL DE LEDS. de 32x8. ; Si las letras son de 8x8, maxima cantidad de letras en el mensaje 31.; **** Encabezado **** list p=16F628A ; Microcontrolador utilizado.#include P16F628A.inc ; Definicion de registros SFR.__CONFIG _HS_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF & _MCLRE_ON & _BOREN_OFF & _LVP_OFF & _DATA_CP_OFF ;**** Definicion de Variables **** CBLOCK 0x20

; En esta posicion se declaran los registros de usuario

(GPR) STATUS_Temp W_Temp

; Registro para guardar temporalmete STATUS

; Registro para guardar temporalmete W

Banderas FilaActual

; Registro para almacenar banderas.; Fila Actual a refrescar.-

PosicionInicial ; Posicion inicial dentro del mensaje a visualizar en el cartel.- (Entre 0 y LargoMsj-1) PosicionEnviar ; Posicion del registro a enviar.CuentaRefrescos ; Cuenta la cantidad de refrescos realizados. LargoCartel ; Guarda largo del cartel.- 32 LargoMsj ; largo del mesaje a visualizar-> Max 249 Bytes.-Para aumentar modificar manejo de tabla.TempH

; Temporal para guardar calculos matemáticos.-

TempL

; Temporal...

VelMovimiento ; Para fijar velocidad de movimiento.ENDC Velocidad

equ d'4' ; Para fijar velocidad de desplazamiento.-

kbhit_tiempo equ 0

; Bandera que indica que han pasado 2ms.-

kbhit_cuadro equ 1 BData BClock

equ 0 equ 1

Strobe

equ 2

;**** Inicio del Microcontrolador **** Reset org

0x00

goto Inicio

; Salto a inicio del programa.-

;**** Vector de Interrupcion **** org 0x04 goto Inicio_ISR

; Atiendo Interrupcion.-

;**** Mensaje a Mostrar ***** org 0x05

Mensaje addwf PCL,1 ; Se incrementa el contador del programa.DT 0x38, 0x7C, 0xFE, 0x82, 0x82, 0x82, 0x44, 0x00 ; C DT 0x60, 0xF4, 0x94, 0x94, 0xFC, 0xF8, 0x00, 0x00 ; a DT 0xFC, 0xFC, 0x08, 0x04, 0x04, 0x00, 0x00, 0x00 ; r DT 0x04, 0xFE, 0xFE, 0x84, 0x40, 0x00, 0x00, 0x00 ; t DT 0x78, 0xFC, 0x94, 0x9C, 0x58, 0x00, 0x00, 0x00 ; e DT 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ; l DT 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ; Espacio DT 0x78, 0xFC, 0x84, 0x48, 0xFE, 0xFE, 0x00, 0x00 ; d DT 0x78, 0xFC, 0x94, 0x9C, 0x58, 0x00, 0x00, 0x00 ; e DT 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ; Espacio DT 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ; l DT 0x78, 0xFC, 0x94, 0x9C, 0x58, 0x00, 0x00, 0x00 ; e DT 0x78, 0xFC, 0x84, 0x48, 0xFE, 0xFE, 0x00, 0x00 ; d DT 0x88, 0x9C, 0x94, 0xF4, 0x64, 0x00, 0x00, 0x00 ; s DT 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ; Espacio DT 0x8C, 0x9E, 0xFE, 0xFA, 0x62, 0x00, 0x00, 0x00 ; S DT 0x7C, 0xFC, 0x80, 0x80, 0xFC, 0xFC, 0x00, 0x00 ; u DT 0xFE, 0xFE, 0x10, 0x38, 0x64, 0xC4, 0x80, 0x00 ; k DT 0x04, 0x8C, 0xB8, 0x70, 0x30, 0x08, 0x04, 0x00 ; y DT 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ; Espacio DT 0x82, 0xC1, 0xA1, 0x91, 0xCE, 0x00, 0x00, 0x00 ; 2 DT 0x80, 0x86, 0x85, 0x89, 0x71, 0x00, 0x00, 0x00 ; 5 DT 0xC0, 0x3C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00 ; / DT 0x81, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00 ; 1 DT 0x7E, 0x81, 0x81, 0x81, 0x7E, 0x00, 0x00, 0x00 ; 0 DT 0xC0, 0x3C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00 ; / DT 0x7E, 0x81, 0x81, 0x81, 0x7E, 0x00, 0x00, 0x00 ; 0 DT 0x8E, 0x91, 0x51, 0x71, 0x1E, 0x00, 0x00, 0x00 ; 9 DT 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ; Espacio ;**** Programa principal **** Inicio ;---- Configuraciones ---bsf

STATUS,RP0 ; Banco 1.-

movlw 0xF8 movwf TRISA ;eeeeesss movlw 0x00 movwf TRISB ;ssssssss movlw 0xDF movwf OPTION_REG ; Pull-Up deshabiltado, , Timer0|interno, 1:1 bcf STATUS,RP0 ; Banco 0.-

movlw 0x07

; Configuro Comparador Analogico

movwf CMCON ; V1in-=GND, V1in+=GND, C1out=Off| V2in-=GND, V2in+=GND, C2out=Off clrf

PORTA

clrf PORTB movlw 0x4D movwf T2CON ; Timer2: Pre=1:4, Post=1:10 movlw Velocidad

; Cargamos velocidad de desplazamiento.-

movwf VelMovimiento movlw d'32' ; Cargamos largo del cartel.movwf LargoCartel movlw d'232'

; Cargamos largo del mensaje.-

movwf LargoMsj clrf PosicionInicial clrf

Banderas

movlw 0x01 movwf FilaActual movlw 0x08 movwf CuentaRefrescos clrf

PIR1

; Limpiamos Banderas

bsf

STATUS,RP0 ; Banco 1.-

bsf

PIE1,TMR2IE ; Habilitamos interrupcion por Timer2

bcf

STATUS,RP0 ; Banco 0.-

bsf bsf

INTCON,GIE ; Habilitacion general de interrupciones INTCON,PEIE ; Habilitacion de interrupciones Perifericas

Bucle btfss Banderas,kbhit_tiempo ; Se espera a que pasen 2 ms.goto $-1 bcf Banderas,kbhit_tiempo call ActualizarCartel ; Se actuliza fila del cartel.goto Bucle

;************************************************************************** ;**** Rutina de servicio de Interrupcion **** Inicio_ISR ;---- Guardado de registro W y STATUS ---movwf W_Temp ; Copiamos W a un registro Temporario swapf STATUS,W ; Invertimos nibles de STATUS

movwf STATUS_Temp ; Guardamos STATUS en un registro temporal ;---- Interrupciones ---btfsc PIR1,TMR2IF ; Interrupcion por Timer2? goto ISR_TIMER2 ; Si, se trata interrupcion ;............................. Fin_ISR ;---- Restauramos los valores de W y STATUS ---swapf STATUS_Temp,W movwf STATUS swapf W_Temp,f swapf W_Temp,W retfie ;....................... ISR_TIMER2 ; Tratamiento de Interrupcion decfsz CuentaRefrescos,1 ; Se refrescaron las 8 filas (Momento adecuado para realizar algun cambio.-) goto SetBandera ; No, seguimos.. decfsz VelMovimiento,1 ; Si, ya pasaron 16ms x VelMovimiento? goto RecargarData ; No, seguimos... movlw Velocidad ; Recargamos Velocidad movwf VelMovimiento incf

PosicionInicial

; Si, incrementamos PosicionInicial para efectuar

"movimiento" movfw LargoMsj

; Verificamos si ya se llego al final del Mensaje.-

subwf PosicionInicial,0 btfss STATUS,Z goto RecargarData clrf

PosicionInicial

; No, seguimos.. ; Si, reseteamos PosicionInicial.-

RecargarData movlw 0x01 movwf FilaActual movlw 0x08 movwf CuentaRefrescos SetBandera bsf

Banderas,kbhit_tiempo ; Indicamos que han pasado 2 ms, y es

necesario actualizar.bcf

PIR1,TMR2IF ; Borramos bandera

goto Fin_ISR ;....................... ;************************************************************************* ActualizarCartel

; Es (PosicionInicial + LargoCartel