Está en la página 1de 7

;Este programa es software libre: usted puede redistribuirlo y / o modificarlo

;bajo los trminos de la Licencia Pblica General GNU publicada por


;la Free Software Foundation, sobre la versin 3 de la Licencia, o
;(a su eleccin) cualquier versin posterior.

;Este programa se distribuye con la esperanza de que sea til,


;pero SIN NINGUNA GARANTA; ni siquiera la garanta implcita de
;COMERCIALIZACIN o IDONEIDAD PARA UN PROPSITO PARTICULAR. Vea la
;Licencia Pblica General GNU para ms detalles. Los autores originales
;del presente archivo deben ser referenciados en cualquier programa
;subsecuente o modificacion que resulte del mismo.

;Debera haber recibido una copia de la Licencia Pblica General GNU


;junto con este programa. Si no es as, consulte <http://www.gnu.org/licenses/>.

;****************************** Program.asm ***********************************


;DESCRIPCION:
;Seguidor de linea, tres sensores, dos actuadores (dos polos cada uno), led de
estado.
;
;ENTRADAS:
; Sensores -> PORTA
;SALIDAS:
; Actuadores, Led -> PORTB
;
; _______
; | |
; Sensores -3->| RA RB |-5->Actuadores, Led
; |_______|
; PIC16F84A
;
;Autores:
;Manuel Andres Velez Guerrero.
;Luis Felipe Snchez Gutierrez.
;Universidad Pedaggica y Tecnolgica de Colombia
;Tunja - Boyac - Colombia
;manuel.velez@uptc.edu.co
;luisfelipe.sanchez@uptc.edu.co
;
; ******************* DEFINICION DE PROCESADOR *********************************

errorlevel -205 ; quitar el mensaje de alerta 205


errorlevel -207 ; quitar el mensaje de alerta 207
errorlevel -203 ; quitar el mensaje de alerta 203
errorlevel -302 ; quitar el mensaje de alerta 302

list p=16F628A
#include <p16F628A.inc>

; ******************* CONFIGURACIONES GENERALES ********************************

__CONFIG _CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON &
_INTOSC_OSC_NOCLKOUT

cblock 0xA0 ; bloque de registros de proposito general.


temp,temp2,d1,d2,d3,d4,DATO
endc
org 0
bsf STATUS, RP0
movlw 0x00 ; salidas puerto B
movwf TRISB
movlw 0x07 ; entradas puerto A
movwf TRISA
movlw 0x07 ; deshabilitar comparadores analogos
movwf CMCON
bcf STATUS, RP0
movlw 0x07 ; deshabilitar comparadores analogos
movwf CMCON
movlw 0x00 ; borrar todo el puerto B
movwf PORTB
call esperainicial ; espera 5 segundos
goto main ; arranca

; ********************* PROGRAMA PRINCIPAL *************************************

main

call avance ; sale de la meta 300ms "ciego"


call retardo_200ms
call retardo_200ms
call freno
goto loop1 ; empieza a comparar sensores, loop infinito

loop1
; RA0 - SC
; RA1 - SD
; RA2 - SI
; 0 - No hay linea
; 1 - Hay linea

test1
btfsc PORTA, RA1
goto test2
btfsc PORTA, RA2
goto test2
call avance
goto loop1

test2
btfss PORTA, RA1
goto test3
btfsc PORTA, RA2
goto test3
call derecha
goto loop1

test3
btfsc PORTA, RA1
goto test4
btfss PORTA, RA2
goto test4
call izquierda
goto loop1

test4
btfss PORTA, RA1
goto test5
btfss PORTA, RA2
goto test5
btfsc PORTA, RA0
goto test5
call avance
goto loop1

test5
btfsc PORTA, RA1
goto test6
btfsc PORTA, RA2
goto test6
btfsc PORTA, RA0
goto test6
call avance
goto loop1

test6
btfss PORTA, RA1
goto loop1
btfss PORTA, RA2
goto loop1
btfss PORTA, RA0
goto loop1
goto especial

; ********************* FUNCIONES IMPORTANTES **********************************

esperainicial
movlw 0x04 ; carga un "for" con i=4
movwf temp
loopesperainicial ; prende y apaga un led, completa 1s por ejec.
bsf PORTB, RB6
call retardo_200ms
bcf PORTB, RB6
call retardo_700ms
decfsz temp, f
goto loopesperainicial
return

destello
movlw 0x0A ; carga un "for" con i=10
movwf temp
loopdestello ; prende y apaga un led, completa 192ms por ejec.
bsf PORTB, RB6
call retardo_92ms
bcf PORTB, RB6
call retardo_100ms
decfsz temp, f
goto loopdestello
return

freno
movlw 0x00 ; apaga todo el puerto B
movwf PORTB
return

avance
call freno ; activa el avance con los pines seleccionados
bsf PORTB, RB3
bsf PORTB, RB7
call retardo_500us
call retardo_100us
call retardo_100us
call freno
call retardo_300us
return

avance92
call freno ; activa el avance con los pines seleccionados
bsf PORTB, RB3
bsf PORTB, RB7
call retardo_100ms
call retardo_500us
return

derecha
call freno
bsf PORTB, RB2
call retardo_300us
bsf PORTB, RB7
call retardo_100us
call retardo_100us
return

izquierda
call freno
bsf PORTB, RB5
call retardo_300us
bsf PORTB, RB3
call retardo_100us
call retardo_100us
return

rotderecha
call freno
bsf PORTB, RB2
bsf PORTB, RB7
return

finaliza
call rotderecha ; rota a la derecha un total de 440ms
call retardo_200ms
call retardo_200ms
call retardo_40ms
call freno
call destello ; destella, espera y vuelve a comenzar
call retardo_2s
call esperainicial
goto main

especial
call avance92
btfss PORTA, RA1
goto salciclo
btfss PORTA, RA2
goto salciclo
btfss PORTA, RA0
goto salciclo
goto finaliza

salciclo
call avance
goto loop1

; ********************* SECCION DE RETARDOS ************************************

retardo_100ms
movlw 0x1E
movwf d1
movlw 0x4F
movwf d2
retardo_100ms_0
decfsz d1, f
goto $+2
decfsz d2, f
goto retardo_100ms_0
goto $+1
nop
return

retardo_200ms
movlw 0x3E
movwf d1
movlw 0x9D
movwf d2
retardo_200ms_0
decfsz d1, f
goto $+2
decfsz d2, f
goto retardo_200ms_0
goto $+1
nop
return

retardo_700ms
movlw 0x9E
movwf d1
movlw 0x87
movwf d2
movlw 0x02
movwf d3
retardo_700ms_0
decfsz d1, f
goto $+2
decfsz d2, f
goto $+2
decfsz d3, f
goto retardo_700ms_0
goto $+1
goto $+1
nop
return

retardo_92ms
movlw 0xDE
movwf d1
movlw 0x48
movwf d2
retardo_92ms_0
decfsz d1, f
goto $+2
decfsz d2, f
goto retardo_92ms_0
goto $+1
nop
return

retardo_1ms
movlw 0xC6
movwf d1
movlw 0x01
movwf d2
retardo_1ms_0
decfsz d1, f
goto $+2
decfsz d2, f
goto retardo_1ms_0
goto $+1
nop
return

retardo_40ms
movlw 0x3E
movwf d1
movlw 0x20
movwf d2
retardo_40ms_0
decfsz d1, f
goto $+2
decfsz d2, f
goto retardo_40ms_0
goto $+1
nop
return

retardo_2s
movlw 0x11
movwf d1
movlw 0x5D
movwf d2
movlw 0x05
movwf d3
retardo_2s_0
decfsz d1, f
goto $+2
decfsz d2, f
goto $+2
decfsz d3, f
goto retardo_2s_0
return

retardo_500us
movlw 0xA5
movwf d1
retardo_500us_0
decfsz d1, f
goto retardo_500us_0
return

retardo_300us
movlw 0x62
movwf d1
retardo_300us_0
decfsz d1, f
goto retardo_300us_0
return

retardo_100us
movlw 0x1F
movwf d1
retardo_100us_0
decfsz d1, f
goto retardo_100us_0
return

retardo_50us
movlw 0x0F
movwf d1
retardo_50us_0
decfsz d1, f
goto retardo_50us_0
return

; ************************ FIN DEL PROGRAMA ************************************


end