Hola.
Lo primero de todo-ya que es mi primer mensaje- enhorabuena por la comunidad que formáis y por todos los contenidos que en ella hay, espero poder participar activamente ahora que formo parte.
Os comento un poco.. estoy montando un robot que siga una linea negra sobre un fondo blanco. Y me estoy dando muchos cabezazos con la programación hasta ahora.
Los motores son CC y se controlan con un L293D conectado al PORTA del PIC.
Las entradas son sensores CNY70 conectados al PORTB,por ahora he decidido poner 6 y van del RB2 al RB7.
(Adjunto una captura del montaje)
El codigo que llevo programado hasta ahora es el siguiente:
list p=16f628a
include p16f628a.inc
org 0x00 ; Vector de Reset
goto INICIO
;******************************
;** Configuracion de Puertos **
;******************************
INICIO movlw 0x07 ; Se desactivan los comparadores analogicos
movwf CMCON ;
bsf STATUS,RP0 ; Cambio al banco 1
clrf TRISA ; Puerto A como salida
movlw 0xFF ; Puerto B como entradas
movwf TRISB ;
bcf STATUS,RP0 ; Cambio al banco 0
LIMPIA_PUERTOS
clrf PORTA ; Limpiar Puerto A
clrf PORTB ; Limpiar Puerto B
PRINCIPAL
call COMPROBAR_SENSORES
goto PRINCIPAL
COMPROBAR_SENSORES
btfsc PORTB,2
goto $+3
call ANTIRREBOTES
goto Avanzar
btfsc PORTB,3
goto $+3
call ANTIRREBOTES
goto Avanzar
btfsc PORTB,4
goto $+3
call ANTIRREBOTES
goto Derecha
btfsc PORTB,5
goto $+3
call ANTIRREBOTES
call Izquierda
btfsc PORTB,6
goto $+3
call ANTIRREBOTES
call Retroceder
btfsc PORTB,7
goto $+3
call ANTIRREBOTES
call Parar
goto COMPROBAR_SENSORES
;Control de los motores.
Avanzar: ;
BSF PORTA,0 ; activamos los enable
BSF PORTA,1 ; activamos el in1
BSF PORTA,3 ; activamos el in3
BCF PORTA,2 ; desactivamos el in2
BCF PORTA,4 ; desactivamos el in4
goto Avanzar;
Derecha: ;
BSF PORTA,0 ; activamos los enable
BSF PORTA,1 ; activamos el in1
BSF PORTA,4 ; activamos el in4
BCF PORTA,2 ; desactivamos el in2
BCF PORTA,3 ; desactivamos el in3
goto Derecha
Izquierda: ;
BSF PORTA,0 ; activamos los enable
BSF PORTA,2 ; activamos el in2
BSF PORTA,3 ; activamos el in4
BCF PORTA,1 ; desactivamos el in1
BCF PORTA,4 ; desactivamos el in3
goto Izquierda
Retroceder: ;
BSF PORTA,0 ; activamos los enable
BSF PORTA,2 ; activamos el in2
BSF PORTA,4 ; activamos el in4
BCF PORTA,1 ; desactivamos el in1
BCF PORTA,3 ; desactivamos el in3
goto Retroceder;
Parar: ;
BCF PORTA,0 ; Paramos los enables
goto Parar ;
ANTIRREBOTES
btfss PORTB,2
goto ANTIRREBOTES
btfss PORTB,3
goto ANTIRREBOTES
btfss PORTB,4
goto ANTIRREBOTES
btfss PORTB,5
goto ANTIRREBOTES
btfss PORTB,6
goto ANTIRREBOTES
btfss PORTB,7
goto ANTIRREBOTES
return
END
El problema que no se como resolver es el siguiente. Si elimino los "goto_____" de Avanzar,Retroceder...etc, los motores no actúan ( supongo que el puslo es demasiado corto) y con ello puesto, nunca salen de ahi. por lo que cambia la trayectoria una vez y después ignora futuras lecturas de los sensores porque esta atrapado en el bucle.
La solución que se me ha ocurrido es sacar un cable de cada sensor para que ademas de llegar a su correspondiente puerto también active la interrupción de RB0. De tal forma que hiciese los siguiente:
*Un sensor lee una linea y hay que cambiar la trayectoria->Pone el RBx a 1, el PIC activa las salidas correspondientes y permanece en ese bucle.
*Otro sensor lee la linea y hay que volver a cambiar la trayectoria -> pone RBx a 1 y RB0 a 1-A ->se produce una interrupción, se sale del bucle en el que estaba y desde ahí se controla a que bucle meterse ahora.
Y así indefinidamente.
Esto es lo que se me a ocurrido, pero me parece que es un método chapucero, y estaría muy agradecido si alguien pudiese darme otra idea o decirme como se haría.
Muchas gracias por adelantado.