Problema con cambio de giro en motor DC con PIC16F887

#1
Hola a todos. Verán, me han pedido el siguiente circuito con las siguientes características:

El circuito debe de permitir el control de un motor de CD para poder girar en los dos sentidos, debe contar con tres botones de pulsación: el 1º para poder girar a la derecha, el 2º giro a la izquierda y el 3º paro.
Restricciones: una vez que se encuentre girando en algún sentido, no podrá cambiar su sentido, a menos que ya se haya realizado el paro. Es necesaria etapa de potencia.

Ya he realizado el código en ensamblador:

PHP:
LIST        P=16F887
 #INCLUDE    <P16F887.inc>

; __config 0x3FF7
 __CONFIG _CONFIG1, _FOSC_EXTRC_CLKOUT & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_ON & _IESO_ON & _FCMEN_ON & _LVP_ON
; CONFIG2
; __config 0x3FFF
 __CONFIG _CONFIG2, _BOR4V_BOR40V & _WRT_OFF


;*******************************************************************************
 ORG      0x00
 
            BANKSEL    PORTB
     CLRF       PORTB
     BANKSEL    ANSEL
     CLRF       ANSEL
     BANKSEL    PORTD
     CLRF       PORTD
     BANKSEL    ANSEL
     CLRF       ANSEL
     BCF        STATUS,RP1
     BANKSEL    TRISD
     MOVLW      B'11111111'
     MOVWF      TRISD
     BANKSEL    TRISB
     MOVLW      B'00000000'
     MOVWF      TRISB
     BCF        STATUS,RP1
     
GP
     
     BTFSC PORTD,0
     GOTO GIROD
     BTFSC PORTD,1
     GOTO GIROI
     GOTO GP
PARO
     
     CLRF PORTB
     GOTO GP
          
GIROD
     
     BTFSC PORTD,2
     GOTO PARO
     MOVLW B'00000001'
     MOVWF PORTB
     GOTO GIROD
     
GIROI 
     
     BTFSC PORTD,2
     GOTO PARO
     MOVLW B'00000010'
     MOVWF PORTB
     GOTO GIROI
     
 END
Pero a la hora de cargarlo en el PIC, éste no hace ninguna acción, no sé si hay errores en mi código y si alguno de ustedes pueda ayudarme a corregirlo.

Gracias por su atención.

P.D. : En la etapa de potencia tengo un L293D.
 
Última edición por un moderador:
#2
Creo que el error está en la instrucción que te marco en rojo, deberia ser BSF en realidad. Pero además la palabra de configuración no me gusta, la fuente de reloj es una generada en forma externa? o es con un cristal? "_FOSC_EXTRC_CLKOUT", porque está configurada cualquier otra cosa. También veo que está habilitado el Master Clear "_MCLRE_ON", el cual si no lo trabajas adecuadamente al pin te resetea constantemente el PIC, si no lo estas usando te recomiendo deshabilitarlo. Verifica esas cosas.
Código:
LIST        P=16F887
 #INCLUDE    <P16F887.inc>
 
; __config 0x3FF7
 __CONFIG _CONFIG1, _FOSC_EXTRC_CLKOUT & _WDTE_OFF &  _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF  & _BOREN_ON & _IESO_ON & _FCMEN_ON &  _LVP_ON
; CONFIG2
; __config 0x3FFF
 __CONFIG _CONFIG2, _BOR4V_BOR40V & _WRT_OFF
 
 
;*************************************************  ******************************
 ORG      0x00
 
            BANKSEL    PORTB
     CLRF       PORTB
     BANKSEL    ANSEL
     CLRF       ANSEL
     BANKSEL    PORTD
     CLRF       PORTD
     BANKSEL    ANSEL
     CLRF       ANSEL
     [COLOR=Red]BCF[/COLOR]        STATUS,RP1
     BANKSEL    TRISD
     MOVLW      B\'11111111\'
     MOVWF      TRISD
     BANKSEL    TRISB
     MOVLW      B\'00000000\'
     MOVWF      TRISB
     BCF        STATUS,RP1
 
GP
 
     BTFSC PORTD,0;
     GOTO GIROD;
     BTFSC PORTD,1;
     GOTO GIROI;
     GOTO GP;
PARO
 
     CLRF PORTB;
     GOTO GP
 
GIROD
 
     BTFSC PORTD,2;
     GOTO PARO;
     MOVLW B\'00000001\';
     MOVWF PORTB;
     GOTO GIROD;
 
GIROI 
 
     BTFSC PORTD,2;
     GOTO PARO;
     MOVLW B\'00000010\';
     MOVWF PORTB;
     GOTO GIROI;
 
 END
 
#3
Hola, muchas gracias por responder. El reloj no lo estoy usando puesto que sólo se trata de detener y cambiar el giro del motor o al menos eso es lo que creo. Y para el registro "STATUS,RP1" vi en el data sheet, que solo para cambiar el puerto A a digital; ahora estoy probando con los puertos A y B, e intentaré deshabilitar el master clear como sugiere y le comento si funcionó.
 
#4
Me parece que a ambos les hace falta estudiar mejor la hoja de datos.
El registro STATUS es el encargado del cambio de bancos, usando los bits 7 (IRP = Direccionamiento indirecto), 6 y 5 (RP0, RP1 = Direccionamento directo)
Este registro no tiene nada que ver con la configuración del conversor AD.
Y cuando se usa la instrucción "BANKSEL" (Selección de Banco), el uso de ese registro resulta redundante dentro del código.

Los registros involucrados en la configuración del conversor AD, son los registros ANSEL y ANSELH que se encuentran en el mismo banco. (Bank 3)
Y ésto es únicamente cuando no se usará el conversor AD.
De otra forma, también se tienen que configurar los registros ADCON0 y ADCON1

Deshabiltar el uso del pin Master Clear, hace que ese pin se convierta en entrada únicamente.
Esta opción es importante, ya que a muchos se les olvida conectar ese pin a VCC y por defecto es activo (RESET) si no se declara como OFF en la palabra de configuración.

Cuando tengas problemas sobre la ejecución de tu programa, entra en modo de depuración y podrás ver lo que hace.
Y si tienes un programador con modo ICD, podrás ejecutar y depurar tu programa en tiempo real físicamente.

A simple vista, parece que tienes un problema de estructura en tu programa, que generará un bucle mal orientado.

---------- Actualizado ----------

PD:
Al usar el oscilador interno, se tiene que configurar el registro OSCCON.
En éste PIC (PIC16F887) la frecuencia de operación por defecto, es de 4 MHz.
 
Última edición:
#5
Mala mia. Respondi sin siquiera tener la intension de ver el datasheet, fue algo rapidito. Como bien dice Dark, haces uso redundante de la selccion de bancos. Pero me parece que el mayor problema viene por la configuracion de la palabra.
 
#6
El uso de los bancos ya me quedó claro junto con el registro ANSEL y ANSELH, pero si en el deupurador de MPLAB realiza bien la simulación, es decir, los giros, paro, todo entonces el problema radica en la configuración inicial? Y el oscilador importa si no lo uso?

P.D. :Gracias por la aclaración de los bacos.
 
Última edición:
#7
¿Y el oscilador importa si no lo uso?
Siempre tienes que usar un oscilador, pero tienes que determinar de qué tipo.
Si seleccionas usar el interno, por defecto se ejecutará a 4 MHz. (PIC16F887)
Si requieres que funcione a otra frecuencia, por ejemplo; a 8 MHz, entonces tendrás que configurar el registro OSCCON.
 
#10
Hey amigos, no había podido comentar, cambié mi código siguiendo sus recomendaciones, pero el error que tenía eran las resistencias ahora las tengo en pull down y ya funciona correctamente, gracias por su tiempo.
 

Temas similares

Arriba