El
programa experimental de control del móvil seguirá las siguientes directivas:
1.
El móvil no iniciará su funcionamiento, en primer lugar, sin saber el estado de
las baterías.
2.
El móvil no iniciará su andadura, en segundo lugar, si los sensores de
dirección nos indican que la rueda de giro está mal orientada.
3.
El móvil iniciará el movimiento al pulsar el botón de autorización.
4.
El móvil seguirá la línea blanca adherida a la lámina negra que hace de suelo.
5.
El móvil se parará y desactivará los dos motores al detectar que las baterías
están agotadas para proporcionar energía.
PROGRAMA EXPERIMENTAL DE UN APRENDIZ DE BRUJO.
;PROGRAMA RASTRE.ASM.
;ROBOT RASTREADOR DE LINEA
BLANCA.
;-------------------------------------------
list p=16f84A
include "p16F84A.inc"
;------------------------------
;RESET.
;------------------------------
org 00h
reset
goto
inicio
;------------------------------
;INTERRUPCION.
;------------------------------
org 04h
goto int
;--------------------------------
;PUNTERO DE INICIO.
;--------------------------------
org 10h
inicio
clrf INTCON
;-----------------------------
;Configurar el puerto A y
B.
;-----------------------------
;Cambio de banco0-1.
bsf STATUS,RP0
bcf OPTION_REG,7; on RB.
;Configurar puerto A.
;PA0,1,2 y 3= 0 salidas.
;PA4= 1 entrada.
;TRISA= ---1 0000= 10h.
movlw 10h
movwf TRISA
;Configurar puerto B.
;PB0= 1 entrada.
;PB1,2,3,4,5= 0 salidas.
;PB6,7= 1 entradas.
;TRISB= 1100 0001= c1h.
movlw 0c1h
movwf TRISB
;Cambio de banco1-0.
bcf STATUS,RP0
;Configurar MOTOR-A
(Arrastre).
;PB1= PAR= 1 off.
;PB2= F /H= 1 paso completo.
;PB3= CW /CCW= 0 avace.
;PB4= CLK= 0 flanco subida.
bsf PORTB,1
bsf PORTB,2
bcf PORTB,3
bcf PORTB,4
;Configurar MOTOR-G
(Giro).
;PA0= PAR= 1 off.
;PA1= F /H= 1 paso completo.
;PA2= CW /CCW= 0 derecha.
;PA3= CLK= 0 flanco subida.
bsf PORTA,0
bsf PORTA,1
bcf PORTA,2
bcf PORTA,3
bcf PORTB,5; led
rojo.
;------------------------------------------
;Configurar el contador
TMR0,/int y RB.
;------------------------------------------
;TMR0 = contador
descentente cargado con feh.
;Registro
OPTION_REG.
;PS0,1,2=bit
0,1,2= 0,0,0, divisor 1:1.
;PSA=
bit3=PSA= 1 (divisor al WDT).
;Descentente=
bit4=T0SE= 1.
;Contador=
bit5=T0CS= 1.
;/int=
bit6= INTEDG= 0 (descendente).
;R
pull-up B= bit7= 0 (activadas).
bsf STATUS,RP0
movlw 38h
movwf OPTION_REG
bcf STATUS,RP0
seguro
;Cargar el TMR0 con feh.
movlw
0ffh
movwf TMR0
;--------------------------------------------
;Preparar interrupciones.
;--------------------------------------------
;Habilitar permiso de
interrupción global.
bsf INTCON,GIE
;Habilitar permiso de
interrupción externa.
bsf INTCON,INTE
;Habilitar permiso int. TMR0.
bsf INTCON,T0IE
;-----------------------------------
;Programa de
comprobaciones.
;-----------------------------------
;Baterías bien.
call onA
call onG
;Espera hasta rebosar el
TMR0.
bcf 4fh,0
espera; dos impulsos.
btfss
4fh,0
goto espera
call offA
call offG
goto prog
proga
call noizq
goto seguro
proge
call noder
goto seguro
prog
btfss PORTB,7
goto proga
btfss PORTB,6
goto proge
call siizq
call sider
goto seguir
;--------------------------------
;PROGRAMA PRINCIPAL.
;--------------------------------
mirarI2
call avan
call relojA
mirarI1
call noizq
call der
call relojG
btfss PORTB,7
goto mirarI2
goto seguirI
;------------------------
mirarD2
call avan
call relojA
mirarD1
call noder
call izq
call relojG
btfss PORTB,6
goto mirarD2
goto seguirD
;-------------------------
seguir
seguirI
call avan
call relojA
btfss PORTB,7
goto mirarI1
seguirD
call avan
call relojA
btfss PORTB,6
goto mirarD1
call siizq
call sider
goto seguir
;-----------------------------------------------------
;--------- SUBRUTINAS.
-------------------------------
;-----------------------------------------------------
;--------------------------
;SEÑALIZACION DE SENSORES.
;--------------------------
noizq
noder
bcf PORTB,5
return
siizq
sider
bsf PORTB,5
return
;-----------------
;RELOJES.
;-----------------
;H=
5mseg/L= 50mseg.
relojG
bsf PORTA,3
call sg5
bcf PORTA,3
call sg50
return
;H=
5mseg/L= 125mseg.
relojA
bsf PORTB,4
call sg5
bcf PORTB,4
call sg125
return
;---------------------------------------------
;SUBRUTINAS DE
FUNCIONAMIENTO.
;---------------------------------------------
;SUBRUTINAS DE ARRASTRE.
;---------------------------
avan
bcf PORTB,1; on par.
bcf PORTB,2; paso C.
bcf PORTB,3; avance.
bcf PORTB,4; no reloj.
return
avanmedio
bcf PORTB,1
bsf PORTB,2; 1/2 paso
bcf PORTB,3
bcf PORTB,4
return
retro
bcf PORTB,1; on par.
bcf PORTB,2; paso C.
bsf PORTB,3; retroceso.
bcf PORTB,4; no reloj.
return
;SUBRUTINAS DE GIRO.
;----------------------------------------------
der
bcf PORTA,0; on par.
bcf PORTA,1; paso C.
bcf PORTA,2; derecha.
bcf PORTA,3; no reloj.
return
izq
bcf PORTA,0; on par.
bcf PORTA,1; paso
C.
bsf PORTA,2; izquierda.
bcf PORTA,3; no reloj.
return
;SUBRUTINAS DE OFF MOTOR
ARRASTRE Y GIRO.
;----------------------------------------------
offA; Arrastre.
bsf PORTB,1; off par.
return
offG; Giro.
bsf PORTA,0; off
par.
return
;SUBRUTINAS DE ON MOTOR
ARRASTRE Y GIRO.
;----------------------------------------------
onA; Arrastre.
bcf PORTB,1; on par.
return
onG; Giro.
bcf PORTA,0; on par.
return
;--------------------------------
;INTERRUPCIONES.
;--------------------------------
int
btfsc INTCON,INTF
goto intext
btfsc INTCON,T0IF
goto inttimer
goto otra
intext
;Deshabilitar permiso de
int. exterior.
bcf INTCON,INTE
;Poner a cero el flag de
la int. exterior.
bcf INTCON,INTF
;Poner los motores en off.
call offA
call offG
;Señalizar las descargas
de las baterías.
otra
bcf PORTB,5
call sg1
bsf PORTB,5
call sg1
bcf PORTB,5
call sg1
bsf PORTB,5
call sg1
goto otra
inttimer
;Deshabiltar permiso de
int. TMR0.
bcf INTCON,T0IE
;Poner a cero el flag del
TMR0.
bcf INTCON,T0IF
call sg1
bsf PORTB,5; led verde
bsf 4fh,0
retfie
;--------------------------------------------------------
;Retardos.
;--------------------------------------------------------
;c1h=193 goto=2 useg. decfsz=1
useg.( skip if 0 ).
;(193
x 2) + 193 = 579 useg.
;(579
x 579) = 335241 useg.
;(335241 x 3) = 1005723
useg.
;0ch, 0dh y 0eh registros
RAM del GPR.
;----------------------------------------
; 1005723 useg.
sg1
movlw 0c1h
movwf 0ch
movwf 0dh
movlw 02h
movwf 0eh
salto1
decfsz 0ch,1
goto salto1
decfsz 0dh,1
goto salto1
decfsz 0eh,1
goto salto1
return
;-------------------------
; 497025 useg.
sg500
movlw 0e6h; e6h= 235
movwf
0ch
movwf 0dh
salto2
decfsz 0ch,1
goto salto2
decfsz 0dh,1
goto
salto2
return
;--------------------------------------
; 251001 useg.
sg250
movlw 0a7h; a7h= 167
movwf 0ch
movwf 0dh
salto3
decfsz 0ch,1
goto salto3
decfsz 0dh,1
goto
salto3
return
;---------------------------
; 125316 useg.
sg125
movlw 76h; 76h= 118
movwf 0ch
movwf 0dh
salto4
decfsz 0ch,1
goto salto4
decfsz 0dh,1
goto
salto4
return
;----------------------------------
; 50625 useg.
sg50
movlw 4bh; 4bh= 75
movwf 0ch
movwf 0dh
salto5
decfsz 0ch,1
goto salto5
decfsz 0dh,1
goto salto5
return
;-----------------------------------
; 25281 useg.
sg25
movlw
35h; 35h= 53
movwf 0ch
movwf 0dh
salto6
decfsz 0ch,1
goto salto6
decfsz 0dh,1
goto salto6
return
;----------------------------------
;10404
useg.
sg10
movlw 22h; 22h= 34
movwf 0ch
movwf 0dh
salto7
decfsz 0ch,1
goto salto7
decfsz 0dh,1
goto salto7
return
;------------------------------------
; 5184 useg.
sg5
movlw
18h; 18h= 24
movwf 0ch
movwf 0dh
salto8
decfsz 0ch,1
goto salto8
decfsz 0dh,1
goto salto8
return
;-------------------------------------
; 3249 useg.
sg3
movlw 13h; 13h= 19
movwf 0ch
movwf 0dh
salto9
decfsz 0ch,1
goto salto9
decfsz 0dh,1
goto salto9
return
;--------------------------------------
; 2025
sg2
movlw 0fh; 0fh= 15
movwf 0ch
movwf 0dh
salto10
decfsz 0ch,1
goto salto10
decfsz 0dh,1
goto salto10
return
;---------------------------------------
; 1089 useg.
s1
movlw 0bh; 0bh= 11
movwf 0ch
movwf 0dh
salto11
decfsz 0ch,1
goto salto11
decfsz 0dh,1
goto salto11
return
;---------------------------------------
end
;Aclaración: este programa
funciona pero no está depurado. Queda al
;lector la tarea de
simplificarlo para llegar al mínimo de instruccio
;nes. Para lo cual debes
estudiar con detenimiento las informaciones
;dadas por el fabricante
del microcontrolador ya que en su iniciali-
;zación el PIC 16F84A ya
tiene colocados valores de bits que no hay
;que volver a programar.
Hay subrutinas que no se emplean en el pro-
;grama pero que el
aprendiz usó en su experimentación. Deberías bo-
;rrarlas para que no
ocupen memoria.