You are on page 1of 6

list

p=16f648A
#include <p16F648A.inc>

; list directive to define processor


; processor specific variable definitions

errorlevel -302

; suppress message 302 from list file

__CONFIG _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON &
_WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT
; '__CONFIG' directive is used to embed configuration word within .asm file.
; The lables following the directive are located in the respective .inc file.
; See data sheet for additional information on configuration word settings.

;***** VARIABLE DEFINITIONS


w_temp
EQU
0x7D
status_temp EQU
0x7E
pclath_temp EQU
0x7F

; variable used for context saving


; variable used for context saving
; variable used for context saving

;**********************************************************************
ORG
0x000
; processor reset vector
goto
main
; go to beginning of program
ORG
movwf
movf
movwf
movf
movwf

0x004
w_temp
STATUS,w
status_temp
PCLATH,w
pclath_temp

;
;
;
;
;
;

interrupt vector location


save off current W register
move status register into W
save off contents of STATUS
move pclath register into W
save off contents of PCLATH

contents
register
register
register
register

; isr code can go here or be located as a call subroutine elsewhere


movf
movwf
movf
movwf
swapf
swapf
retfie

pclath_temp,w
PCLATH
status_temp,w
STATUS
w_temp,f
w_temp,w

;
;
;
;

retrieve copy of PCLATH register


restore pre-isr PCLATH register contents
retrieve copy of STATUS register
restore pre-isr STATUS register contents

; restore pre-isr W register contents


; return from interrupt

main
clrf
STATUS
;se borra todo lo que se tenga en
STATUS para poder acceder a un banco
bsf
STATUS,5
;se accede al banco 1
movlw B'00000011'
;solo se activan 2 bits que son lo
s que trabajaremos para controlar las velocidades
movwf TRISA
;movemos lo que tenemos en el regi
stro de trabajo a TRISA para que slo se trabajen con estas 2
clrf
TRISB
;se borra TRISB para que funcionen
como salidas y ocupemos cualquier pin
clrf
STATUS
;accedemos al banco 0
movlw 0x07
;cargamos el dato 0x07

movwf CMCON
;movemos ese numero al registro CM
CON para desactivar las entradas analgicas y convertirlas en digitales
clrf
porta
;limpiamos porta para asegurarnos
que no tenga nada
clrf
portb
;limpiamos portb para asegurarnos
que no tenga nada
principal
movf
RTA al registro
andlw
miento para que
or estos
call
goto
ita esta accin

PORTA,w
;aqu moveremos lo que tenemos en PO
W
b'00000011'
;realizamos lo que es el enmascara
solo nuestros datos cargados en TRISA puedan ser multiplicados p
tabla
principal
todo el tiempo

;llamamos a nuestra etiqueta tabla


;colocamos el goto para que se rep

tabla
addwf PCL,f
PCL al registro f
goto
cero
ama cero
goto
cincuenta
ama cincuenta
goto
setenta
ama setenta
goto
cien
ama cien

;Aadimos lo que este en el registro


;mandamos un salto a nuestro progr
;mandamos un salto a nuestro progr
;mandamos un salto a nuestro progr
;mandamos un salto a nuestro progr

cero
BCF PORTA,2
;iniciamos el programa cero coloca
ndo un cero en el pin 2 de PORTA que es para mantener apagado el motor
movlw B'10110000'
;indicaremos que nuestro display e
s de catodo por eso el 1011 y los 0000 para que no haya interferencia entre sali
da del motor y display
movwf PORTA
;lo moveremos a porta
movlw b'00111111' ;O
;cargamos el dato 00111111 que rep
resenta la O
movwf PORTB
;lo movemo a portb para que pueda
ser visualizado
call tiempo
;llamamos a nuestra subrutina de t
iempo
movlw B'01110000'
;indicaremos que nuestro display e
s de catodo por eso el 0111 y los 0000 para que no haya interferencia entre sali
da del motor y display
movwf PORTA
;volvemos a mandar ese dato a port
a
movlw b'01110001' ;F
;escribimos los bits que represent
an la letra f
movwf PORTB
;movemos el dato escrito a portb
call tiempo
;mandamos a llamar a nuestra rutin
a de tiempo
return

;se regresa a donde se llamo la su

brutina
cincuenta
movlw B'10110000'

;indicaremos que nuestro display e

s de catodo por eso el 1011 y los 0000 para que no haya interferencia entre sali
da del motor y display
movwf PORTA
;moveremos el dato escrito a porta
movlw b'01101101' ;5
sentaremos el 5 en el display
movwf PORTB
pueda ser visualizado
call tiempo
iempo
bsf

PORTA,2

;cargamos el dato con el que repre


;lo moveremos al puerto b para que
;llamamos a nuestra subrutina de t

;pondremos un 1 en el bit 2 de por

ta
call
tiempo50
;llamaremos a nuestra segunda ruti
na de tiempo que ser de 10 ms
movlw B'01110000'
;indicaremos que nuestro display e
s de catodo por eso el 0111 y los 0000 para que no haya interferencia entre sali
da del motor y display
movwf PORTA
;lo moveremos a porta
movlw b'00111111' ;0
;cargaremos el dato con el que rep
resentaremos el 0 en el display
movwf PORTB
;lo moveremos ahora al puerto b pa
ra que pueda ser visualizado
call tiempo
;llamaremos a nuestra primera ruti
na de tiempo
bcf
PORTA,2
2 de porta
call
tiempo50
na de tiempo de nuevo
return
a subrutina

;pondremos un cero en la terminal


;llamaremos a nuestra segunda ruti
;se regresa hasta donde se llamo l

setenta
movlw B'10110000'
;indicaremos que nuestro display e
s de catodo por eso el 1011 y los 0000 para que no haya interferencia entre sali
da del motor y display
movwf PORTA
;moveremos el dato a PORTA
movlw b'00000111' ;7
;cargaremos el dato con el que rep
resentaremos el 7 en el display
movwf PORTB
;moveremos ese dato a portb
call tiempo
;llamaremos a la rutina de tiempo
bsf
PORTA,2
de porta
call
catorcemili
a, sta es de 14ms

;pondremos un bit en la terminal 2


;llamaremos a nuestra tercer rutin

movlw B'01110000'
;indicaremos que nuestro display e
s de catodo por eso el 0111 y los 0000 para que no haya interferencia entre sali
da del motor y displayind
movwf PORTA
;lo moveremos a porta
movlw b'00111111' ;0
;cargaremos el dato con el que rep
resentaremos el 0 en el display
movwf PORTB
;y este dato lo moveremos a portb
call tiempo
;llamaremos a nuesta rutina de tie
mpo
bcf
PORTA,2
;pondremos un cero en la terminal
2 de porta

call
tina de 6ms

seismili

return
ubrutina

;llamaremos a nuestra cuarta subru


;regresar hasta donde se llam a la s

cien
bsf
PORTA,2
de porta
movlw B'10111111'
s de catodo por eso el 1011 y 1111 porque la
alidas de nuestro motor para trabajar al 100
movwf PORTA
movlw b'00111111' ;O
tara la O en el display
movwf PORTB
call tiempo
empo
movlw B'01111111'
s de catodo por eso el 0111 y 1111 porque la
alidas de nuestro motor para trabajar al 100
movwf PORTA
movlw b'01010100' ;N
ribiremos la letra n en el display
movwf PORTB
call tiempo
mpo
return
la subrutina

;pondremos un bit en la terminal 2


;indicaremos que nuestro display e
entrada del minidip sera 11 y las s
sera 11
;mandaremos ese dato a porta
;escribiremos el dato que represen
;moveremos ese dato a portb
;llamaremos a nuestra rutina de ti
;indicaremos que nuestro display e
entrada del minidip sera 11 y las s
sera 11
;moveremos eso a porta
;cargaremos el dato con el que esc
;lo moveremos a portb
;llamaremos a nuestra rutia de tie
;se regresara hasta donde se llam a

tiempo50
movlw d'10'
en este caso ponemos el 10 porque al trabajar
mpo alto de 10 ms
movwf 0XAA
oria
BB
movlw d'250'
stro de trabajo
movwf 0XAB
a
AA
nop
decfsz 0XAB
ue sea 0
goto
AA
egresar a AA
nop
decfsz 0XAA
ue sea 0
goto
BB
o esta vez regresar desde BB pasando por AA
return
a subrutina

;cargaremos el dato que queremos,


al 50% el motor necesita de un tie
;lo moveremos a una direccin de mem
;cargaremos en decimal 250 al regi
;se movera a un registro de memori
;se estabiliza la instruccion
;se decrementa el registro hasta q
;hasta que sea 0 salta el goto y r
;estabiliza la instruccion
;se decrementa el registro hasta q
;hasta que sea 0 salta el goto per
;se regresa hasta donde se llam a l

catorcemili
movlw

d'14'

;cargaremos el dato que queremos,

en este caso el 14 porque como trabaja al 70% necesita un tiempo alto de 14 ms


movwf 0XAC
os a una direccion de memoria
DD
movlw d'250'
stro de trabajo
movwf 0XAD
a
CC
nop
decfsz 0XAD
ue sea 0
goto
CC
egresar a CC
nop
decfsz 0XAC
ue sea 0
goto
DD
tara el goto e ir a DD pasando por CC
return
a subrutina

;ese dato lo moveremos o guardarem


;cargaremos el decimal 250 al regi
;se movera a un registro de memori
;se estabiliza la instruccion
;se decrementa el registro hasta q
;hasta que sea 0 salta el goto y r
;se estabiliza la instruccin
;se decrementa el registro hasta q
;hasta que el decremento sea 0 sal
;se regresa hasta donde se llamo l

seismili
movlw d'6'
, en este caso el 6 porque
on 6 ms
movwf 0XAE
gistro de memoria
FF
movlw d'250'
movwf 0XAF
a
EE
nop
decfsz 0XAF
1 hasta que sea 0
goto
EE
ue sea 0, despus se ira a
nop
decfsz 0XAE
ro de 1 en 1 hasta que sea
goto
FF
oto, una vez en 0 se ir a
return
a rutina
tiempo

;se escribira el dato que queramos


es el tiempo bajo que necesita el motor al trabajar c
;mandamos ese 6 en decimal a un re
;se carga un 250 al registro W
;se movera a un registro de memori
;se estabiliza la instruccion
;se decrementa el registro de 1 en
;no saltara la instruccion hasta q
EE repitiendo este proceso
;se estabiliza la instruccion
;se vuelve a decrementar el regist
0
;hasta no ser 0 no se saltara el g
FF lo cual repetir todo el proceso
;se regresa hasta donde se llamo l

movlw d'75'
;se carga un dato que queramos, en
este caso pusimos el 75
movwf 0x20
;se manda a un registro de memoria
GG
;en este caso nadamas se agrega un
a letra porque el tiempo es muy pequeo, porque al momento de visualizarlo se ver e
sttico
nop
;se estabiliza la instruccion
decfsz 0x20
;se decrementa el registro de 1 en
1 hasta que sea 0
goto GG
;no saltara la instruccion hasta q
ue sea 0, una vez en 0 se saltar a GG

return
a rutina
END

;se regresa hasta donde se llamo l


;se marca el fin del programa

You might also like