#INCLUDE<P16F88.INC>
LIST P = 16F88
ERRORLEVEL - 302
ERRORLEVEL - 305
ORG 0X00
GOTO INICIO
ORG 0X04
GOTO INTERRUPCION
W_TEMP EQU 0X70
STATUS_TEMP EQU 0X71
PCLATH_TEMP EQU 0X72
INCLUDE<PRUEBAS.INC>
INCLUDE<CONFIGURACION.INC>
INCLUDE<INTERRUPCION.INC>
INICIO
;{;
CALL CONFIGURA_IO ;CONFIGURA ENTRADAS Y SALIDAS
CALL CONFIGURA_TIMER_1 ;CONFIGURA INTERRUPCIONES POR TIMER1
SLEEP ;A DORMIR
NOP ;NADA
NOP ;NADA
GOTO $-3
;}
END;CONFIGURACION.INC
CONFIGURA_IO
;{;
;BANCO 1
BSF STATUS,RP0
CLRF ANSEL ;MODO DIGITAL
MOVLW B'11111111' ;LITERAL A W
MOVWF TRISA ;CONFIGURA PUERTO A
MOVLW B'01000101' ;LITERAL A W
MOVWF TRISB ;CONFIGURA PUERTO B
;BANCO 0
BCF STATUS,RP0
CLRF PORTA ;LIMPIA PUERTO A
CLRF PORTB ;LIMPIA PUERTO B
;};
RETURN
CONFIGURA_TIMER_1
;{;
;BANCO 1
BSF STATUS,RP0
BSF INTCON,GIE ;HABILITA INTERRUPCIONES GLOBALES
BSF INTCON,PEIE ;HABILITA INTERRUPCIONES POR PERIFERICOS
BSF PIE1,TMR1IE ;HABILITA INTERRUPCIONES POR TIMER 1
;BANCO 0
BCF STATUS,RP0
BCF PIR1,TMR1IF ;LIMPIA LA BANDERA DE TIMER 1
CLRF TMR1L ;LIMPIA EL REGISTRO L DE TIMER 1
CLRF TMR1H ;LIMPIA EL REGISTRO H DE TIMER 1
MOVLW B'00001111' ;MUEVE LITERAL A W
MOVWF T1CON ;CONFIGURA EL TIMER 1
;};
RETURN
;INTERRUPCION.INC
INTERRUPCION
;{;
CALL SALVAR_ENTORNO
GOTO INTERRUPCION_T1
;};
SALVAR_ENTORNO
;{;
MOVWF W_TEMP ;Copy W to TEMP register
SWAPF STATUS, W ;Swap status to be saved into W
CLRF STATUS ;bank 0, regardless of current bank, Clears IRP,RP1,RP0
MOVWF STATUS_TEMP ;Save status to bank zero STATUS_TEMP register
MOVF PCLATH, W ;Only required if using page 1
MOVWF PCLATH_TEMP ;Save PCLATH into W
CLRF PCLATH ;Page zero, regardless of current page
;};
RETURN
INTERRUPCION_T1
;{;
;BANCO_0
BCF STATUS,RP0
BTFSC PORTB,3
GOTO APAGAR_LED
PRENDER_LED
BSF PORTB,3 ;PRENDE EL LED EN RB3
CALL CONFIGURA_TIMER_1 ;CONFIGURA EL TIMER 1
GOTO RESTAURAR_ENTORNO ;VE A RESTAURAR EL ENTORNO
APAGAR_LED
BCF PORTB,3 ;APAGA EL LED EN RB3
CALL CONFIGURA_TIMER_1 ;CONFIGURA EL TIMER 1
GOTO RESTAURAR_ENTORNO ;VE A RESTAURAR EL ENTORNO
;};
RESTAURAR_ENTORNO
;{;
MOVF PCLATH_TEMP, W ;Restore PCLATH
MOVWF PCLATH ;Move W into PCLATH
SWAPF STATUS_TEMP, W ;Swap STATUS_TEMP register into W
;(sets bank to original state)
MOVWF STATUS ;Move W into STATUS register
SWAPF W_TEMP, F ;Swap W_TEMP
SWAPF W_TEMP, W ;Swap W_TEMP into W
;};
RETFIE
Tengo mi programa dividido en varios archivos .inc y un asm que es el principal. Creo yo que es la mejor forma de programar por que segun entiendo asi uno puede ir generando sus propia libreria de programas para el futuro. y tambien me ayuda a darle mucho orden al programa.
Aqui estan los bits de configuracion (Creo que tu los llamas fuses pero no estoy muy seguro):Exactamente, esos son los fuses.
asi es amigo firepic(pudeo llamarlo amigo? :shock:Claro poseidon, aquí todos estamos en confianza :lol:
¿Que quiere decir el datasheet con que hay que dar un tiempo para que se inicialize el oscilador del timer 1?
INICIALIZAR
;{;
BANKSEL PORTA ; select bank of PORTA
CLRF PORTA ; Initialize PORTA by
; clearing output
; data latches
CLRF PORTB ; inicializar puerto b
BANKSEL ANSEL ; Select Bank of ANSEL
MOVLW 0x00 ; Configure all pins
MOVWF ANSEL ; as digital inputs
MOVLW 0xFF ; Value used to
; initialize data
; direction
MOVWF TRISA ; Set RA<7:0> as inputs
MOVWF TRISB ; todo el puerto b como entrada
;};
RETURN
7.6 Timer1 Oscillator
A crystal oscillator circuit is built between pins T1OSI
(input) and T1OSO (amplifier output). It is enabled by
setting control bit T1OSCEN (T1CON<3>). The oscilla-
tor is a low-power oscillator, rated up to 32.768 kHz. It
will continue to run during all power-managed modes.
It is primarily intended for a 32 kHz crystal. The circuit
for a typical LP oscillator is shown in Figure 7-3.
Table 7-1 shows the capacitor selection for the Timer1
oscillator.
The user must provide a software time delay to ensure
proper oscillator start-up.
He inicializado los puertos a y b con el siguiente codigoCódigo: [Seleccionar]INICIALIZAR
;{;
BANKSEL PORTA ; select bank of PORTA
CLRF PORTA ; Initialize PORTA by
; clearing output
; data latches
CLRF PORTB ; inicializar puerto b
BANKSEL ANSEL ; Select Bank of ANSEL
MOVLW 0x00 ; Configure all pins
MOVWF ANSEL ; as digital inputs
MOVLW 0xFF ; Value used to
; initialize data
; direction
MOVWF TRISA ; Set RA<7:0> as inputs
MOVWF TRISB ; todo el puerto b como entrada
;};
RETURN
El problema no ha desaparecido. Generalmente es la primer vez que enciendo el pic se queda estatico en con el led encendido. Si apago y vuelvo a encender el pic el problema se arregla y si lo vuelvo a hacer mas veces el problema ya no se presenta.
title "P1.ASM - PRUEBA INICIAL TESIS"
LIST P = 16F88
ERRORLEVEL -302
ERRORLEVEL -305
#INCLUDE<P16F88.INC>
ORG 0X00
GOTO INICIO
ORG 0X04
GOTO INTERRUPCION
CBLOCK 0X20
T0A , T0B ,T0C
ENDC
INCLUDE<PRUEBAS.INC>
INCLUDE<CONFIGURACION.INC>
INCLUDE<INTERRUPCION.INC>
INICIO
;{;
CALL INICIALIZAR ;INICIALIZA LOS PUERTOS
CALL CONF_IO ;CONFIGURA ENTRADAS Y SALIDAS
;CALL CONF_T0 ;LLAMA A LA CONFIGURACION DE TIMER 0 (ACTUALMENTE NO LO USO)
CALL CONF_T1 ;LLAMA A CONFIGURACION DE TIMER 1
;};
GOTO $;
END ;CONFIGURACION.INC
INICIALIZAR
;{;
BANKSEL PORTA ; select bank of PORTA
CLRF PORTA ; Initialize PORTA by
; clearing output
; data latches
CLRF PORTB ; LIMPIA PUERTO B
BANKSEL ANSEL ; Select Bank of ANSEL
MOVLW 0x00 ; Configure all pins
MOVWF ANSEL ; as digital inputs
MOVLW 0xFF ; Value used to
; initialize data
; direction
MOVWF TRISA ; Set RA<7:0> as inputs
MOVWF TRISB ; TODO EL PUERTO B COMO ENTRADA
;};
RETURN
CONF_IO
;{;
BSF STATUS,RP0 ;BANCO 1
CLRF ANSEL ;TODAS LAS IO MODO DIGITAL
CLRF TRISA ;PUERTO A COMO SALIDAS
CLRF TRISB ;PUERTO B COMO SALIDAS
BCF STATUS,RP0 ;BANCO O
CLRF PORTA ;LIMPIA PUERTO B
CLRF PORTB ;LIMPIA PUERTO A
;};
RETURN
CONF_T0
;{;
;BANCO 0
BCF STATUS,RP0
CLRF TMR0 ;LIMPIA LA CUENTA DE TIMER 0
;BANCO 1
BSF STATUS,RP0
BCF INTCON,TMR0IF ;LIMPIA BANDERA DE INTERRUPCION T0
BSF INTCON,GIE ;HABILITA INTERRUPCIONES GLOBALES
BSF INTCON,TMR0IE ;HABILITA INTERRUPCIONES POR T0
BCF OPTION_REG,T0CS ;T0 CLOCK_SOURCE 0 = RELOJ INTERNO 1
BCF OPTION_REG,T0SE ;T0 SOURCE_EDGE 0 = TRANCICION DE SUBIDA EN PIN 2
BSF OPTION_REG,PSA ;T0 PRESCALER_ASAIGMENT 0 = WDT 3
;}; ;ACTUALMENTE NO USO TIMER 0
RETURN
CONF_T1
;{;
BSF STATUS,RP0
BSF PIE1,TMR1IE ;HABILITA INTERRUPCIONES POR TIMER1
BCF STATUS,RP0 ;BANCO 0
MOVLW B'11011000' ;LITERAL A W
MOVWF TMR1H ;LITERAL A TIMER1 H (TODAVIA NO LA HE CALCULADO BIEN PARA EL CRISTAL QUE TENGO)
MOVLW B'11110000' ;LITERAL A W
MOVWF TMR1L ;;LITERAL A TIMER1 H (TODAVIA NO LA HE CALCULADO BIEN PARA EL CRISTAL QUE TENGO)
;CLRF TMR1L
;CLRF TMR1H
BCF PIR1,TMR1IF
BSF INTCON,GIE ;HABILITA INTERRUPCIONES GLOBALES
BSF INTCON,PEIE ;HABILITA INTERRUPCIONES POR PERIFERICOS
BSF INTCON,TMR0IE ;HABILITA INTERRUPCIONES POR T0
BCF T1CON,T1RUN ;EL RELOJ DEL SISTEMA ES DE OTRA FUENTE
BCF T1CON,T1CKPS1 ;PRESCALER 1:1
BCF T1CON,T1CKPS0 ;PRESCALER 1:1
BSF T1CON,T1OSCEN ;TIMER1 OSCILLATOR ENCENDIDO
BSF T1CON,NOT_T1SYNC ;NO SINCRONIZES EL RELOJ EXTERNO (IGNORADO CON RELOJ INTERNO)
BSF T1CON,TMR1CS ;RELOJ EXTERNO
;BCF T1CON,TMR1CS ;RELOJ INTERNO (FOSC/4)
BSF T1CON,TMR1ON ;ENCIENDE TIMER1
;};
RETFIE ;INTERRUPCION.INC
INTERRUPCION
;{;
;GOTO INT_T0 ;(ACTUALMENTE NO USO TIMER 0)
GOTO INT_T1 ;VE A LA INTERRUPCION POR TIMER1
;};
INT_T0
;{;
;BANCO 0
BCF STATUS,RP0
INCF T0B
BTFSS STATUS,Z ;PRUEBA SI T0B SE DESBORDA
GOTO RECONFIGURA_T0 ;SI NO SE DESBORDA
INCF T0A ;SI SE DESBORDA INCREMENTA T0A
BTFSS STATUS,Z ;PRUEBA SI T0A SE DESBORDA
GOTO RECONFIGURA_T0 ;SI NO SE DESBORDA
SEGUNDO
COMF PORTA,1 ;TOGGLE PUERTO A
COMF PORTB,1 ;TOGGLE PUERTO B
CLRF T0A ;LIMPIA T0A
CLRF T0B ;LIMPIA T0B
CLRF T0C ;LIMPIA T0C
RECONFIGURA_T0
CALL CONF_T0 ;RECONFIGURA EL TIMER
;}; ;(ACTUALMENTE NO USO TIMER 0)
RETFIE
INT_T1;
;{;
CALL PRUEBA_2 ;LLAMA A LA PRUEBA 2 (TOGGLE)
CALL CONF_T1 ;RECONFIGURA EL TIMER 1
;};
RETFIE ;PRUEBAS.INC
PRUEBA_1 ;
;{
BCF STATUS,RP0 ; EN ESTE MOMENTO NO USO LA PRUEBA_1
MOVLW B'11111111' ;
MOVWF PORTA ;
MOVWF PORTB ;
;};
RETURN ;(EN ESTE MOMENTO NO USO LA PRUEBA 1)
PRUEBA_2
;{;
COMF PORTA,1 ;TOGGLE PUERTO A
COMF PORTB,1 ;TOGGLE PUERTO B
;};
RETURN