Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

14/04/2016 #1


Problema con cambio de giro en motor DC con PIC16F887
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:

Código 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.
14/04/2016 #2

Avatar de juanma2468

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    &lt;P16F887.inc&gt;
 
; __config 0x3FF7
 __CONFIG _CONFIG1, _FOSC_EXTRC_CLKOUT &amp; _WDTE_OFF &amp;  _PWRTE_OFF &amp; _MCLRE_ON &amp; _CP_OFF &amp; _CPD_OFF  &amp; _BOREN_ON &amp; _IESO_ON &amp; _FCMEN_ON &amp;  _LVP_ON
; CONFIG2
; __config 0x3FFF
 __CONFIG _CONFIG2, _BOR4V_BOR40V &amp; _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
17/04/2016 #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ó.
17/04/2016 #4
Moderador

Avatar de D@rkbytes

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.
17/04/2016 #5

Avatar de juanma2468

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.
17/04/2016 #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.
18/04/2016 #7
Moderador

Avatar de D@rkbytes

Vxn dijo: Ver Mensaje
¿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.
18/04/2016 #8

Avatar de juanma2468

La base de todo micro es un oscilador ya sea interno o externo, es lo que hace que funcione.
18/04/2016 #9


Muy bien, usaré el oscilador interno y les comento si hubo algún cambio.
30/04/2016 #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.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.