Sunteți pe pagina 1din 28

CONTROL MOTOR PASO A PASO

INTERRUPCIONES






PARA Q NO QUEDE PRENDIDO EL BIT 4 DE RB
BORRAR EL PUERTO PORTB ANTES DE BCF INTCON,1


CONTADOR BINARIO
ANTES LIMPIAR EL PORTB


TIMER 0
MODO TEMPORIZADOR
GENERAR UNA ONDA CUADRADA DE 1KHZ


CALCULANDO TMRO PARA 500MSEGUNDOS













OTRO EJEMPLO




FORMULA PARA CALCULAR TMR0



MODO CONTADOR



Como hacer una temporizacin con el registro TMR0
El tiempo empleado en una temporizacin se puede calcular a partir de un ciclo de
instruccin (es decir 1 instruccin por cada microsegundo, si estas trabajando con
un XT de 4 Mhz), tambin necesitas el valor del Divisor de Frecuencia (el que
seleccionabas con los Bit's PS2, PS1 y PS0), y finalmente con el complemento del
valor cargado en TMR0 (es decir 255-TMR0), la ecuacin que te permite realizar
el clculo es la que sigue...
Temporizacin = Ciclo de instruccin * (255-TMR0) * Divisor de Frecuencia
Vemos un ejemplo...???

Suponte que deseas una temporizacin de 10 ms (10 milisegundos), que ests
trabajando con un XT de 4 Mhz, y que a dems seleccionaste como Divisor de
frecuencia 256 (es decir PS2,PS1,PS0 = 1,1,1).

Pregunta... (como en el secundario...)

Cul es el valor que se debe cargar en TMR0...???

Lo arreglaremos con un pasaje de trminos...
255-TMR0 = Temporizacin(en microsegundos)/(1 ciclo/us * Div. de
Frec.)

y reemplazando tendrs...

255-TMR0 = 10000 us/(1 ciclo/us * 256)
255-TMR0 = 10000 /(256 ciclos)
255-TMR0 = 39,0625 ciclos
255-TMR0 ~ 39 ciclos
Eso significa que en TMR0 debers cargar 255-39=216 (0xD8 en hexa) y a partir
de all el TMR0 contar los 39 ciclos que faltan para desbordarse y producir la
interrupcin, y el tiempo que tardar en hacerlo es aproximadamente 10000 us, o
sea 10 ms.

Antes de seguir, despejemos un par de dudas:

1 seg. = 1000 ms = 1000000 us y ...
1 ciclos/us es el tiempo empleado en ejecutarse una instruccin

ok..., sera bueno que me confirmes si la mayor temporizacin que se puede
obtener haciendo uso de este registro es 0,06528 segundos, ser...??? ah
queda...!!!

Lo que haremos ahora, ser codificar el ejemplo visto anteriormente, pero una vez
producida la interrupcin encendemos un LED, luego volvemos, temporizamos 10
ms y en la prxima interrupcin, lo apagamos, es decir, el LED parpadear cada 10
ms, como es obvio, no lo vamos a notar, as que slo lo simularemos en MPLAB,
(en realidad si se nota, luego te cuento como).

Bien, el cdigo es el siguiente...
;---------------Encabezado-------------

LIST P=16F84
#include <P16F84.INC>

;-------Configuracin de puertos-------

ORG 0x00
GOTO inicio

ORG 0X04 ; Atiendo la interrupcin
BTFSS PORTB,0 ; si el LED est apagado
GOTO LED ; voy a LED y lo enciendo
BCF PORTB,0 ; sino apago el LED
BCF INTCON,2 ; limpio la bandera T0IF
RETFIE ; regreso habilitando la
interrupcin
LED BSF PORTB,0 ; enciendo el LED
BCF INTCON,2 ; borro la bandera T0IF
RETFIE ; regreso habilitando la
interrupcin

inicio BSF STATUS,5 ; configurando puertos
CLRF TRISB ; puerto B es salida
MOVLW 0x07 ; cargo w con 00000111
MOVWF OPTION_REG ; el Divisor = 256
BCF STATUS,5

MOVLW 0XA0 ; cargo w con 10100000
MOVWF INTCON ; habilitamos GIE y T0IE
CLRF PORTB ; limpiamos PORTB

tiempo MOVLW 0XD8 ; cargo w con 216
MOVWF TMR0 ; lo paso a TMR0
NADA BTFSC TMR0,7 ; me quedo haciendo nada
GOTO NADA ; hasta que TMR0 desborde, y
entonces
GOTO tiempo ; volver a cargar TMR0

;------------------------------------------
END
;------------------------------------------
Aqu vamos...

ORG 0X04 ; Atiendo la interrupcin

Aqu vendremos cuando se desborde el TMR0, es decir cuando se produzca la
interrupcin y no haremos una ISR aparte como lo hicimos anteriormente,
atenderemos la interrupcin directamente aqu.

El cdigo que sigue es como dice el comentario, se trata de verificar si RB0 est a 1
(es decir si el LED esta encendido), y como de comienzo no lo est, ir a GOTO
LED, ah lo enciende, luego...

BCF INTCON,2 ; limpio la bandera T0IF

Esto es lo que debemos tener en cuenta para salir de una interrupcin, borrar la
bandera que indica al micro que hubo una interrupcin, o nos quedaremos siempre
en la rutina de servicio. Finalmente con...

RETFIE

habilitamos nuevamente la interrupcin.

Pasemos ahora a la etiqueta inicio, lo primero que haremos ser cambiar de banco
y luego configurar el puerto B como salida, y aqu viene lo nuevo...

MOVLW 0x07 ; cargo w con 00000111
MOVWF OPTION_REG ; el Divisor = 256

Veamos que Bit's estamos configurando en OPTION_REG

Los Bit's 7 y 6 no los utilizamos por ahora, T0CS=0 (TMR0 es temporizador),
T0SE=0 (no se usa), PSA=0 (Prescaler asignado a TMR0), PS2,PS1,PS0=1,1,1
(Prescaler es 256), en conclusin 00000111=0x07 y es lo que cargamos en el
registro OPTION.

Ahora cambiamos de banco y habilitamos las interrupciones GIE, y en
especial T0IE, que es la interrupcin por desbordamiento del registro TMR0,
luego...

CLRF PORTB ; limpiamos PORTB

Lo que viene ahora es preparar la temporizacin, y de los clculos que hicimos
debamos cargar 216 en TMR0 y a partir de ah esperar a que este registro se
desborde y produzca la interrupcin, entonces hacemos eso justamente...

tiempo MOVLW 0XD8 ; cargo w con 216
MOVWF TMR0 ; lo paso a TMR0

tiempo es la etiqueta en donde cargar el registro TMR0 cada vez que quiera hacer
una temporizacin, y 0xD8 es 216 en hexadecimal

NADA BTFSC TMR0,7 ; me quedo haciendo nada
GOTO NADA ; hasta que TMR0 desborde, y entonces
GOTO tiempo ; volver a cargar TMR0

La verdad es que ya no tengo nada que hacer, sino esperar a que desborde el
TMR0, as es que hice un bucle al cuete, con BTFSC TMR0,7 estas probando si el
Bit7 de TMR0 est a 0, y como ya sabemos que estar a 1, pues ah te quedas
dando vueltas en ese bucle mientras el tiempo pasa, hasta que de repente se
produce una interrupcin, luego vas, la atiendes y cuando regresas caes en...

GOTO tiempo ; volver a cargar TMR0

para que comiences a temporizar nuevamente, es decir recargar TMR0 con 216
para luego quedarte en el bucle a esperar la interrupcin.

Ahora pasemos a lo mejor de todo esto, La simulacin en MPLAB, all vamos...


7 SEGMENTOS CON TABLA

;************************************ Display_03.asm
************************************
;
;
===============================================================
====
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE
PROYECTOS"
; E. Palacios, F. Remiro y L. Lpez.
; Editorial Ra-Ma. www.ra-ma.es
;
===============================================================
====
;
; Por el display de 7 segmentos conectado al Puerto B se visualiza una
de las 26 letras
; del alfabeto internacional: de la "A" a la "Z". La letra a
visualizar lo determina el
; orden ledo por el Puerto A. As por ejemplo:
; - Si por el Puerto A se lee "---0000" (cero) la letra visualizada
ser la "A"
; que es la que est en el orden cero.
; - Si por el Puerto A se lee "---1101" (veinticinco) la letra
visualizada ser la "Z"
; que es la que est en el orden veinticinco.
;
; Por ahora no se contempla la posibilidad que el nmero de entrada
sea mayor de 25.
;
; ZONA DE DATOS
**********************************************************************

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>

; ZONA DE CDIGOS
********************************************************************

ORG 0 ; El programa comienza en la
direccin 0.
Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
clrf TRISB ; Las lneas del Puerto B se
configuran como salida.
movlw b'00011111' ; Las 5 lneas del Puerto A se
configuran como entrada.
movwf TRISA
bcf STATUS,RP0 ; Acceso al Banco 0.
Principal
movf PORTA,W ; Lee la entrada.
call Letra_a_7Segmentos ; Convierte a 7 Segmentos.
movwf PORTB ; Resultado se visualiza por el
puerto de salida.
goto Principal

; Subrutina "Letra_a_7Segmentos" -------------------------------------
-------------------
;
Letra_a_7Segmentos
addwf PCL,F
InicioTabla
DT 77h, 7Ch, 39h, 5Eh, 79h, 71h, 6Fh, 76h, 19h, 1Eh, 7Ah,
38h, 37h
DT 54h, 3Fh, 73h, 67h, 50h, 6Dh, 78h, 1Ch, 3Eh, 1Dh, 70h,
6Eh, 49h
FinTabla
END

;
===============================================================
====
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE
PROYECTOS"
; E. Palacios, F. Remiro y L. Lpez.
; Editorial Ra-Ma. www.ra-ma.es
;
===============================================================
====


Display de 7 SEGMENTOS CON CORRIMIENTO

Parece que esto del Mythology no es lo mo, siempre pierdo...!!!, en fin, veamos
con que vamos a seguir...

Ah..!!, si..., vieron que interesante fue lo anterior...?, bueno, con las 8 salidas que
tiene el micro, nos la arreglamos para manejar un display y activar sus segmentos
para mostrar lo que se nos ocurri, bueno, lo que se me ocurri.

Imagnate, que pasara si quisieramos encender o trabajar con 2 displays, la cosa
se complica, a dems no tenemos 16 pines en el micro para los dos displays, y si
queremos manejar 4...? uff...!!!, peor todava...!!!

Bueno, tambin hay una solucin, en este caso la idea es multiplexar las seales
enviadas por el micro.

Te preguntars que es eso de multiplexar, Multiplexar es comooooo, multiplicar, si,
es algo as. Algo de esto vimos en el proyecto "secuenciador de 32 canales
controlado por PC", claro que all utilizamos un integrado que se encargaba de
mantener la seal enviada por el pc para cada grupo de 8 datos, aqu la cosa ser
distinta, ya que ser el micro quien administre el encendido de cada display y sus
segmentos (lo cual se hace por programa).

Para entenderlo mejor, veamos el circuito que vamos a utilizar...

Si prestas atencin, el Puerto B se utiliza para enviar los datos a mostrar en cada
display, mientras que por el Puerto A seleccionas el display que mostrar ese dato.

Supongamos que quiero mostrar cero "0" en cada Display, pues muy fcil, pongo el
puerto B en 00111111 (cdigo para el cero), y activo ahora los transistores
conectados en el puerto A, haciendo una secuencia de RA0 a RA3, pero sabes cual
es el problema...?, que vers correr el cero de un Display a otro, para solucionar
este problema, hagamos lo siguiente, realicemos la secuencia tan rpido, que el
observador no note el momento en que cambias de display, por lo tanto vera todos
los displays mostrando cero, que picarda no...!!! ;))

Justamente se trata de eso, ahora, si quisiera mostrar LUIS, enviara "L", "U", "I" y
"S" tan rpido como sea posible, de tal modo que nadie note el cambio de display
que estoy haciendo para mostrarlo, algo as...


ejemmmmm..., bueno, el micro lo har ms rpido, y tu vers...



Muy bien, ya est claro lo que haremos, nos falta ver cmo...!!!, para ello vamos a
recurrir a un par de registros especiales, de los cuales no hablamos mucho, es ms,
creo que no hablamos nada de ellos, as que, nos tomamos un tiempo para ver de
que se trata...
Antes de mostrarte los registros de los que hablaremos te traje los bancos de
memoria del Micro, en donde los resalt para que puedas notarlo...

Estos 2 registros, y en algunos casos, junto al registro STATUS, pueden trabajar en
conjunto para hacer un direccionamiento indirecto de la memoria de Datos
(memoria RAM). Bien, que es eso del direccionamiento indirecto...?. Para
entenderlo mejor estudiemos estos registros...
Registro 04h (FSR)
Es el Registro selector de registros, es un puntero en realidad, Recuerdas aquello
de las interrupciones, pues bien, es la misma direccin, la 0x04h, cuando se
produca una interrupcin, el contador de programa apuntaba a esta direccin, y
nosotros le decamos por donde continuar, o escribamos ah lo que deba hacer.

Ok. Ahora utilizaremos el registro contenido en esta direccin para seleccionar otros
registros.

Piensa, que si el FSR es un puntero de registros, pues, en un momento, puede
apuntar a uno y en otro momento a otro. Ahora, la direccin del registro al que
apunta, se copia en un registro llamado INDF, y este ltimo registro, se actualiza
en cada cambio del registro FSR, ahora... tienes una idea de lo que es el registro
INDF...???
Registro 00h (INDF)
Es el registro para direccionamiento indirecto de datos, a pesar de no ser un
registro disponible fsicamente (esto lo dice la hoja de datos); utiliza el contenido
del registro FSR, para seleccionar indirectamente la memoria de datos o RAM. Si la
direccin a la que apunta el FSR se copia en INDF, una instruccin aplicada a INDF,
determinar lo que se debe hacer con el registro al que apunta.

Veamos un ejemplo, de como trabajan estos dos registros, en colaboracin el uno
con el otro, y as lo entenders mejor...
Ejemplo de direccionamiento indirecto
El Registro 05 contiene el valor 10h
El Registro 06 contiene el valor 0Ah
Se Carga el valor 05 en el registro FSR (FSR = 05)
La lectura del registro INDF retornar el valor 10h
Se Incrementa el valor del registro FSR en 1 (FSR = 06)
La lectura del registro INDF retornar el valor 0Ah.
Est mas claro verdad...???

Veamos otro ejemplo pero en cdigo. Lo que hace este miniprograma, es borrar el
contenido de la memoria RAM entre 0x20-0x2F utilizando direccionamiento
indirecto.
...
MOVLW 0x20 ; inicializa el puntero
MOVWF FSR ; a la RAM
siguiente CLRF INDF ; borra el registro INDF
INCF FSR ; incrementa el puntero
BTFSS FSR,4 ; termin ?
GOTO siguiente ; NO, borra el siguiente
SIGUE ... ; SI, contina con el programa
Veamos, Primero cargamos W (W=0x20), luego se lo pasamos al FSR, ahora el FSR
apunta al registro 0x20, INDF tambin.

Borramos el registro INDF (lo ponemos a 00000000), en realidad es el registro
0x20 el que estamos poniendo a 00000000, luego incrementamos en uno el
registro FSR, es decir, apunta a 0x21, adivina a quin apunta INDF...?,
exactamente..., a 0x21.

Ahora viene la pregunta... El Bit4 de FSR est en uno...?, si es que NO, regresa
a siguiente y borra INDF (est borrando el contenido de 0x21), ahora incrementa
FSR (FSR=0x22=INDF), y vuelve a preguntar, como la respuesta es NO, borra
INDF (0x22) y nuevamente incrementa FSR, y bueno, as, hasta que FSR llega a
0x2F, en donde la respuesta a la pregunta es S, y salta una lnea para continuar
con el flujo del programa.

Viste que bueno que est..., imagnate todas las aplicaciones en que los puedes
utilizar, ok. les comento que estos ejemplos fueron extrados de la hoja de datos
del PIC16F84, y creo que estn bastante entendibles.

De acuerdo, todo lo que vimos hasta el momento, ser lo que aplicaremos para
hacer un programa que controle 4 displays.

Listos...???

Vamos por lo que sigue...
Volvamos a lo nuestro, y analicemos el programa por partes o en mdulos, luego
veremos si es necesario un diagrama de flujo...

Primero el encabezado con nuestro archivo .inc para hablar en trminos de C, Z, W,
F, etc. y la definicin de variables...
;---------------Encabezado-------------------

LIST P=16F84
#include <P16F84luis.INC>

;-------- Variables a utilizar --------

ret1 equ 0x0d
ret2 equ 0x0e ; registros para retardos
rota equ 0x0f ; reg. para rotacin (cambio de display)
disp1 equ 0x10 ; primer dato a mostrar
disp2 equ 0x11 ; segundo dato a mostrar
disp3 equ 0x12 ; tercer dato a mostrar
disp4 equ 0x13 ; cuarto dato a mostrar
Recuerda que lo que haremos sera una secuencia de displays, por lo que es
necesario una rutina de retardo, y ser muy pequea, algo como esto...
;------- RETARDO -------

retardo MOVLW 0x03
MOVWF ret1
dos MOVLW 0x6E
MOVWF ret2
uno NOP
NOP
NOP
NOP
NOP
NOP
DECFSZ ret2,F
GOTO uno
DECFSZ ret1,F
GOTO dos
RETLW 0x00
No me voy a gastar explicando el retardo (tema visto anteriormente), slo lo puse
para tenerlo en cuenta, lo que s rescato de aqu, es el uso de la instruccin NOP,
que significa no hacer nada (aunque lo que estamos logrando es hacer tiempo).
Una cosa ms, los registros reg1 y reg2 son variables definidas anteriormente.

La configuracin de puertos tambin ser sencilla ya que ambos puertos sern de
salida uno maneja los datos, y el otro selecciona cada display, entonces...
;-------Configuracin de puertos-------

reset ORG 0x00
GOTO inicio
ORG 0x05

inicio BSF STATUS,RP0 ; configurando puertos
CLRF TRISA ; portA es salida
CLRF TRISB ; portB es salida
BCF STATUS,RP0
Habrs notado que en la definicin de variables se incluyeron 4 registros
llamados disp1, disp2, disp3 y disp4. Estos registros los vamos a utilizar para
guardar el valor que se sumar al PCL en la tabla, de tal modo que tome el dato
que queremos enviar al display, y como son 4 displays, pues utilizamos 4 registros
y le cargamos con la direccin de esos 4 datos, as...
; ------- cargando direcc. de datos de la tabla -------

MOVLW 0x01
MOVWF disp1
MOVLW 0x02
MOVWF disp2
MOVLW 0x03
MOVWF disp3
MOVLW 0x04
MOVWF disp4
Y ahora la tabla, ser muy pequea, ya que slo quiero mostrar mi nombre ;o))
;------- TABLA -------

tabla ADDWF PCL,F ; se incrementa el contador de programa
;display . gfedcba segmentos de los leds del display
NOP
RETLW B'00111000' ; cdigo para la L
RETLW B'00111110' ; cdigo para la U
RETLW B'00000110' ; cdigo para la I
RETLW B'01101101' ; cdigo para la S
Aqu tambin inclu un NOP, para pasar por encima, cuando el programa venga a
buscar el primer dato, y as no empezamos desde cero.

Ahora viene lo ms importante, el cdigo principal del programa. Primero borramos
el Puerto_A para desactivar todos los transistores (apagar los displays) y luego
continuamos con el cdigo.

Hay por all, un registro llamado "rota", que lo vamos a utilizar en el siguiente
cdigo para activar los transistores que estn conectados a PORTA, de tal modo de
seleccionar el display que vamos a encender, puesto que son 4, lo vamos a cargar
con "00001000" 0x08 para seleccionar uno de los displays, y luego lo haremos
rotar, para seleccionar los tres restantes. En la siguiente lnea, hacemos que
el FSR apunte al primer registro disp1, y nos preparamos para enviar datos al
Display, todo esto en las primeras 4 lneas...
; ----------- apaga transistores ----------

CLRF PORTA

; ----------- PROG. PPAL ----------

ini MOVLW 0x08
MOVWF rota ; rota= '00001000'

MOVLW disp1
MOVWF FSR ; CARGA FSR CON LA DIRECC. DE disp1

display MOVLW 0x00
MOVWF PORTB ; PORTB=00000000

MOVF rota,W
MOVWF PORTA ; PORTA= 00001000

MOVF INDF,W ; lee dato al que apunta FSR (o sea disp1)
CALL tabla ; llama a la tabla
MOVWF PORTB ; pasa el dato al puerto B

CALL retardo ; llama miniretardo
BTFSC rota,0 ; rota = 00000000 ???
GOTO ini ; si es as, se vio todo, reinicia

BCF STATUS,C ; carry = 0 (para no afectar rotaciones)
RRF rota,F ; rota display
INCF FSR,F ; apunta al siguiente disp_X
GOTO display
En las dos primeras lneas de la etiqueta display enviamos 00000000 a PORTB
(puesto que los display's son de ctodo comn, los 4 estarn apagados), y luego
seleccionamos el transistor del display de la izquierda, esto lo hacemos poniendo
00001000 en PORTA.

Recuerda que el FSR apuntaba a disp1, y como ya sabemos, INDF tambin, y
cuando leamos INDF, estaremos leyendo disp1, luego lo pasamos a W, para
seguidamente llamar a la tabla, tomar el dato y mostrarlo en el display
seleccionado. Como disp1=1 estaremos tomando el cdigo para la letra L de la
tabla, y lo estaremos enviando al display de la izquierda.

Bien, ahora hacemos un miniretardo, y al regresar, preguntamos si se termin de
rotar, como recin comenzamos..., an falta..., Ahora bien, por una cuestin de
precaucin borramos el Carry del registro STATUS, as no se afecta la rotacin, de
lo contario cuando terminemos de rotar apareceran cosas raras como un uno
dems, asi que lo borramos y hacemos la rotacin a la derecha del registro rota,
luego incrementamos el FSR (para que apunte al registro disp2) y regresamos
a display

veamos como estan las cosas, rota=00000100, FSR=disp2=INDF, ok, eso significa
que ahora, con rota seleccionamos el siguiente display, cuando tomemos el dato de
INDF, estaremos tomando el dato de disp2, y de la tabla tomaremos el cdigo para
la letra U, haremos un retardo, verificamos la rotacin y si no termin, seguiremos
rotando, incrementamos el FSR para ir por el siguiente dato, y repetimos el ciclo.

Esta vez rota=00000010, FSR=disp3=INDF, es decir que esta vez mostraremos
la I, y seguiremos as hasta mostrar la S, cuando esto ocurra, y lleguemos a la
pregunta de si termin la rotacin, nos daremos con que S, y entonces saltaremos
a ini, para repetir la secuencia de displays.

Wowwww...!!!, terminamooooos...!!!, pareca que sera ms extenso, pero no, claro
que este programita, es con la intensin de mostrar usos y aplicaciones del micro,
cada uno sabr la utilidad que le dar, y para que lo pongan a prueba, les dejo el
programa completo...
Recuerda, si quieres ensamblar este programa, debers modificar el encabezado,
cambiando el nombre del archivo P16F84luis.INC por el que tu tienes, por lo
dems no creo que tengas problemas.

Suerte...!!!
;---------------Encabezado-------------------

LIST P=16F84
#include <P16F84luis.INC>

;-------- Variables a utilizar --------

ret1 equ 0x0d ; utilizado en retardos
(milisegundos)
ret2 equ 0x0e ; utilizado en retardos
rota equ 0x0f ; rota el uno para habilitar displays
disp1 equ 0x10 ; primer dgito a mostrar
disp2 equ 0x11 ; segundo dgito a mostrar
disp3 equ 0x12 ; tercer dgito a mostrar
disp4 equ 0x13 ; cuarto dgito a mostrar

;-------Configuracin de puertos-------

reset ORG 0x00
GOTO inicio
ORG 0x05

inicio BSF STATUS,RP0 ; configurando puertos
CLRF TRISA ; portA es salida
CLRF TRISB ; portB es salida
BCF STATUS,RP0

; ------- carga de registros a mostrar -------

MOVLW 0x01
MOVWF disp1
MOVLW 0x02
MOVWF disp2
MOVLW 0x03
MOVWF disp3
MOVLW 0x04
MOVWF disp4

; ----------- apaga transistores ----------

CLRF PORTA

; ----------- PROG. PPAL ----------

ini MOVLW 0x08
MOVWF rota ; rota= '00001000'

MOVLW disp1
MOVWF FSR ; CARGA FSR CON LA DIRECC. DE
disp1

display MOVLW 0x00
MOVWF PORTB ; PORTB=00000000

MOVF rota,W
MOVWF PORTA ; PORTA= 00001000

MOVF INDF,W ; lee dato al que apunta FSR (o
sea disp1)
CALL tabla ; llama a la tabla
MOVWF PORTB ; pasa el dato al puerto B

CALL retardo ; llama miniretardo
BTFSC rota,0 ; rota = 00000000 ???
GOTO ini ; si es as, se vio todo, comienza
otra vez

BCF STATUS,C ; carry = 0 (para no afectar
rotaciones)
RRF rota,F ; rota display
INCF FSR,F ; apunta al siguiente disp_X
GOTO display

;------- RETARDO -------

retardo MOVLW 0x03
MOVWF ret1
dos MOVLW 0x6E
MOVWF ret2
uno NOP
NOP
NOP
NOP
NOP
NOP
DECFSZ ret2,F
GOTO uno
DECFSZ ret1,F
GOTO dos
RETLW 0x00

;------- TABLA -------

tabla ADDWF PCL,F ; se incrementa el contador de
programa
;display . gfedcba segmentos de los leds del display
NOP
RETLW B'00111000' ; cdigo para la L
RETLW B'00111110' ; cdigo para la U
RETLW B'00000110' ; cdigo para la I
RETLW B'11101101' ; cdigo para la S.
;------------------------------------------
END
;------------------------------------------
Sera bueno verlo funcionar, asi que aqu lo tienen...

Es eso simplemente, mostrar un mensaje, y la secuencia entre cada carecter es
muy difcil de notar, ya que la velocidad es muy elevada.

Podramos mejorarlo y hacer que se desplacen los caracteres de un lado a otro, no
crees...???, eso lo dejo en tus manos, ya que con todo lo que tienes, puedes hacer
lo que se te ocurra, es ms, podras harmarte tus display's con LED's comunes,
agruparlos en forma de segmentos y trabajar con ellos, que ms, bueno, no se, ya
vers que es lo que haces, o te quedars simplemente con esto...???

S-ar putea să vă placă și