Autor Tema: Problemas de reset con TMR2 por interrupción  (Leído 1725 veces)

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

Desconectado agori

  • PIC10
  • *
  • Mensajes: 3
Problemas de reset con TMR2 por interrupción
« en: 09 de Octubre de 2012, 21:47:44 »
Hola a todos espero me puedan ayudar con un problema como yo lo puedo ayudar a uds. El proyecto es un dispositivo de control de tiempos para una linea de producción. Estoy trabajando con un PIC16F873 en un programa que utiliza interrupción INT y desborde de TMR2. Mi problema radica en que cuando desactivo la interrupción por TMR2 el micro funciona correctamente ejecutandose correctamente la interrupcion por INT, pero cuando activo la interrupcion por TMR2 el micro se resetea aleatoriamente. Les paso el código a ver si alguien me puede orientar si las rutinas de atención de interrupción estan bien declaradas. Gracias!

   org   0x00
   goto   inicio
;------------------------------------
        org     0x04
;------------------------------------
        bcf     intcon,7
        btfsc   intcon,1
        goto    rb0int
        btfsc   pir1,1
        goto    tmr2out
        retfie
;------------------------------------
tmr2int incf    contmr2,1
        movf    contmr2,0
        xorlw   .25
        btfss   status,2
        goto    tmr2out
        clrf    contmr2
        bcf     status,2
;------------------------------------
        incf    unidta,1
        movf    unidta,0
        xorlw   .10
        btfss   status,2
        goto    tmr2out
        bcf     status,2
        clrf    unidta
        incf    deceta,1
        movf    deceta,0
        xorlw   .10
        btfss   status,2
        goto    tmr2out
        bcf     status,2
        clrf    deceta
        incf    centta,1
        movf    centta,0
        xorlw   .10
        btfss   status,2
        goto    tmr2out
        bcf     status,2
        clrf    centta
        incf    milta,1
        movf    milta,0
        xorlw   .10
        btfss   status,2
        goto    tmr2out
        bcf     status,2
        clrf    milta    
tmr2out
        bcf     pir1,1
        retfie  
;------------------------------------
rb0int  movlw   b'01010111'
        movwf   t2con
        movf    unidta,0
        movwf   unidt
        movf    deceta,0
        movwf   decet
        movf    centta,0
        movwf   centt
        movf    milta,0
        movwf   milt
        clrf    unidta
        clrf    deceta
        clrf    centta
        clrf    milta        
;------------------------------------
        incf    unidad,1
        movf    unidad,0
        xorlw   .10
        btfss   status,2
        goto    outrb0
        bcf     status,2
        clrf    unidad
        incf    decena,1
        movf    decena,0
        xorlw   .10
        btfss   status,2
        goto    outrb0
        bcf     status,2
        clrf    decena
        incf    centena,1
        movf    centena,0
        xorlw   .10
        btfss   status,2
        goto    outrb0
        bcf     status,2
        clrf    centena
        incf    miles,1
        movf    miles,0
        xorlw   .10
        btfss   status,2
        goto    outrb0
        bcf     status,2
        clrf    miles
outrb0  bcf     intcon,1
        retfie
;------------------------------------      
;------------------------------------
ret1ms  movlw   .249  
        movwf   reg1
uno     nop
        decfsz  reg1,1
        goto    uno
        return
;------------------------------------
tabla   addwf   pc,1
   retlw   b'00111111'
   retlw   b'00000110'
   retlw   b'01011011'
   retlw   b'01001111'
   retlw   b'01100110'
   retlw   b'01101101'
   retlw   b'01111101'
   retlw   b'00000111'
   retlw   b'01111111'
   retlw   b'01101111'
;------------------------------------
;------------------------------------        
;------------------------------------
inicio   bsf   status,5
   movlw   b'00110000'
   movwf   trisa
        movlw   b'00000001'
        movwf   trisb
   movlw   b'00000000'   
   movwf   trisc
   movlw   0x07              ;todos los pines del PTOA digitales   
   movwf   adcon1
        movlw   b'00000010'        ;activacion de interrupcion por TMR2
        movwf   pie1
        bcf     pir1,7
        clrf    pie2
        movlw   .250
        movwf   pr2
   bcf   status,5
;-------------------------------------
        movlw   b'11010000'        ;activacion de interrupcion por INTF, GIE y PEIE
        movwf   intcon
;-------------------------------------
        clrf    tmr2
        clrf    contmr2
        clrf   ptoa
        clrf    ptob
        clrf    ptoc
        clrf    unidad
        clrf    decena
        clrf    centena
        clrf    miles
        clrf    unidt
        clrf    decet
        clrf    centt
        clrf    milt
        clrf    unidta
        clrf    deceta
        clrf    centta
        clrf    milta
        clrf    puntaf
        clrf    puntap
        bsf     ptob,5 ;led cuenta encendido
        bsf     ptob,2 ;led 5 min encendido
;----------------------------
progra  btfss   ptoa,4
        incf    puntaf,1
        movf    puntaf,0
        xorlw   .3
        btfss   status,2
        goto    selec
        clrf    puntaf
selec   btfsc   puntaf,0
        goto    prom
        btfsc   puntaf,1
        goto    time
;----------------------------
;----------------------------
conta   bsf     ptob,5
        bcf     ptob,6
        bcf     ptob,7
        movf    unidad,0
        call    tabla
        movwf   ptoc
        bsf     ptoa,3
        call    ret1ms
        bcf     ptoa,3
        movf    decena,0
        call    tabla  
        movwf   ptoc
        bsf     ptoa,2
        call    ret1ms
        bcf     ptoa,2
        movf    centena,0
        call    tabla
        movwf   ptoc
        bsf     ptoa,1
        call    ret1ms
        bcf     ptoa,1
        movf    miles,0
        call    tabla
        movwf   ptoc
        bsf     ptoa,0
        call    ret1ms
        bcf     ptoa,0
        incf    giro,1
        movf    giro,0
        xorlw   .50
        btfss   status,2
        goto    conta
        clrf    giro
        goto    progra
;-----------------------------
;-----------------------------
time    bsf     ptob,6
        bcf     ptob,5
        bcf     ptob,7
        movf    unidt,0
        call    tabla
        movwf   ptoc
        bsf     ptoa,3
        call    ret1ms
        bcf     ptoa,3
        movf    decet,0
        call    tabla
        movwf   ptoc
        bsf     ptoa,2
        call    ret1ms
        bcf     ptoa,2
        movf    centt,0
        call    tabla
        movwf   ptoc
        bsf     ptoa,1
        call    ret1ms
        bcf     ptoa,1
        movf    milt,0
        call    tabla
        movwf   ptoc
        bsf     ptoa,0
        call    ret1ms
        bcf     ptoa,0
        incf    giro,1
        movf    giro,0
        xorlw   .50
        btfss   status,2
        goto    time
        clrf    giro
        goto    progra  
;--------------------------------
;--------------------------------
prom    call    ret1ms
        call    ret1ms
        call    ret1ms
        call    ret1ms
        bsf     ptob,7
        bcf     ptob,6
        bcf     ptob,5
        incf    giro,1
        movf    giro,0
        xorlw   .50
        btfss   status,2
        goto    prom
        clrf    giro
        goto    progra        
;------------------------------------
        end

Desde ya muchas gracias! Saludos!
« Última modificación: 09 de Octubre de 2012, 21:50:53 por agori »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problemas de reset con TMR2 por interrupción
« Respuesta #1 en: 09 de Octubre de 2012, 22:09:49 »
Hola agori. Bienvenido al foro.

Mirando rápidamente el código veo que no haces un guardado del contexto( registros STATUS, W y PCLATH mínimamente) y luego su correspondiente restauración antes de salir del vector de interrupción.

En el foro hay mucha información sobre esto, o bien podés recurrir al Datasheet del 16F87X, sección 12.11 (Context Saving During Interrupts)

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 agori

  • PIC10
  • *
  • Mensajes: 3
Re: Problemas de reset con TMR2 por interrupción
« Respuesta #2 en: 10 de Octubre de 2012, 20:08:12 »
Hola agori. Bienvenido al foro.

Mirando rápidamente el código veo que no haces un guardado del contexto( registros STATUS, W y PCLATH mínimamente) y luego su correspondiente restauración antes de salir del vector de interrupción.

En el foro hay mucha información sobre esto, o bien podés recurrir al Datasheet del 16F87X, sección 12.11 (Context Saving During Interrupts)

Saludos.

Estimado Bruno, efectivamente ese era el problema! Muchas gracias!

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problemas de reset con TMR2 por interrupción
« Respuesta #3 en: 11 de Octubre de 2012, 03:33:37 »
Me alegro!

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.