Este es el codigo completo:
;******************************************************************************************************
; FileName:PWMServo_v1.0.asm
;******************************************************************************************************
;------------------------------------------------------------------------------
; PROCESSOR DECLARATION
;------------------------------------------------------------------------------
list p = PIC16F873A ; Seleccionar procesador.-
#include "P16F873A.inc" ; Incluir archivo P16F873A.inc
;------------------------------------------------------------------------------
;
; CONFIGURATION WORD SETUP
;
; The 'CONFIG' directive is used to embed the configuration word within the
; .asm file. The lables following the directive are located in the respective
; .inc file. See the data sheet for additional information on configuration
; word settings.
;
;------------------------------------------------------------------------------
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
ERRORLEVEL -302
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
; VARIABLES
;------------------------------------------------------------------------------
CBLOCK H'20'
FlagRTCC ; Variable usada para avisarnos que han pasado 20ms.-
ValorTMR0 ; Variable usada para guardar el valor leido del TMR0.-
ENDC;
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
; CONSTANTES
;------------------------------------------------------------------------------
Servo equ 0 ; Definimos Servo como el bit 0 de un registro, en este caso PORTA.-
;------------------------------------------------------------------------------
; RESET VECTOR
;------------------------------------------------------------------------------
RESET ORG H'00' ; Aqui comienza el micro.-
GOTO Inicio ; Salto a Inicio de mi programa.-
ORG H'04' ; Salta al vector de Interrupcion.-
GOTO ISR
ORG H'05' ; Origen del codigo de programa.-
;------------------------------------------------------------------------------
; VECTOR DE INTERRUPCION
;------------------------------------------------------------------------------
ISR ;**** Atendemos la Interrupcion.-
btfss INTCON,T0IF
goto loop
bcf INTCON,T0IF
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
bsf FlagRTCC,0
retfie
;------------------------------------------------------------------------------
; MAIN PROGRAM
;------------------------------------------------------------------------------
Inicio ;**** Configuracion de Puertos ****
bcf STATUS,RP0
bcf STATUS,RP1 ; Bank 0.-
clrf PORTA ; Limpiamos PORTA.-
clrf TMR0 ; Limpiamos TMR0.-
clrf INTCON ; Desactivamos interrupciones y limpiamos T0IF.-
bsf STATUS,RP0 ; Bank 1.-
movlw 0x06
movwf ADCON1 ; I/O digitales.-
movlw b'00000000'
movwf TRISA ; RA<0:7> output.-
movlw b'10000110'
movwf OPTION_REG
bcf STATUS,RP0 ; Bank 0.-
movlw .100 ; Cargamos TMR0 el valor 100 en decimal.-
movwf TMR0
bsf INTCON,T0IE ; Habilitamos interrupcion TMR0.-
bsf INTCON,GIE ; Habilitamos todas las interrupciones.-
loop btfss FlagRTCC,0 ; Revisamos si el bit 0 de la variable FlagRTCC vale 1.-
goto loop ; No, repetimos.-
bcf FlagRTCC,0 ; Si, ponemos la variable a 0.-
bsf PORTA,Servo ; Ponemos a 1 el bit 0 de la Puerta A.- (HASTA AQUI 20ms)
movlw .100
movwf TMR0
call LeerTMR0 ; Llamamos a la funcion para leer TMR0.-
bcf PORTA,Servo ; Ponemos a 0 el bit 0 de la Puerta A.-
goto loop
;------------------------------------------------------------------------------
; FUNCIONES
;------------------------------------------------------------------------------
LeerTMR0
movf TMR0,W
movwf ValorTMR0
clrw
movlw .112
subwf ValorTMR0
btfss STATUS,Z
goto $-6
return
END ; Fin del codigo.-
Lo bueno es que funciona en la vida real, pero con el error comentado en el post anterior el cual me gustaria darle solucion, ahora voy a intentar variar el valor de la variable con un potenciometro a traves del ADC.
Pero esto sera en un apartado diferente para no mezclar una cosa con otra.
Gracias a tapi8 por la ayuda aportada.
Miquel_S