Autor Tema: Que falta para que TMR1 al desbordar vaya a la rutina de interrupt  (Leído 2515 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado beto0350

  • PIC12
  • **
  • Mensajes: 58
Hola:
      alguien puede explicarme que me falta en el codigo que cuando desborda TMR1 no va a la
rutina de Interrupt:

        list p=16f877, f=inhx8m  ;Enter device name
                                ;printed on the probe
                                ;connected to your pod.
      include <P16f877.INC>

                        ; *** DEVICE Fuses Definitions

 __CONFIG _HS_OSC & _CP_OFF & _BODEN_OFF &  _PWRTE_ON & _WDT_OFF & _WRT_ENABLE_ON &  _DEBUG_OFF & _CPD_OFF & _LVP_OFF
       

      ERRORLEVEL -306, -302
         NOEXPAND

          CBLOCK 0x20
W_SAVE
STATUS_SAVE
          ENDC


;-----------------------------------------------------------------------------
;Macros to select the register bank
;Many bank changes can be optimised when only one STATUS bit changes

Bank0           MACRO                   ;macro to select data RAM bank 0
   BCF   STATUS,RP0   ; clear bank select bits
   BCF   STATUS,RP1
   BCF   STATUS,IRP   ; clear indirect adressing bit
   ENDM

             

Bank1           MACRO                   ;macro to select data RAM bank 1
   BSF   STATUS,RP0   ;
   BCF   STATUS,RP1   ;
   BCF   STATUS,IRP   ; clear indirect adressing bit
   ENDM
               

Bank2           MACRO                   ;macro to select data RAM bank 2
   BCF   STATUS,RP0   ;
   BSF   STATUS,RP1
   BSF   STATUS,IRP   ; set bit for indirect adressing
   ENDM


Bank3           MACRO                   ;macro to select data RAM bank 3
    BSF   STATUS,RP0   ;
   BSF   STATUS,RP1
   BSF   STATUS,IRP   ; set bit for indirect adressing
   ENDM



;

;
; Baud Rate = 19200, No Parity, 8 bits & 1 Stop Bit
;
; -------------
; PROGRAM START
; -------------
;
     org  0         ; startup = 0000H

     goto BootStart
     org  4



         MOVWF   W_SAVE          ; save W        {  save(ACCU);
         SWAPF   STATUS, W       ; save STATUS
         MOVWF   STATUS_SAVE
         BCF     STATUS, RP0     ; be sure we are in bank 0

            bcf INTCON,7
             btfss  PIR1,0
        ;------------------   
        ;    rutinas
        ;----------- 
sale   
     BCF  INTCON,1
     BCF  INTCON,2
     bcf             PIR1,TMR1IF            ; ensure flag is reset

            bsf INTCON,7


        SWAPF   STATUS_SAVE, W
        MOVWF   STATUS          ; restore W and STATUS
        SWAPF   W_SAVE, F
        SWAPF   W_SAVE, W       ;   }}}}}}}}} restore(ACCU);

                retfie






; --------------------------------------------------
; SET UP THE PORTS TO SUIT YOUR CIRCUIT REQUIREMENTS
; --------------------------------------------------
;

BootStart
             Bank0       ; bank0
             movlw     b'00000111'
             movwf     ADCON1       ; porta inputs = digital not analog
;

             movlw   b'00000000'  ;  tmr0 preescaler 1:2
             movwf   OPTION_REG

             Bank0


             MOVLW  b'11010100'      ; con tmr0
             MOVWF  INTCON

;__________________________________
empieza
             clrf   CCP1CON
             clrf   CCP2CON

             call   init_timer1
             BSF    PIE1,0    ; 1 = ENABLE - 0=DISABLE TMR1 INTERRUPT
loop

           nop
           nop
           nop
           goto loop


init_timer1
                banksel T1CON                  ; select SFR bank
 

   bcf T1CON,1      ;' 1 = External clock from pin RC0/T1OSO/T1CKI (on the rising edge)
               ;' 0 = Internal clock (FOSC/4)
   bsf T1CON,2      ;' 1 = Do not synchronize external clock input
               ;' 0 = Synchronize external clock input
            ;' When T1CON.1 = 0;
            ;'   this bit is ignored. Timer1 uses the internal clock when TMR1CS = 0.

   bcf T1CON,4      ;' 11 = 1:8 prescale value
   bcf T1CON,5      ;' 10 = 1:4 prescale value
            ;' 01 = 1:2 prescale value
            ;' 00 = 1:1 prescale value





                movlw 0xFF      ;
                movwf TMR1H                  ; initialize Timer1 high
                movlw 0xF5      ;
                movwf TMR1L               ; initialize Timer1 low

                bcf             PIR1,TMR1IF            ; ensure flag is reset
                bsf             T1CON,TMR1ON           ; turn on Timer1 module
                return                         ; return from subroutine

            END


Gracias

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Que falta para que TMR1 al desbordar vaya a la rutina de interrupt
« Respuesta #1 en: 07 de Marzo de 2008, 19:08:09 »
Hola.

Tenías varios detalles. Fijate que ahora debería funcionar...

        list p=16f877, f=inhx8m  ;Enter device name
                                ;printed on the probe
                                ;connected to your pod.
      include <P16f877.INC>

                        ; *** DEVICE Fuses Definitions

 __CONFIG _HS_OSC & _CP_OFF & _BODEN_OFF &  _PWRTE_ON & _WDT_OFF & _WRT_ENABLE_ON &  _DEBUG_OFF & _CPD_OFF & _LVP_OFF
       

      ERRORLEVEL -306, -302
         NOEXPAND

          CBLOCK 0x20
W_SAVE
STATUS_SAVE
          ENDC


;-----------------------------------------------------------------------------
;Macros to select the register bank
;Many bank changes can be optimised when only one STATUS bit changes

Bank0           MACRO                   ;macro to select data RAM bank 0
   BCF   STATUS,RP0   ; clear bank select bits
   BCF   STATUS,RP1
   BCF   STATUS,IRP   ; clear indirect adressing bit
   ENDM

             

Bank1           MACRO                   ;macro to select data RAM bank 1
   BSF   STATUS,RP0   ;
   BCF   STATUS,RP1   ;
   BCF   STATUS,IRP   ; clear indirect adressing bit
   ENDM
               

Bank2           MACRO                   ;macro to select data RAM bank 2
   BCF   STATUS,RP0   ;
   BSF   STATUS,RP1
   BSF   STATUS,IRP   ; set bit for indirect adressing
   ENDM


Bank3           MACRO                   ;macro to select data RAM bank 3
    BSF   STATUS,RP0   ;
   BSF   STATUS,RP1
   BSF   STATUS,IRP   ; set bit for indirect adressing
   ENDM



;

;
; Baud Rate = 19200, No Parity, 8 bits & 1 Stop Bit
;
; -------------
; PROGRAM START
; -------------
;
     org  0         ; startup = 0000H

     goto BootStart
     org  4



         MOVWF   W_SAVE          ; save W        {  save(ACCU);
         SWAPF   STATUS, W       ; save STATUS
         MOVWF   STATUS_SAVE
         BCF     STATUS, RP0     ; be sure we are in bank 0

             btfss  PIR1,TMR1IF
        ;------------------   
        ;    rutinas
        ;-----------
sale   
     BCF  INTCON,1
     BCF  INTCON,2
     bcf             PIR1,TMR1IF            ; ensure flag is reset


        SWAPF   STATUS_SAVE, W
        MOVWF   STATUS          ; restore W and STATUS
        SWAPF   W_SAVE, F
        SWAPF   W_SAVE, W       ;   }}}}}}}}} restore(ACCU);

        retfie






; --------------------------------------------------
; SET UP THE PORTS TO SUIT YOUR CIRCUIT REQUIREMENTS
; --------------------------------------------------
;

BootStart
             Bank0       ; bank0
             movlw     b'00000111'
             movwf     ADCON1       ; porta inputs = digital not analog
;

             movlw   b'00000000'  ;  tmr0 preescaler 1:2
             movwf   OPTION_REG

             Bank0

;__________________________________
empieza
             clrf   CCP1CON
             clrf   CCP2CON

             call   init_timer1
             banksel PIE1
         BSF    PIE1,TMR1IE    ; 1 = ENABLE - 0=DISABLE TMR1 INTERRUPT
         bsf      INTCON,PEIE
         bsf      INTCON,GIE
loop


           nop
           nop
           nop
           goto loop


init_timer1
                banksel T1CON                  ; select SFR bank
 

   bcf T1CON,TMR1CS      ;' 1 = External clock from pin RC0/T1OSO/T1CKI (on the rising edge)
               ;' 0 = Internal clock (FOSC/4)
   bsf T1CON,T1SYNC      ;' 1 = Do not synchronize external clock input
               ;' 0 = Synchronize external clock input
            ;' When T1CON.1 = 0;
            ;'   this bit is ignored. Timer1 uses the internal clock when TMR1CS = 0.

   bcf T1CON,T1CKPS0      ;' 11 = 1:8 prescale value
   bcf T1CON,T1CKPS1      ;' 10 = 1:4 prescale value
            ;' 01 = 1:2 prescale value
            ;' 00 = 1:1 prescale value





                movlw 0xFF      ;
                movwf TMR1H                  ; initialize Timer1 high
                movlw 0xF5      ;
                movwf TMR1L               ; initialize Timer1 low

                bcf             PIR1,TMR1IF            ; ensure flag is reset
                bsf             T1CON,TMR1ON           ; turn on Timer1 module
                return                         ; return from subroutine

            END

Saludos!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado beto0350

  • PIC12
  • **
  • Mensajes: 58
Re: Que falta para que TMR1 al desbordar vaya a la rutina de interrupt
« Respuesta #2 en: 22 de Abril de 2008, 18:37:22 »
  Gracias:
         como no sabia como hacerlo deje el proyecto y hoy me decidi a retomarlo y o sorpresa encuentro tus arreglos con lo cual funciona perfectamente, porque en realidad me tenia desconcertado.

  Muchas Gracias


 

anything