Lo que veo mal en tu codigo es:
- Agregar las lineas de inicializacion dentro del loop principal (INI_PUERTOS)
- No se que sentido tiene el RETURN, teniendo un Goto start, antes. Es decir que estarias usando un CALL pero sin un RETURN, lo cual es un problema. Asegurate siempre que si hay un CALL exista un RETURN.
- La forma en que queres "comprobar" el estado del puerto no funciona asi... Por ejemplo si quiero saber si el puerto tiene el valor movlw b'00000010', y solo tengo 4 bits entonces debo:
MOVF PORTB ; Muevo el valor del puerto
ANDLW 0x1F ; Dejo solo los 5 bits que me interesan.
;Ahora si compruebo si es alguno de los que yo quiero
Mi pregunta es, hay una manera más optimizada de preguntar por los estados?
Depende de que te referis con optimizado.
Optimizado para velocidad, Optimizado para memoria, lo mejor es comprobar uno por uno, algo parecido a lo que estas haciendo. O ir preguntado por bits.
Por ejemplo
0000 detenerse,
0010 giro izq,
0110 giro brusco izq
1000 giro derecha,
1001 giro brusco der,
10101 avanzar,
Podes observar que, y hacerlo en este orden:
- Avanzar es el unico que tiene un 1 en el bit 5, entonces no tiene sentido los demas bits. Preguntas por el bit 5, si es si, voy a AVANZAR.
- En cero: detenerse, es facil de comprobar el cero, voy a DETENERSE
Bit 1 sentido de giro izq, si esta en 1 voy a IZQUIERDA, sino voy a DERECHA (por eliminacion de las demas opciones)
En IZQUIERDA, pregunto por bit 2, para saber si es brusco o no.
En DERECHA, pregunto por bit 0, para saber si es brusco o no.
Es casi un BTFSS en cada caso...
MOVF PORTB ; Muevo el valor del puerto
ANDLW 0x1F ; Dejo solo los 5 bits que me interesan.
MOVWF AUX
BTFSC STATUS, Z
GOTO DETENERSE
BTFSC AUX,5
GOTO AVANZAR
BTFSC AUX,1
GOTO IZQUIERDA
GOTO DERECHA
Lo muevo a un registro que llame AUX, debido a que el PORTx puede cambiar mientras estoy con mi lecturas. Y eso no es conveniente.
Todo esto es suponiendo que los valores no se superponen.
Ya que avanzar y giro derecha brusco juntos darian un resultado que no es distinguible. Y solo podria determinar entre giro derecha , avanzar, pero no el brusco.
Ademas esto no contempla posibles malformaciones de entrada. Sino es ir probando uno a uno.
Optimizado para futuras ampliaciones...Crearia una tabla, la recorreria, y probaria si hay igualdad, ya con eso tengo una idea de que hacer, ya que se que cual es el indice, donde se produce la coincidencia.