Hola, estoy intentando hacer un programa con el ensamblador del PIC 16F877A, que me permita medir el tiempo en segundos indefinidamente, sin embargo tengo un desfazamiento entre el tiempo real y el tiempo que marca el PIC, al parecer el PIC se atrasa conforme el intervalo de tiempo se hace mas largo... este es mi codigo:
INCLUDE<P16F877A.INC>
LIST p=16F877A
;Bits de configuracion
__CONFIG _XT_OSC & _PWRTE_ON & _BODEN_OFF & _CP_OFF & _WDT_OFF
ORG 0
GOTO Inicio
;Rutina de configuracion
CONF_PIC
BSF STATUS,RP0 ;Conmuta al banco 1
CLRF TRISB ;Puerto B = Salida
MOVLW b'11000100'
MOVWF OPTION_REG ;Configuracion de Timer0
BCF STATUS,RP0 ;Conmuta al banco 0
BCF INTCON,TMR0IF ;Limpiar el bit de la interrupcion
MOVLW 0
MOVWF PORTB ;Puerto B = 0000 0000
BSF INTCON,TMR0IE ;Activa Int de desbordamiento de TMR0
RETURN
;Programa principal
Inicio
CALL CONF_PIC ;Inicializar
cont1 EQU d'32' ;Declaracion de contador en memoria
IniciaContador
MOVLW d'125'
MOVWF cont1
MOVLW d'8'
MOVWF TMR0
Ciclo1
BTFSS INTCON,TMR0IF
GOTO Ciclo1
BCF INTCON,TMR0IF
DECFSZ cont1
GOTO Ciclo1
MOVLW d'1'
XORWF PORTB,1
GOTO IniciaContador
END
-------------------------------------
En el programa anterior estoy usando:
Preescaler = 32
Contador = 125
TMR0 = 8 (6 + 2, Considerando los 2 ciclos por escribir en TMR0)
Ojo: Estoy usando un cristal X-TAL de 4Mhz como oscilador y el registro OPTION_REG, tambien lo configure para usar ese oscilador y no el WDT.
En si el programa tiene que encender durante 1seg un LED y manterlo apagado durante 1seg, prenderlo de nuevo y asi indefinidamente, lo estoy simulando en ISIS PROTEUS y con el cronometro de la simulacion es como me doy cuenta de que esta desfasado al poco tiempo de ejecucion, tengo la sospecha de que sea tmb por el tiempo que toman las instrucciones para encender el LED sin embargo creo que eso seria minimo :S y no lo deberia de notar si no hasta despues de mucho tiempo...
CUALQUIER AYUDA, BIENVENIDA!!!!!!!!!!!!! GRACIAS!!!
INCLUDE<P16F877A.INC>
LIST p=16F877A
;Bits de configuracion
__CONFIG _XT_OSC & _PWRTE_ON & _BODEN_OFF & _CP_OFF & _WDT_OFF
ORG 0
GOTO Inicio
;Rutina de configuracion
CONF_PIC
BSF STATUS,RP0 ;Conmuta al banco 1
CLRF TRISB ;Puerto B = Salida
MOVLW b'11000100'
MOVWF OPTION_REG ;Configuracion de Timer0
BCF STATUS,RP0 ;Conmuta al banco 0
BCF INTCON,TMR0IF ;Limpiar el bit de la interrupcion
MOVLW 0
MOVWF PORTB ;Puerto B = 0000 0000
BSF INTCON,TMR0IE ;Activa Int de desbordamiento de TMR0
RETURN
;Programa principal
Inicio
CALL CONF_PIC ;Inicializar
cont1 EQU d'32' ;Declaracion de contador en memoria
IniciaContador
MOVLW d'125'
MOVWF cont1
MOVLW d'8'
MOVWF TMR0
Ciclo1
BTFSS INTCON,TMR0IF
GOTO Ciclo1
BCF INTCON,TMR0IF
DECFSZ cont1
GOTO Ciclo1
MOVLW d'1'
XORWF PORTB,1
GOTO IniciaContador
END
-------------------------------------
En el programa anterior estoy usando:
Preescaler = 32
Contador = 125
TMR0 = 8 (6 + 2, Considerando los 2 ciclos por escribir en TMR0)
Ojo: Estoy usando un cristal X-TAL de 4Mhz como oscilador y el registro OPTION_REG, tambien lo configure para usar ese oscilador y no el WDT.
En si el programa tiene que encender durante 1seg un LED y manterlo apagado durante 1seg, prenderlo de nuevo y asi indefinidamente, lo estoy simulando en ISIS PROTEUS y con el cronometro de la simulacion es como me doy cuenta de que esta desfasado al poco tiempo de ejecucion, tengo la sospecha de que sea tmb por el tiempo que toman las instrucciones para encender el LED sin embargo creo que eso seria minimo :S y no lo deberia de notar si no hasta despues de mucho tiempo...
CUALQUIER AYUDA, BIENVENIDA!!!!!!!!!!!!! GRACIAS!!!