Autor Tema: PIC16f84A+PWM+Interrupcion+cambio giro motor  (Leído 5956 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Omar266

  • PIC10
  • *
  • Mensajes: 13
PIC16f84A+PWM+Interrupcion+cambio giro motor
« en: 30 de Octubre de 2011, 14:27:07 »
Hola, espero me puedan ayudar muchas gracias de antemano. Mi proyecto es un carro manejado a control remoto, con módulos RF, el codificador HT12E, decodificador HT12D, L293D y PIC16F84A. Me está funcionado usando 5 pulsadores en la parte transmisora que son para Adelante, Atrás, Derecha, Izquierda y Parar. Ahora deseo agregarle 3 pulsadores que son Vel1 (30% alto-70% bajo), Vel2 (60% alto-40% bajo) y Vel3 (100% alto-0% bajo). La idea es usar PWM e Interrupción. La interrupción será activada por PORTB,0  que recibirá la señal del pin 17 VT del Ht12D. PORTA (0..3) configurados como entrada PORTB (0) como entrada y PORTB (1..7) como salidas. En el cuerpo principal del programa Periodos actúa el  PWM  y VEL1 hasta que se active una interrupción, en la interrupción se leerá  El PUERTO A  y de acuerdo con la lectura se ejecutara ADELANTE, ATRÁS, DERECHA, IZQUIERDA, PARA, VEL1, VEL2 o VEL3.  Inicialmente el programa inicia el carro parado, cuando se inicia la velocidad será Vel3, por lo cual uso la bandera Activo, es para controlar que si se presiona uno de los pulsadores de Vel1-2-3- y el carro está parado no me afecte las variables Alto y Bajo.  
Mis dudas 1) cuando valida una señal recibida  el HT12D por el pin 17 es una señal alta o baja la que afectara al pin PORTB,0 del PIC16F84A.  2) Tengo que presionar muchas veces un pulsador para que funcione y no siempre lo hace.
Muchas gracias
« Última modificación: 31 de Octubre de 2011, 15:21:26 por Omar266 »

Desconectado NoSepComo

  • PIC18
  • ****
  • Mensajes: 305
Re: PIC16f84A+PWM+Interrupcion+cambio giro motor
« Respuesta #1 en: 31 de Octubre de 2011, 07:27:26 »
Lo del pulsador puede tener que ver con que si no has corregido el rebote mecánico del pulsador, tienes un periodo de incertidumbre. Normalmente es un sistema de primer orden con un tiempo de establecimiento genérico de unos 25 ms, asique una posible solución es que introduzcas un retraso de unos 25 ms y luego recojas la pulsación, asi esa oscilación termina y recojes el valor correcto.

Desconectado Omar266

  • PIC10
  • *
  • Mensajes: 13
Re: PIC16f84A+PWM+Interrupcion+cambio giro motor
« Respuesta #2 en: 31 de Octubre de 2011, 15:22:18 »
Bueno pero le estoy colocando un retraso de 20 ms (20000cyclos).
;---------------Encabezado-----------

   __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
   LIST      P=16F84A
   INCLUDE  <P16F84A.INC>

;-------Configuración de puertos-------

    cblock  0x0c
   PDel0
   PDel1
   ContadorD
    Activo
    Alto  
    Bajo  
    DIRECCION
    endc
       
   ORG   0x00
   GOTO   Inicio
   ORG   0X04      ; Atiendo la interrupción
    GOTO    Pulsadores

Inicio   
    BSF       STATUS,5     ; configurando puertos
   MOVLW   B'00011111'
    MOVWF   TRISA
    MOVLW   B'00000001'
    MOVWF   TRISB          ; puerto B es salida
    MOVLW   B'11000000'
    MOVWF   OPTION_REG
    BCF       STATUS,5
    MOVLW   b'10010000' ;Interrupcion por PORTB,0
   MOVWF   INTCON
    CLRF    PORTB      ; limpiamos PORTB
    CLRF    PORTA
    BCF     Activo,0
Cargar  
    MOVLW   d'3'
    MOVWF   Alto
    MOVLW   d'7'
    MOVWF   Bajo
    CLRF   DIRECCION
    BCF     Activo,0  ;Verifica si el carro esta parado
Periodo  
    MOVF    Activo,W  ; sale de este loop cuando se active con
    SUBLW   D'1'      ; Adelante, Atras; Izquierda, Derecha
    BTFSS   STATUS,Z
    GOTO    Periodo
    
    MOVF    Bajo,W
    SUBLW   D'10'
    BTFSS   STATUS,Z
    CALL    Periodo_Alto
    
    MOVF    Alto,W
    SUBLW   D'10'
    BTFSS  STATUS,Z
    CALL    Periodo_Bajo  
    
    Goto    Periodo
    

Periodo_Alto
    MOVF    DIRECCION,W
    MOVWF   PORTB
    MOVF    Alto,W
    MOVWF   ContadorD
    CALL    DEMORA1000X?
    RETURN
Periodo_Bajo
    MOVLW   B'00000000'
    MOVWF   PORTB
    MOVF    Bajo,W
    MOVWF   ContadorD
    CALL    DEMORA1000X?
    RETURN

DEMORA1000X?   
        MOVLW   .74
       MOVWF   PDel0
       MOVLW   .2
        MOVWF   PDel1
LOOP   
        DECFSZ   PDel0,F
       GOTO   LOOP
       DECFSZ   PDel1,F
       GOTO   LOOP
       decfsz   ContadorD      ; decrementa cantidad de veces
        goto   DEMORA1000X?
       Return  
    

    CBLOCK   
   Guarda_W
   Guarda_STATUS
   Guarda_ContadorD
   ENDC
    
Pulsadores
    movwf   Guarda_W      ; Guarda W y STATUS.
   swapf   STATUS,W      ; Ya que "movf STATUS,W" corrompe el bit Z.
   movwf   Guarda_STATUS
   bcf       STATUS,RP0      ; Para asegurarsede que trabaja con el Banco 0.
   movf   ContadorD,W      ; Guarda los registros utilizados en esta
   movwf   Guarda_ContadorD      ; subrutina y también en la principal.
   
   
    SUBLW   D'20'  
    MOVWF   ContadorD
    CALL   DEMORA1000X?                
    
    MOVF   PORTA,W            
    XORLW  0x05          ;   b'00000101'  d'05'
    BTFSC  STATUS,Z
    GOTO   ADELANTE
    MOVF   PORTA,W      
    XORLW  0x0A          ;   b'00001010'  d'10'
    BTFSC  STATUS,Z
    GOTO   ATRAS
    MOVF   PORTA,W      
    XORLW  0x06          ;   b'00000110'  d'06'
    BTFSC  STATUS,Z
    GOTO   DERECHA
    MOVF   PORTA,W      
    XORLW  0x09          ;   b'00001001'  d'09'
    BTFSC  STATUS,Z
    GOTO   IZQUIERDA
    MOVF   PORTA,W      
    XORLW  0x03          ;   b'00000011'  d'03'
    BTFSC  STATUS,Z
    GOTO   PARAR
    MOVF   PORTA,W      
    XORLW  0x02          ;   b'00000010'  d'02'
    BTFSC  STATUS,Z
    GOTO   Vel_1
    MOVF   PORTA,W      
    XORLW  0x0E          ;   b'00001110'  d'14'
    BTFSC  STATUS,Z
    GOTO   Vel_2
    MOVF   PORTA,W      
    XORLW  0x07          ;   b'00000111'  d'07'
    BTFSC  STATUS,Z
    GOTO   Vel_3  
    GOTO   FinInterrupcion

ADELANTE
    BSF    Activo,0
    MOVLW  b'10101100'
   MOVWF  DIRECCION
    GOTO   FinInterrupcion

ATRAS
    BSF    Activo,0
    MOVLW  b'01011100'  
   MOVWF  DIRECCION
    GOTO   FinInterrupcion
    
DERECHA
    BSF    Activo,0
    MOVLW  b'10011100'
   MOVWF  DIRECCION
    GOTO   FinInterrupcion
    
IZQUIERDA
    BSF    Activo,0
    MOVLW  b'01101100'
   MOVWF  DIRECCION
    GOTO   FinInterrupcion

PARAR
    MOVLW   d'3'
    MOVWF   Alto
    MOVLW   d'7'
    BCF    Activo,0
    MOVLW  b'00000000'
    MOVWF  DIRECCION
    GOTO   FinInterrupcion
    
Vel_1
    MOVF    Activo,W   ; Si esta en movimiento puedo
    SUBLW   D'0'       ; afectar la velocidad
    BTFSC   STATUS,Z
    GOTO    FinInterrupcion
    MOVLW   d'3'
    MOVWF   Alto
    MOVLW   d'7'
    MOVWF   Bajo
    GOTO   FinInterrupcion

Vel_2
    MOVF    Activo,W   ; Si esta en movimiento puedo
    SUBLW   D'0'       ; afectar la velocidad
    BTFSC   STATUS,Z
    GOTO    FinInterrupcion
    MOVLW   d'6'
    MOVWF   Alto
    MOVLW   d'4'
    MOVWF   Bajo
    GOTO   FinInterrupcion

Vel_3
    MOVF    Activo,W   ; Si esta en movimiento puedo
    SUBLW   D'0'       ; afectar la velocidad
    BTFSC   STATUS,Z
    GOTO    FinInterrupcion
    MOVLW   d'10'
    MOVWF   Alto
    MOVLW   d'0'
    MOVWF   Bajo
    GOTO   FinInterrupcion

FinInterrupcion
   movf   Guarda_ContadorD,W   ; Restaura los registros utilizados en esta
   movwf   ContadorD         ; subrutina y también en la principal.
   swapf   Guarda_STATUS,W      ; Restaura el STATUS.
   movwf   STATUS
   swapf   Guarda_W,F      ; Restaura W como estaba antes de producirse
   swapf   Guarda_W,W      ; interrupción.
   Bcf      INTCON,INTF
   retfie
    
;==========================================================================
    END
;==========================================================================
« Última modificación: 31 de Octubre de 2011, 15:28:49 por Omar266 »

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: PIC16f84A+PWM+Interrupcion+cambio giro motor
« Respuesta #3 en: 02 de Noviembre de 2011, 07:57:51 »
Citar
Mis dudas 1) cuando valida una señal recibida  el HT12D por el pin 17 es una señal alta o baja la que afectara al pin PORTB,0 del PIC16F84A

Es por flanco ascendente, cuando pasa de 0 a 1, lo tienes configurado tu asi.

Código: [Seleccionar]
MOVLW   B'11000000'
    MOVWF   OPTION_REG

El bit 6 del OPTION_REG.

bit 6 INTEDG: Interrupt Edge Select bit
1 = Interrupt on rising edge of RB0/INT pin
0 = Interrupt on falling edge of RB0/INT pin


Citar
2) Tengo que presionar muchas veces un pulsador para que funcione y no siempre lo hace.

Es que solo lees los pulsadores cuando se produce una interrupcion en RB0, es decir, por mucho que pulses el resto de los pulsadores sino hay un flanco ascendente en RB0 no los lee.

Un consejo que te doy es que uses TMRO con interrupcion, si analizas tu programa veras que se pasa casi todo el tiempo haciendo bucles de DEMORA, mas del 90% del tiempo esta haciendo esto. Si esas cuentas las haces con el TMR0 tendras el procesador para ti, para hacer lo que quieras, puedes estar casi todo el tiempo leyendo los pulsadores o haciendo otras cosas importantes.
Todas las interrupciones son importantes pero si se usan bien los TIMERS, al procesador se le quita mucho trabajo (en tu programa casi todo y en la mayoria de los programas igual) y le sobra mucho tiempo para hacer las cosas importantes.


Desconectado Omar266

  • PIC10
  • *
  • Mensajes: 13
Re: PIC16f84A+PWM+Interrupcion+cambio giro motor
« Respuesta #4 en: 06 de Noviembre de 2011, 20:47:29 »
Muchas gracias por la ayuda, hice un curso intensivo de TMR0 con interrupción por Internet ya que es la primera vez con interrupciones, la cual voy a aplicar, por lo cual no usare interrupción externa a RB0, sino que la señal del pin 17 VT del Ht12D será recibida por RA4, la configuración de los puertos  PORTA como entradas y PORTB como salidas. En el cuerpo principal van la lectura y manejo de los pulsadores, mantengo la bandera Activo y le agregue PORTA_T en la cual guardo PORTA y las comparo si es la misma se mantiene en el bucle de lo contrario continua, la bandera Interrupción la cual habilita o deshabilita la interrupción. En cuanto a los pulsadores el problema era la pila del control remoto aunque los pulsadores son de los más baratos. He probado el carro con el regulador de voltaje y me esta funcionado. Otra cosa es que se debe usar una fuente de 5V para el circuito y otras para los motores (PIN 8 del Puente H). Aquí dejo mi código. Cualquier sugerencia será bienvenida. Muchísimas gracias.

;---------------Encabezado-----------

   __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
   LIST      P=16F84A
   INCLUDE  <P16F84A.INC>

;-------Configuración de variables-------

    cblock  0x0c
   Activo
    Alto 
    Bajo 
    PORTA_T
    Interrupcion
    Timer_Contador
    endc
    
    
TMR0_Valor   EQU   d'252'      ; Valor a cargar al TMR0       
   ORG   0x00
   GOTO   Inicio
   ORG   0X04      ; Atiendo la interrupción
    GOTO    Velocidad

Inicio   
    BSF       STATUS,5     ; configurando puertos
   MOVLW   B'00011111'  ; puerto A son entradas
    MOVWF   TRISA
    MOVLW   B'00000000'
    MOVWF   TRISB          ; puerto B son salidas
    movlw   b'00000111'      ; TMR0 con prescaler de 256.
   movwf   OPTION_REG   
   
    BCF       STATUS,5
    CLRF    PORTB      ; limpiamos PORTB
    CLRF    PORTA       ; limpiamos PORTA 
    BCF     Activo,0
Cargar 
    MOVLW   d'3'
    MOVWF   Alto
    MOVLW   d'7'
    MOVWF   Bajo
    CLRF    PORTA_T
    BCF     Activo,0  ;Verifica si el carro esta parado
    BCF     Interrupcion,0
    MOVLW   d'1'
    MOVWF   Timer_Contador
Principal 
    MOVF    PORTA,W        ;Si PORTA es diferente a PORTA_T hay cambio
    XORWF   PORTA_T,W      ;Si PORTA es igual a PORTA_T no hay cambio o
    BTFSC   STATUS,Z       ;es `posible un rebote continua en el bucle
    GOTO    Principal
   
    MOVF   PORTA,W           
    XORLW  0x15          ;   b'00010101'  d'021'
    BTFSC  STATUS,Z
    CALL   ADELANTE
    MOVF   PORTA,W       
    XORLW  0x1A          ;   b'00011010'  d'026'
    BTFSC  STATUS,Z
    CALL   ATRAS
    MOVF   PORTA,W       
    XORLW  0x16          ;   b'00010110'  d'022'
    BTFSC  STATUS,Z
    CALL   DERECHA
    MOVF   PORTA,W       
    XORLW  0x19          ;   b'00011001'  d'025'
    BTFSC  STATUS,Z
    CALL   IZQUIERDA
    MOVF   PORTA,W       
    XORLW  0x13          ;   b'00010011'  d'019'
    BTFSC  STATUS,Z
    CALL   PARAR
    MOVF   PORTA,W       
    XORLW  0x12          ;   b'00010010'  d'18'
    BTFSC  STATUS,Z
    CALL   Vel_1
    MOVF   PORTA,W       
    XORLW  0x1E          ;   b'00011110'  d'30'
    BTFSC  STATUS,Z
    CALL   Vel_2
    MOVF   PORTA,W       
    XORLW  0x17          ;   b'00010111'  d'23'
    BTFSC  STATUS,Z
    CALL   Vel_3   
   
    MOVF   PORTA,W
    MOVWF  PORTA_T
    BTFSS  Interrupcion,0
    GOTO   Deshabilita_interrupcion
    GOTO   Habilita_interrupcion
   
    GOTO   Principal

Habilita_interrupcion
    MOVLW  b'10100000'
    MOVWF  INTCON
    GOTO   Principal

Deshabilita_interrupcion   
    CLRF   INTCON
    GOTO   Principal

ADELANTE
    BSF    Activo,0
    BSF    PORTB,7
    BCF    PORTB,6
    BSF    PORTB,5
    BCF    PORTB,4
    BSF    Interrupcion,0
    RETURN

ATRAS
    BSF    Activo,0
    BCF    PORTB,7
    BSF    PORTB,6
    BCF    PORTB,5
    BSF    PORTB,4
    BSF    Interrupcion,0
    RETURN
   
DERECHA
    BSF    Activo,0
    BSF    PORTB,7
    BCF    PORTB,6
    BCF    PORTB,5
    BSF    PORTB,4
    BSF    Interrupcion,0
    RETURN
   
IZQUIERDA
    BSF    Activo,0
    BCF    PORTB,7
    BSF    PORTB,6
    BSF    PORTB,5
    BCF    PORTB,4
    BSF    Interrupcion,0
    RETURN

PARAR
    MOVLW   d'3'
    MOVWF   Alto
    MOVLW   d'7'
    BCF    Activo,0
    BCF    Interrupcion,0
    MOVLW  b'00000000'
    MOVWF  PORTB
    RETURN
   
Vel_1
    BTFSS   Activo,0   ; Si esta en movimiento se puede
    RETURN             ; afectar la velocidad
    MOVLW   d'3'
    MOVWF   Alto
    MOVLW   d'7'
    MOVWF   Bajo
    BSF    Interrupcion,0
    RETURN
Vel_2
    BTFSS   Activo,0   ; Si esta en movimiento se puede
    RETURN             ; afectar la velocidad
    MOVLW   d'6'
    MOVWF   Alto
    MOVLW   d'4'
    MOVWF   Bajo
    BSF    Interrupcion,0
    RETURN

Vel_3
    BTFSS   Activo,0   ; Si esta en movimiento se puede
    RETURN             ; afectar la velocidad
    BSF     PORTB,3
    BSF     PORTB,2
    BCF    Interrupcion,0
    RETURN

    CBLOCK   
   Guarda_W
   Guarda_STATUS
   ENDC
   
Velocidad
    movwf   Guarda_W      ; Guarda W y STATUS.
   swapf   STATUS,W      ; Ya que "movf STATUS,W" corrompe el bit Z.
   movwf   Guarda_STATUS
   bcf       STATUS,RP0      ; Para asegurarsede que trabaja con el Banco 0.
    movlw    TMR0_Valor
   movwf    TMR0
   decfsz    Timer_Contador,F   ; Decrementa el contador.
   goto    FinInterrupcion
   btfsc    PORTB,3      ; Testea el anterior estado de la salida.
   goto    EstabaAlto
EstabaBajo
   bsf       PORTB,3   ; Estaba bajo y lo pasa a alto.
   bsf       PORTB,2   
   movf   Alto,W      ; Repone el contador nuevamente con el tiempo en
   movwf    Timer_Contador      ; alto.
   goto    FinInterrupcion
EstabaAlto
   bcf    PORTB,3      ; Estaba alto y lo pasa a bajo.
   bcf       PORTB,2
   movf   Bajo,W      ; Repone el contador nuevamente con el tiempo
   movwf    Timer_Contador          ; en bajo.
FinInterrupcion
   swapf   Guarda_STATUS,W      ; Restaura el STATUS.
   movwf   STATUS
   swapf   Guarda_W,F      ; Restaura W como estaba antes de producirse
   swapf   Guarda_W,W      ; interrupción.
   Bcf       INTCON,RBIF
   Bcf     INTCON,T0IF
   retfie
   
;==========================================================================
    END
;==========================================================================

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: PIC16f84A+PWM+Interrupcion+cambio giro motor
« Respuesta #5 en: 07 de Noviembre de 2011, 09:18:16 »
Si ya te funciona pues muy bien.

En el L293D puedes poner los enables, pines 1 y 9 a VCC directamente y te ahorras los pines RB2 Y RB3 del PIC y simplicas el programa un poco.

Esto me despista un poco.

Código: [Seleccionar]
TMR0_Valor   EQU   d'252'      ; Valor a cargar al TMR0       
Pero bueno funciona, lo logico es guardarlo en RAM y leerlo, porque despues haces.

Código: [Seleccionar]
movlw    TMR0_Valor
   movwf    TMR0

Y te carga el TIMER con el valor 252, nunca habia visto hacerlo asi, pero bueno si funciona.

El TMR0 para temporizar 1ms puedes usar un preescaler mas pequeño 1/4 en vez de 1/256 asi consigues el tiempo con mas exactitud.

El cblock deberias de ponerlo todo junto y no unos arriba y otros en medio del programa, porque tu lo sabes pero si lo mira otra persona se vuelve loca.


Desconectado Omar266

  • PIC10
  • *
  • Mensajes: 13
Re: PIC16f84A+PWM+Interrupcion+cambio giro motor
« Respuesta #6 en: 08 de Noviembre de 2011, 14:33:55 »
Hola Tapia8, me sugiere poner los enables, pines 1 y 9 a VCC directamente y ahorrarme los pines RB2 Y RB3 del PIC, mi duda es que por ellos estoy enviando los pulsos del pwm, la verdad no entiendo.
Me podría decir como guardar el valor del TMRO en RAM. Muchas gracias

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: PIC16f84A+PWM+Interrupcion+cambio giro motor
« Respuesta #7 en: 09 de Noviembre de 2011, 06:25:10 »
Citar
Hola Tapia8, me sugiere poner los enables, pines 1 y 9 a VCC directamente y ahorrarme los pines RB2 Y RB3 del PIC, mi duda es que por ellos estoy enviando los pulsos del pwm, la verdad no entiendo.

Pues si los enables estan siempre habilitados, haces PWM por RB4, MT2 girara en un sentido y si lo haces por RB5 MT2 en sentido contrario y para MT1 igual con RB6 y RB7, en pag. 10 de este data viene un esquema. Es una sugerencia si asi te funciona.......


javascript:openreq('http://www.datasheetcatalog.org/datasheet/texasinstruments/l293d.pdf')

Citar
Me podría decir como guardar el valor del TMRO en RAM. Muchas gracias

Tal y como esta en tu programa no vale la pena guardarlo en RAM porque la temporizacion es siempre la misma, pero no necasitas definirlo

Citar
TMR0_Valor   EQU   d'252'      ; Valor a cargar al TMR0       

Con hacer aqui.

Citar
movlw     d'252'
   movwf    TMR0

Es la manera normal de hacerlo. Me sorprendio como lo hiciste tu, porque nunca lo habia visto.

Quieres temporizar 1ms y con el preescaler en 1/256 como tu lo tienes te desborda a los 1024us mas algunos us que consumes en activar o desactivar el L293, y algunos en cargar de nuevo el timer, si el preescaler lo pones en 1/4 puedes temporizar con mas exactitud 1ms e incluso rebajar 4 o 8us para que el tiempo total sea 1ms exacto.
No se si has visto este hilo, ahi te explica todo muy bien:

http://www.todopic.com.ar/foros/index.php?topic=24720.0


Desconectado Omar266

  • PIC10
  • *
  • Mensajes: 13
Re: PIC16f84A+PWM+Interrupcion+cambio giro motor
« Respuesta #8 en: 15 de Noviembre de 2011, 19:19:23 »
Gracias por su colaboración, he hecho los cambios necesarios al momento me está trabajando bien, aplique el preescaler 1/4 cargando TMR0 con 6. Me gustaría hacer otra pregunta que tan fácil o difícil es hacer operaciones matemáticas en assembler.  O que otro lenguaje seria.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: PIC16f84A+PWM+Interrupcion+cambio giro motor
« Respuesta #9 en: 16 de Noviembre de 2011, 06:09:24 »
Mirate este hilo, en concreto en la respuesta 13 tienes varias rutinas de operaciones aritmeticas.

http://www.todopic.com.ar/foros/index.php?topic=23812.0

En assembler son complicadas de hacer, seguramente C sea el mejor.


Desconectado Omar266

  • PIC10
  • *
  • Mensajes: 13
Re: PIC16f84A+PWM+Interrupcion+cambio giro motor
« Respuesta #10 en: 27 de Marzo de 2012, 18:53:26 »
Hola Tapia8, he decidido migrar al 16F628A y en el fututo al 16F876A. He hecho un programa más sencillo consta de cuatro leds conectados a RB4…RB7, se prenden de acuerdo con el pulsador enviado por la parte transmisora, y un quinto led que va  a RB0 el cual prende tan pronto se inicia el PIC. Lo probé con el 16F84A y funciono, mientras con el  16F628A no, tan solo prende el quinto led (RB0), parece que no lee el puerto A. Hice los siguientes cambios: Fuses, reloj interno y deshabilitar los comparadores del puertoA.

;Este programa se utiliza para recibir la señal de un control remoto via RF
;para mover un carro => ADELANTE => ATRAS => DERECHA => IZQUIERDA Y PARAR
;**********************************************************
;**   CONFIGURACION DEL DISPOSITIVO    ***
;*********************************************************
   LIST      P=16F628A
  INCLUDE  <P16F628A.INC>
    __CONFIG  _CP_OFF &  _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON
   
;**********************************************************
;**   ASIGNAMOS LAS VARIABLES DE LOS REGISTROS DE RAM ***
;**********************************************************
 cblock  0x21
 PORTA_T     
 endc
;**********************************************************
;**   ESCRITURA DEL PROGRAMA DEL PIC    ***
;**********************************************************
    Org 0x0000
    GOTO INICIO
;**********************************************************
;**   CONFIGURAMOS PUERTOS DEL PIC     ***
;********************************************************** 
INICIO
    CLRF   PORTA
    MOVLW  0x7    ; Configuro Comparador Analogico
    MOVWF  CMCON   ; V1in-=GND, V1in+=GND, C1out=Off| V2in-=GND, V2in+=GND, C2out=Off

    BCF    STATUS,RP1
    BSF    STATUS,RP0    ;SELECCIONAMOS EL BANCO 1
    CLRF   TRISB         ;PORTB como salida
    MOVLW  B'00111111'       
    MOVWF  TRISA         ;PORTA como entrada
    BCF    STATUS,RP0    ;SELECCIONAMOS EL BANCO 0
    CLRF   PORTA         ;PuertoA a cero
    CLRF   PORTB         ;PuertoB a cero
    CLRF   PORTA_T
    MOVLW  b'00000001'
    MOVWF   PORTB

;**********************************************************
;**   EMPEZAMOS CON EL PROGRAMA     ***
;**********************************************************
LEER_RF
    MOVF    PORTA,W    ;Si PORTA es diferente a PORTA_T hay cambio
    XORWF   PORTA_T,W  ;Si PORTA es igual a PORTA_T no hay cambio
    BTFSC   STATUS,Z   ;o es `posible un rebote
    GOTO    LEER_RF
           
    MOVF   PORTA,W           
    XORLW  0x15          ;   b'00010101'  d'021' ADELANTE
    BTFSC  STATUS,Z
    CALL   ADELANTE
    MOVF   PORTA,W       
    XORLW  0x1A          ;   b'00011010'  d'026' ATRAS
    BTFSC  STATUS,Z
    CALL   ATRAS
    MOVF   PORTA,W       
    XORLW  0x19          ;   b'00011001'  d'025' IZQUIERDA
    BTFSC  STATUS,Z
    CALL   IZQUIERDA
    MOVF   PORTA,W       
    XORLW  0x16          ;   b'00010110'  d'022' DERECHA
    BTFSC  STATUS,Z
    CALL   DERECHA
    MOVF   PORTA,W       
    XORLW  0x13          ;   b'00010011'  d'019' PARAR
    BTFSC  STATUS,Z
    CALL   PARAR
   
    GOTO   LEER_RF

ADELANTE
    MOVF   PORTA,W
    MOVWF  PORTA_T
    CALL   RESSET
    MOVLW  b'10100000'
    XORWF  PORTB
    RETURN

ATRAS
    MOVF   PORTA,W
    MOVWF  PORTA_T
    CALL   RESSET
    MOVLW  b'01010000'   
    XORWF  PORTB
    RETURN
   
DERECHA
    MOVF   PORTA,W
    MOVWF  PORTA_T
    CALL   RESSET             
    MOVLW  b'01100000'
    XORWF  PORTB
    RETURN
   
IZQUIERDA
    MOVF   PORTA,W
    MOVWF  PORTA_T
    CALL   RESSET
    MOVLW  b'10010000'
    XORWF  PORTB
    RETURN

PARAR
    MOVF   PORTA,W
    MOVWF  PORTA_T
    CALL   RESSET
    MOVLW  b'00000000'
    XORWF  PORTB
    RETURN

RESSET 
    CLRF   PORTA         ;Puerto A a cero       
    CLRF   PORTB         ;Puerto B a cero
    RETURN

    END 
« Última modificación: 27 de Marzo de 2012, 19:08:56 por Omar266 »

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: PIC16f84A+PWM+Interrupcion+cambio giro motor
« Respuesta #11 en: 29 de Marzo de 2012, 13:10:42 »
A mi en principio me tiras errores en la configuracion:

__CONFIG  _CP_OFF &  _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON

Dice que esto esta mal.

]_DATA_CP_OFF [/

Se lo quite y en vez de compilar, me tira dos errores en vez de uno. Le quite toda la confguracion de FUSES y lo configure desde el propio MPLAB y compilo, le meti en PORTA 0x19 y fue a esa secuencia me puso en PORTB 10010000, es decir apago RBO y encendio RB4 y RB7, no probe todas las secuencias pero por lo que veo tambien deben funcionar, si no hay cambios en PORTA si que se queda al principio, que creo que es lo que tiene que hacer, es que ya no recuerdo bien de que iba la cosa.

Desconectado Omar266

  • PIC10
  • *
  • Mensajes: 13
Re: PIC16f84A+PWM+Interrupcion+cambio giro motor
« Respuesta #12 en: 03 de Abril de 2012, 19:35:58 »
Hola, a decir verdad me está pasando lo mismo con las versiones de MPLAB 8.83 y 8.84 bajadas directamente de Microchip. Tengo también versión 8.43 con esta hice la compilación. Estuve revisando los archivos 16F628A.INC de las versiones 8.43, 8.83 y 8.84 de MPLAB. En la 8.43 figura  _DATA_CP_OFF  y _DATA_CP_ON  pero en las versiones 8.83 y 8.84 figuran DATA_CP_OFF y DATA_CP_OFF, creo que es por eso.  

En cuanto a lo otro tengo el circuito en la protoboard. Con el PIC16F84A, el pin RA5 RESET conecte una resistencia de 10K a VDD (5v), como tiene que ser y trabajo muy bien. Luego cambie al PIC16F628A  conecte la resistencia a VDD y no funciona por lo que la cambie a Ground y me está funcionando. Esto es normal, pues se supone que se debe conectar a VDD.

Quiero aprovechar la ocasión, con todas estas dudas hice un programa de secuencia de luces para el PIC16F84A y otro para el PIC 16F628A cambiando los fuses y configurando PORTA habilitando los pines como I/O en CMCON. Lo tengo en la protoboard. Probando el circuito con 16F84A tengo que conectar una resistencia (10K) del RA5 a VDD como tiene que ser. Si algo reset con el pulsador conectado Vcc se reinicia el programa lo cual está bien. El problema es con el 16F628A  no conecto ninguna resistencia, conecto la resistencia a VDD o la conecto a VCC el programa funciona, y si hago el reset con el pulsador no funciona. Es esto normal. La verdad estoy muy desconcertado, tengo tres integrados uno de esto los compre hoy pensando que pudiese ser el integrado pero nada.  Muchas gracias.

LIST      P=16F628A
  INCLUDE  <P16F628A.INC>
    __CONFIG  _CP_OFF &  _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON
;**********************************************************
;**   ASIGNAMOS LAS VARIABLES DE LOS REGISTROS DE RAM ***
;**********************************************************
 cblock  0x21   
R_ContA   ; Contadores para los retardos.
   R_ContB
 endc
#DEFINE  LED0   PORTB,0
#DEFINE  LED1   PORTB,1
#DEFINE  LED2   PORTB,2
#DEFINE  LED3   PORTB,3
#DEFINE  LED4   PORTB,4
#DEFINE  LED5   PORTB,5
#DEFINE  LED6   PORTB,6
#DEFINE  LED7   PORTB,7
;**********************************************************
;**   ESCRITURA DEL PROGRAMA DEL PIC    ***
;**********************************************************
    Org 0x0000
    GOTO INICIO
;**********************************************************
;**   CONFIGURAMOS PUERTOS DEL PIC     ***
;**********************************************************  
INICIO
    CLRF PORTA ;Initialize PORTA by setting output data latches
    MOVLW  0x7    ; Configuro Comparador Analogico
    MOVWF  CMCON   ; V1in-=GND, V1in+=GND, C1out=Off| V2in-=GND, V2in+=GND, C2out=Off
    BCF    STATUS,RP1
    BSF    STATUS,RP0    ;SELECCIONAMOS EL BANCO 1
    CLRF   TRISB         ;PORTB como salida
    MOVLW  B'01111011'         ;   b'00011111'  d'031'
    MOVWF  TRISA         ;PORTA como entrada
    BCF    STATUS,RP0    ;SELECCIONAMOS EL BANCO 0
    CLRF   PORTA         ;PuertoA a cero
    CLRF   PORTB         ;PuertoB a cero
    BSF    PORTA,2
;**********************************************************
;**   EMPEZAMOS CON EL PROGRAMA     ***
;**********************************************************
Principal
       bsf       LED0         ; Enciende el LED
       call       Retardo_200ms      ; durante la suma de este tiempo.
       bcf       LED0         ; Lo apaga durante la suma de los siguientes

       bsf       LED1         ; Enciende el LED
       call   Retardo_200ms      ; durante la suma de este tiempo.
       bcf       LED1         ; Lo apaga durante la suma de los siguientes

      bsf       LED2         ; Enciende el LED
      call   Retardo_200ms      ; durante la suma de este tiempo.
      bcf       LED2         ; Lo apaga durante la suma de los siguientes

      bsf       LED3         ; Enciende el LED
      call   Retardo_200ms      ; durante la suma de este tiempo.
      bcf       LED3         ; Lo apaga durante la suma de los siguientes

      bsf       LED4         ; Enciende el LED
      call   Retardo_200ms      ; durante la suma de este tiempo.
      bcf       LED4         ; Lo apaga durante la suma de los siguientes

      bsf       LED5         ; Enciende el LED
      call   Retardo_200ms      ; durante la suma de este tiempo.
      bcf       LED5         ; Lo apaga durante la suma de los siguientes

      bsf       LED6         ; Enciende el LED
      call   Retardo_200ms      ; durante la suma de este tiempo.
      bcf       LED6         ; Lo apaga durante la suma de los siguientes

      bsf       LED7         ; Enciende el LED
      call   Retardo_200ms      ; durante la suma de este tiempo.
      bcf       LED7         ; Lo apaga durante la suma de los siguientes

      call   Retardo_200ms
      goto    Principal

; Subrutinas "Retardo_200ms" y "Retardo_100ms"-------------------------------------------
Retardo_200ms            ; La llamada "call" aporta 2 ciclos máquina.
   movlw   d'200'         ; Aporta 1 ciclo máquina. Este es el valor de "M".
   goto   Retardos_ms      ; Aporta 2 ciclos máquina.
Retardo_100ms            ; La llamada "call" aporta 2 ciclos máquina.
   movlw   d'100'         ; Aporta 1 ciclo máquina. Este es el valor de "M".
   goto   Retardos_ms      ; Aporta 2 ciclos máquina.
Retardo_1ms            ; La llamada "call" aporta 2 ciclos máquina.
   movlw   d'1'         ; Aporta 1 ciclo máquina. Este es el valor de "M".
;
; El próximo bloque "Retardos_ms" tarda:
; 1 + M + M + KxM + (K-1)xM + Mx2 + (K-1)Mx2 + (M-1) + 2 + (M-1)x2 + 2 =
; = (2 + 4M + 4KM) ciclos máquina. Para K=249 y M=1 supone 1002 ciclos máquina
; que a 4 MHz son 1002 µs = 1 ms.
;
Retardos_ms
   movwf   R_ContB         ; Aporta 1 ciclo máquina.
R1ms_BucleExterno
   movlw   d'249'         ; Aporta Mx1 ciclos máquina. Este es el valor de "K".
   movwf   R_ContA         ; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
   nop            ; Aporta KxMx1 ciclos máquina.
   decfsz   R_ContA,F      ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
   goto   R1ms_BucleInterno       ; Aporta (K-1)xMx2 ciclos máquina.
   decfsz   R_ContB,F      ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
   goto   R1ms_BucleExterno    ; Aporta (M-1)x2 ciclos máquina.
   return            ; El salto de retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_200ms:   2 + 1 + 2 + (2 + 4M + 4KM) = 200007 cm = 200 ms. (M=200 y K=249).
; - Retardo_100ms:   2 + 1 + 2 + (2 + 4M + 4KM) = 100007 cm = 100 ms. (M=100 y K=249).
; - Retardo_1ms  :   2 + 1     + (2 + 4M + 4KM) =   1005 cm =   1 ms. (M=  1 y K=249).

   END
« Última modificación: 03 de Abril de 2012, 19:52:16 por Omar266 »

Desconectado Omar266

  • PIC10
  • *
  • Mensajes: 13
Re: PIC16f84A+PWM+Interrupcion+cambio giro motor
« Respuesta #13 en: 05 de Abril de 2012, 15:30:12 »
Quiero agradecer muchisisimo por su ayuda, el problema era en la grabación, pues estaba deshabilitado los fuses, ya que al hacer mi grabadora y al configurar la IC-Prog por primera vez, en la instrucciones dadas por alguien para el 16F84A dice .... “debemos dejar sin activar las opciones PWRT y CP, para evitar quemar los bits de seguridad de no lectura, probablemente no permita volver a programar el chip si se trata de un reprogramable.” , y pensé que se aplicaba para todos. Gracias..


 

anything