Autor Tema: Problema con PWM  (Leído 1947 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Juan_PIC

  • PIC12
  • **
  • Mensajes: 84
Problema con PWM
« en: 13 de Julio de 2007, 21:06:38 »
Hola amigos del foro. Les cuento lo que anda sucediendo, hice un programa para pic16f877a el cual recibe por el pin RD7 informacion serie. Este programa la interpreta, y debe generar el PWM correcto y setear o borrar unos pines. El problema, es que el programa se resetea, (cada vez que se resetea intercambia el estado de RB7), y cuando mido con el multimetro, la pata tiene 2,5 voltios, es decir que evidentemnete se resetea.
Lo extraño, (aun mas), es que comentando (borrando) las lineas que escriben o borran el duty time, el pic no se resetea y el programa funciona excelente, pero no tengo PWM que es vital en mi proyecto.
Alguien sabe algo al respecto? :?
Desde ya muchas gracias, y aca les dejo el programa. Saludos. :-)



;******************************************************************************************************************************************************
;--------------------------------------------RECIBE LA CADENA DE BITS EN EL PROTOCOLO CREADO Y GENERA EL PWM-------------------------------------------
;******************************************************************************************************************************************************


   #include <P16F877A.inc>

   cblock   0x20
   SEMIPER_A
   SEMIPER_B
   RESTA
   BUFFER
   CONT_DATO
   CONT_SYNC
   TIEMPO
   FLAGS
   DATO_Y         ;RECIBIDO
   DATO_X
   VAL_X
   VAL_Y               ;MODIFICADO
   VAL_X_Y         ;MODIFICADO

   CONT1

   endc


   #define   PIN_SERIE   PORTD,7
   #define   BANCO0      BCF STATUS,RP0
   #define   BANCO1      BSF STATUS,RP0

   #define DUTY_IZ         CCPR1L
   #define   DUTY_DE         CCPR2L

   #define   FLAG_ERR   FLAGS,0
   #define   FLAG_SYNC   FLAGS,1
   #define   FLAG_BIT   FLAGS,2
   #define   DERECHA      FLAGS,3
   #define   IZQUIERDA   FLAGS,4
   

   ORG   0x00
   NOP
   GOTO   MAIN
   ORG     0x05
   
MAIN   BANCO1
   CLRF   TRISB      ;PORTB COMO SALIDA
   CLRF   TRISC
   CLRF   TRISD
        BSF   TRISD,7      ;RC7 COMO ENTRADA DE DATOS SERIE
   
        BCF   OPTION_REG,T0CS     ;CONTAR INSTRUCCIONES
   BCF   OPTION_REG,PSA      ;PRESCALER A WDT
   BCF   OPTION_REG,PS2       ;PRESCALER 1:8
   BSF   OPTION_REG,PS1      ;
   BCF   OPTION_REG,PS0      ;
   MOVLW   d'255'
   MOVWF   PR2


   BANCO0
   BCF   T2CON,TOUTPS3
        BCF   T2CON,TOUTPS2
   BCF   T2CON,TOUTPS1
   BCF   T2CON,TOUTPS0
   BSF   T2CON,TMR2ON
   BSF   T2CON,T2CKPS1      ;PRESCALER 1:16
   BCF   T2CON,T2CKPS0
   BSF   CCP1CON,CCP1M3
   BSF     CCP1CON,CCP1M2
   BSF     CCP2CON,CCP2M3
   BSF     CCP2CON,CCP2M2
   
   BCF   INTCON,GIE

   BTFSS   PORTB,7
   GOTO   PON1
   BCF   PORTB,7
   GOTO   LALA
PON1   BSF   PORTB,7
LALA
   
ERR   BANCO0
   CLRF   DUTY_IZ
   CLRF   DUTY_DE
        CLRF   SEMIPER_A
   CLRF   SEMIPER_B
   CLRF   RESTA
   CLRF   BUFFER
   CLRF   CONT_DATO
   CLRF    FLAGS
   CLRF    TIEMPO
   CLRF    CONT_SYNC
   CLRF   VAL_Y
   CLRF   VAL_X_Y
   CLRF   VAL_X
   CLRF   DATO_Y                      
   CLRF   DATO_X   
   ;CLRF   PORTB
   CLRF   PORTC
   CLRF   PORTD
   CLRF   PORTE
;---------------------------------------------------------------PROGRAMA PRINCIPAL---------------------------------------------------------------------------
   
   CALL   ESPERA_0          ;Epera un 0 pero no por mas de 1500uS
   CALL   ESPERA_1         ;Epera un 1 pero no por mas de 1500uS
   BTFSC   FLAG_ERR
   GOTO    ERR 
        CLRF   TMR0         ;Inicia medicion de tiempo
   
PPAL3   MOVLW   d'3'
   MOVWF   CONT_SYNC
PPAL2   CALL   RECIBE_SIMBOLO       ;ESPERA EL BIT Y MIRA SI ES DATO O SYNC MEDIANTE EL VALOR DE CONT_DATO
   BTFSC   FLAG_ERR
   GOTO   ERR
   BTFSS   FLAG_SYNC
   GOTO   PPAL3
   DECFSZ   CONT_SYNC,F              ;ES SYNC
   GOTO   PPAL2                    ;ESPERA 3 PULSOS DE SYNC
   
PPAL    CALL   RECIBE_SIMBOLO       ;ESPERA LLEGADA DE BIT
   BTFSC   FLAG_ERR
   GOTO   ERR         ;SE PRODUJO ERROR, VOLVER A EMPEZAR      
   BTFSC   FLAG_SYNC   
   GOTO   PPAL
   BTFSC   FLAG_BIT
   GOTO   ESC_1
   CALL    ESCRIBE_0
   GOTO   SIGUE
ESC_1   CALL   ESCRIBE_1
SIGUE   MOVLW   0x08            ;REVISA QUE SE HAYA RECIVIDO EL BYTE COMPLETO
   XORWF   CONT_DATO,W     ;
   BTFSS   STATUS,Z        ;
        GOTO   PPAL           ;SIGUE ALMACENANDO
   CLRF   CONT_DATO   ;BORRAR EL CONTADOR Y SEGUIR
        MOVF   BUFFER,W        ;PONE EL BYTE EN EL PORT-B
   CALL   ANALIZAR       ;1)SEPARAR Y y X   OBTENER VALOR (X+Y)    2)ESTABLECER SENTIDOS DE GIRO  CARGAR PWM CON VALORES DE TABLA
   CALL   DELAY100
   CALL   DELAY100
    GOTO   PPAL3           ;VUELVE A EMPEZAR

;------------------------------------------------------------------------------------------------------------------------------------------------------
;-----------------------------------------------------------------SUBRRUTINAS--------------------------------------------------------------------------
;------------------------------------------------------------------------------------------------------------------------------------------------------         
         ;Si llega un 0 sale con FLAG_BIT=0
         ;Si llega un 1 sale con FLAG_BIT=1
         ;Si llega un SYNC sale con FLAG_SYNC=1
         ;Si hay error sale con FLAG_ERR=1

;------------------------------------------------------------------------------------------------------------------------------------------------------     
RECIBE_SIMBOLO

   ;Espera un 0 pero no por mas de 1500uS
   
   CALL   ESPERA_0
   
   BTFSC   FLAG_ERR
   RETURN
   ;Almacena el valor de tiempo del 1   
   MOVF   TMR0,W
   MOVWF   SEMIPER_A
   ;Inicia medicion de tiempo
   CLRF   TMR0   
   ;Espera un 1 pero no por mas de 1500uS
   CALL   ESPERA_1
   BTFSC   FLAG_ERR
   RETURN
   ;Almacena el valor de tiempo del 0
   MOVF   TMR0,W
   MOVWF   SEMIPER_B   
   ;Inicia medicion de tiempo
   CLRF   TMR0
   CALL   COMPARAR

   RETURN

;------------------------------------------------------------------------------------------------------------------------------------------------------
ESPERA_0
   MOVLW   d'250'
   MOVWF   TIEMPO
ESP_0_2   BTFSS   PIN_SERIE
   RETURN
   NOP
   DECFSZ   TIEMPO,F
   GOTO   ESP_0_2
   BSF   FLAG_ERR
      RETURN
      
;------------------------------------------------------------------------------------------------------------------------------------------------------   
ESPERA_1
   MOVLW   d'250'
   MOVWF   TIEMPO
ESP_1_2   BTFSC   PIN_SERIE
   RETURN
   NOP
   DECFSZ   TIEMPO,F
   GOTO   ESP_1_2
   BSF   FLAG_ERR
   RETURN

;------------------------------------------------------------------------------------------------------------------------------------------------------
COMPARAR
        CLRF   FLAGS
UNO   ;COMPARAR SEMIPER_A CON VALOR DE 1 (LARGO)
   MOVLW   d'112'      ;900uS
   SUBWF   SEMIPER_A,W
   BTFSS   STATUS,C   ;HUBO BORROW? (EL BIT C SE PONE EN 0 CUANDO SE PRODUCE BORROW)
   GOTO   CERO      ;SIGUE   CON EL SIGUIENTE SIMBOLO
   MOVLW   d'137'      ;1100uS
   SUBWF   SEMIPER_A,W
   BTFSS   STATUS,C   ;HUBO BORROW? (EL BIT C SE PONE EN 0 CUANDO SE PRODUCE BORROW)
   GOTO   UNO_2
   BSF   FLAG_ERR   ;ERROR - SALIR
   RETURN
   ;COMPARAR SEMIPER_B CON VALOR DE 0 (CORTO)
UNO_2   MOVLW   d'75'      ;600uS
   SUBWF   SEMIPER_B,W
   BTFSC   STATUS,C   ;HUBO BORROW? (EL BIT C SE PONE EN 0 CUANDO SE PRODUCE BORROW)
   GOTO   CERO      ;NO ES UN 1. SIGUE CON EL SIGUIENTE SIMBOLO
   MOVLW   d'50'      ;400uS
   SUBWF   SEMIPER_B,W
   BTFSC   STATUS,C   ;HUBO BORROW? (EL BIT C SE PONE EN 0 CUANDO SE PRODUCE BORROW)
   GOTO   UNO_3
   BSF   FLAG_ERR   ;ERROR - SALIR
   RETURN   
UNO_3   BSF   FLAG_BIT   ;ES "1"
   RETURN
   
CERO   ;COMPARAR SPER_A CON VALOR DE 1 (CORTO)
   MOVLW   d'75'      ;600uS
   SUBWF   SEMIPER_A,W
   BTFSC   STATUS,C   ;HUBO BORROW? (EL BIT C SE PONE EN 0 CUANDO SE PRODUCE BORROW)
   GOTO   SYNCR      ;SIGUE   CON EL SIGUIENTE SIMBOLO
   MOVLW   d'50'      ;400uS
   SUBWF   SEMIPER_A,W
   BTFSC   STATUS,C   ;HUBO BORROW? (EL BIT C SE PONE EN 0 CUANDO SE PRODUCE BORROW)
   GOTO   CERO_2
   BSF   FLAG_ERR   ;ERROR - SALIR
   RETURN            
   ;COMPARAR SEMIPER_B CON VALOR DE 0 (LARGO)
CERO_2   MOVLW   d'112'      ;900uS
   SUBWF   SEMIPER_B,W
   BTFSS   STATUS,C   ;HUBO BORROW? (EL BIT C SE PONE EN 0 CUANDO SE PRODUCE BORROW)
   GOTO   SYNCR      ;SIGUE   CON EL SIGUIENTE SIMBOLO
   MOVLW   d'137'      ;1100uS
   SUBWF   SEMIPER_B,W
   BTFSS   STATUS,C   ;HUBO BORROW? (EL BIT C SE PONE EN 0 CUANDO SE PRODUCE BORROW)
   GOTO   CERO_3
   BSF   FLAG_ERR   ;ERROR - SALIR
   RETURN   
CERO_3   BCF   FLAG_BIT   ;ES "0"
   RETURN

SYNCR   BSF   FLAG_SYNC   ;SI NO ES "0" NI "1", Y ESTA DENTRO DE 600uS Y 900uS, ES SYNC
   RETURN

;------------------------------------------------------------------------------------------------------------------------------------------------------
ESCRIBE_0
   BCF   STATUS,C        ;ES     "0"   (PONE UN 0 EN EL BIT A ESCRIBIR)
   RLF   BUFFER,F        ;CORRE BUFFER A LA IZQUIERDA PARA LUEGO ESCRIBIR EL PROXIMO BIT
   INCF   CONT_DATO,F
   RETURN
   
;------------------------------------------------------------------------------------------------------------------------------------------------------   
ESCRIBE_1
   BSF   STATUS,C        ;ES     "0"   (PONE UN 0 EN EL BIT A ESCRIBIR)
   RLF   BUFFER,F        ;CORRE BUFFER A LA IZQUIERDA PARA LUEGO ESCRIBIR EL PROXIMO BIT
   INCF   CONT_DATO,F
   RETURN
         
;------------------------------------------------------------------------------------------------------------------------------------------------------
ANALIZAR
   ;1)
   ANDLW   b'00001111'
   MOVWF   DATO_Y      ;DATO_Y
   SWAPF   BUFFER,W
        ANDLW   b'00001111'
   MOVWF   DATO_X      ;DATO_X

   ;2)
   MOVF   DATO_Y,W
   CALL   TABLA_X_Y
   MOVWF   VAL_Y
   MOVF   DATO_X,W
   CALL   TABLA_X_Y 
   MOVWF   VAL_X
   ADDWF   VAL_Y,W
   MOVWF   VAL_X_Y
   CLRF   DUTY_IZ      ;DESACTIVAR PWM
   CLRF   DUTY_DE      ;
   CALL   ASK_X      ;ANALIZA LA COMPONENTE X
   MOVLW   0x00
   XORWF   VAL_Y,W     
   BTFSC   STATUS,Z
   GOTO   CENTRO
   BTFSC   DATO_Y,3
   GOTO   ATRAS
   GOTO   ADELANTE

CENTRO   
   BTFSC   DERECHA
   GOTO    C_41
   BTFSC   IZQUIERDA
   GOTO    C_23
   GOTO   C_0

ATRAS   
   BTFSC   DERECHA
   GOTO    C_4
   BTFSC   IZQUIERDA
   GOTO    C_3
   GOTO   C_34

ADELANTE
   BTFSC   DERECHA
   GOTO    C_1
   BTFSC   IZQUIERDA
   GOTO    C_2
   GOTO   C_12   

C_0
      CLRF   DUTY_IZ
   CLRF   DUTY_DE
   CALL   AD_AD      ;SOLO PARA PROBAR. BORRAR ESTA LINEA
   RETURN
C_1
   MOVF   VAL_Y,W
   MOVWF   DUTY_DE
   MOVF   VAL_X_Y,W
   MOVWF   DUTY_IZ
   CALL   AD_AD   
   RETURN
C_12
   MOVF   VAL_X_Y,W
   MOVWF   DUTY_DE
   MOVWF   DUTY_IZ
   CALL   AD_AD
   RETURN
C_2
   MOVF   VAL_Y,W
   MOVWF   DUTY_IZ
   MOVF   VAL_X_Y,W
   MOVWF   DUTY_DE
   CALL   AD_AD
   RETURN
C_23
   MOVF   VAL_X_Y,W
   MOVWF   DUTY_IZ
   MOVWF   DUTY_DE
   CALL   AT_AD
   RETURN
C_3
   MOVF   VAL_Y,W
   MOVWF   DUTY_IZ
   MOVF   VAL_X_Y,W
   MOVWF   DUTY_DE
   CALL   AT_AT
   RETURN
C_34
    MOVF   VAL_X_Y,W
   MOVWF   DUTY_IZ
   MOVWF   DUTY_DE
   CALL   AT_AT
   RETURN
C_4
   MOVF   VAL_Y,W
   MOVWF   DUTY_DE
   MOVF   VAL_X_Y,W
   MOVWF   DUTY_IZ
   CALL   AT_AT
   RETURN
C_41
   MOVF   VAL_X_Y,W
   MOVWF   DUTY_DE
   MOVWF   DUTY_IZ
   CALL   AD_AT
   RETURN

;------------------------------------------------------------------------------------------------------------------------------------------------------
TABLA_X_Y                 ;5 micSEG
   ADDWF   PCL,F
   RETLW   d'112'      ;0
   RETLW   d'96'           ;1
   RETLW   d'80'           ;2
   RETLW   d'64'           ;3
   RETLW   d'48'           ;4
   RETLW   d'32'           ;5
   RETLW   d'16'           ;6
   RETLW   0x00            ;7
   RETLW   0x00            ;8
   RETLW   d'16'           ;9
   RETLW   d'32'           ;A
   RETLW   d'48'           ;B
   RETLW   d'64'           ;C
   RETLW   d'80'           ;D
   RETLW   d'96'           ;E
   RETLW   d'112'          ;F



;------------------------------------------------------------------------------------------------------------------------------------------------------
AT_AT                         ;8 micSEG
   BSF   PORTC,0
   BCF   PORTC,3
   BSF   PORTD,0
   BCF   PORTD,1
        RETURN
AD_AD                          ;8 micSEG
   BCF   PORTC,0
   BSF   PORTC,3
   BCF   PORTD,0
   BSF   PORTD,1
        RETURN
AD_AT                           ;8 micSEG
   BCF   PORTC,0
   BSF   PORTC,3
   BSF   PORTD,0
   BCF   PORTD,1
        RETURN
AT_AD                          ;8 micSEG
   BSF   PORTC,0
   BCF   PORTC,3
   BCF   PORTD,0
   BSF   PORTD,1
        RETURN

;------------------------------------------------------------------------------------------------------------------------------------------------------
ASK_X                              ;14   micSEG
   BCF     DERECHA     ;BORRA FLAGS
   BCF     IZQUIERDA       ;
   MOVLW   0x00
   XORWF   VAL_X,W
        BTFSC   STATUS,Z
   RETURN
   BTFSC   DATO_X,3
   GOTO   DEREC
   BSF   IZQUIERDA
   RETURN
DEREC   BSF   DERECHA
   RETURN





DELAY100      ;110micS
   BSF   PORTB,7
   MOVLW   d'35'
   MOVWF   CONT1
   DECFSZ   CONT1
   GOTO   $-1
   RETURN









;------------------------------------------------------------------------------------------------------------------------------------------------------
;--------------------------------------------------------------------FIN-------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------------------------------------------------------------------
   END






   





















Cuando se ponen límites, la mente humana comienza a buscar maneras de romperlos.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problema con PWM
« Respuesta #1 en: 16 de Julio de 2007, 08:38:44 »
El problema, es que el programa se resetea

Amigo, se resetea sistemáticamente? o se resetea cada vez que recibe información por el puerto D?

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)


 

anything