SOFTWARE DEL MICRORRASTREADOR

 

         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.

 

 

VOLVER