asm code
#INCLUDE <P16F819.inc>
__CONFIG _FOSC_INTOSCCLK & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CCPMX_RB2 & _CP_OFF
;Definição dos bancos de memória:
BANK0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK2 MACRO
BCF STATUS,RP0
BSF STATUS,RP1
ENDM
BANK3 MACRO
BSF STATUS,RP0
BSF STATUS,RP1
ENDM
CBLOCK 0x20 ;Criação de duas variáveis de 8bits no endereço inicial dos GPR's (General Purpose Registers)
W_TEMP
STATUS_TEMP
VAR_1
VAR_2
ENDC
;Vetor de Reset
ORG 0x00
GOTO INICIO
;Vetor de Interrupção
ORG 0x0004
ENTRA_INT
MOVWF W_TEMP ;Salva W em W_TEMP
SWAPF STATUS,W ;Swapf em Status
CLRF STATUS ;Apaga bit RP0 do registrador Status
MOVWF STATUS_TEMP ;Move W para STATUS_TEMP
;Tratamento da Interrupção do TMR0
BTFSC INTCON,TMR0IF ;Ocorreu interrupção do TMR0?
GOTO TRATA_INT_TMR0 ;Sim. Desvia e trata
GOTO SAI_INT ;Não. Então sai.
TRATA_INT_TMR0 ;Contagem de Tempo: Tclk * Prescaler(TMR0)*VAR_1*VAR_2
;Clock do Sistema: 8Mhz/4 = 2Mhz => Tclk= 1/2MHz = 0,5us
;Contagem de Tempo: 0,5us * 255 * 255 * 31 = 1 segundo
BCF INTCON,TMR0IF ;Limpa flag de estouro do TMR0
GOTO CONTA_1
CONTA_1
INCF VAR_1
MOVF VAR_1,W ;DECREMENTA VAR_1.
XORLW .255
BTFSS STATUS,Z ;DEU ZERO? (Z=1)
GOTO SAI_INT ;NÃO.
GOTO CONTA_2 ;SIM. CONTINUA
CONTA_2
INCF VAR_2
MOVF VAR_2,W ;DECREMENTA VAR_2.
XORLW .31
BTFSS STATUS,Z ;DEU ZERO? (Z=1)
GOTO SAI_INT ;NÃO
GOTO LED ;SIM. CONTINUA
LED
BTFSC PORTA,1 ;LED ESTÁ ACESO?
GOTO APAGA_LED ;Não. Então desvia
GOTO ACENDE_LED ;Sim. Então desvia
ACENDE_LED
BSF PORTA,1
GOTO SAI_INT ;ACENDE O LED E SAI DA ROTINA DE INTERRUPÇÃO
APAGA_LED
BCF PORTA,1
GOTO SAI_INT ;APAGA O LED E SAI DA ROTINA DE INTERRUÇÃO
SAI_INT
CLRF TMR0
CLRF VAR_1
CLRF VAR_2
SWAPF STATUS_TEMP,W ;Swapf de Status_Temp em Work
MOVWF STATUS ;Move conteúdo de work para Status
SWAPF W_TEMP,F ;Swapf de W_Temp
SWAPF W_TEMP,W ;Swapf de W_Temp em Work
RETFIE ;Retorna da Interrupção
INICIO
BANK1
CLRF TRISA
CLRF TRISB
MOVLW 0x74
MOVWF OSCCON ;Ajusta registrador osccon para trabalhar com Fclock em 8MHz estável
MOVLW 0x07
MOVWF OPTION_REG ;Ajusta registrador option_reg para operar com tmr0 com prescaler de 1:256
BANK0
CLRF PORTA
CLRF PORTB
MOVLW 0x00
MOVWF CCP1CON ;desabilita módulo ccp1 (capture,compare e pwm internos)
MOVLW 0xE0
MOVWF INTCON ;Liga chave geral das interrupções e dos periféricos e habilita interrupção do tmr0
CLRF TMR0
GOTO MAIN
MAIN
GOTO $
END ;Fim do código
Desde já, agradeço a ajuda!