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