Autor Tema: PWM con 2 interrupciones PIC16f887  (Leído 6264 veces)

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

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: PWM con 2 interrupciones PIC16f887
« Respuesta #15 en: 25 de Noviembre de 2012, 17:33:53 »
Pero yo pongo un breakpoint en el vector de interrupcion y nunca va ahi, siempre que va a interrupcion va desde:

call   TIMER_interrupcion

Y entonces se me queda en un bucle infinito, no sale de el en:

principal
 
  btfss   INTCON,7         ; comprueba si bit 7 del registro INTCON es 0, si es 0 ejecuta la siguiente instruccion
  call    lee_puertab   
  goto principal

Ya que INTCON,7 esta a 1 porque acaba de ejecutar el retfie, igual hay algo que se me pasa pero aqui:

19.ORG    0x04          ; Vector de interrupción (pag. 216 datasheet)
20.goto ServicioInterrupcion

No me viene nunca y es desde ahi desde donde tiene que ir a la rutina de interrupcion, a este vector vendra cuando se produzca cualquiera de las dos interrupciones,

Mañana si tengo un trato lo miro otro poco. A ver si descubres porque no va al vector de interrupcion.

Desconectado Patri

  • PIC10
  • *
  • Mensajes: 11
Re: PWM con 2 interrupciones PIC16f887
« Respuesta #16 en: 25 de Noviembre de 2012, 17:40:08 »
Aaaa ya se a lo que te refieres. Es que inicialmente llamo yo a lee_puertab y una vez que se ejecuta, deberia producirse una interrupcion por el timer2, pero como el timer esta apagado soy yo quien llama a TIMER_interrupcion. Despues de eso al producirse un cambio en el puerto B se produce la interrupcion (es decir no se produciran las interrupciones hasta que se ejecute primero lee_puertab y despues TIMER_interrupcion). Creo que es eso a lo que te refieres, si no es asi corrijame.
Muchas gracias por las respuestas

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: PWM con 2 interrupciones PIC16f887
« Respuesta #17 en: 25 de Noviembre de 2012, 18:12:14 »
Pues si, exacto, entonces te funciona bien, porque te hace eso, debes chequear aqui el flag del TIMER2

 btfsc   PIE1,1            ; comprueba si bit 1 del registro PIE es 1, si es 1 ejecuta la siguiente instruccion
  goto    TIMER_interrupcion     
        goto    PORTB_interrupcion

Chequea PIR1,TMR2IF en vez de PIE1,1, porque aunque PIE1,1 este a 1 no quiere decir que la interrupcion haya saltado, te dice que eat activa pero no que haya saltado.


Desconectado Patri

  • PIC10
  • *
  • Mensajes: 11
Re: PWM con 2 interrupciones PIC16f887
« Respuesta #18 en: 25 de Noviembre de 2012, 18:43:50 »
De acuerdo lo que he hecho es comprobar el flag RBIF, ya que el TMR2IF esta siempre activo por lo que siempre se ejecutaria TIMER_interrupcion.
Pero de todas formas al encender el timer 2 se enciende el flag TMR2IF y no se puede borrar. No creo que sea del programa ya que he probado en el mismo circuito otro programa y me pasa lo mismo asi que no se si puede ser por las conexiones con el pickit2 o config1... Si me pudieran decir como debe hacerse se lo agradeceria.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: PWM con 2 interrupciones PIC16f887
« Respuesta #19 en: 26 de Noviembre de 2012, 07:05:09 »
No se de donde sacas que TMR2IF esta siempre activo, a mi en la simulacion se me activa solo cuando desborda TIMER2, lo que si activo es el bit  INTCON,PEIE, en la interrupcion debes chequear los dos FLAGS de interrupcion, tambien deberias hacer copias de respaldo de W y STATUS y no borrar registros enteros solo los FLAGS que quieras borrar en cada momento.


;  Guardado de registro W y STATUS.-
Inicio_ISR
   movwf   W_Temp      ; Copiamos W a un registro Temporario.-
   swapf   STATUS, W   ; Invertimos los nibles del registro STATUS.-
   movwf   STATUS_Temp   ; Guardamos STATUS en un registro temporal.-

                 btfsc         PIR1,TMR2IF
                 goto          interrupcion_tiemer
                 btfsc        INTCON,RBIF
                 goto         interrupcion_PORTB
                 goto          Fin_ISR                   ; se sale de la interrupcion, falsa alarma       

               ;aqui las rutinas de ambas interrupciones





              ; Restauramos los valores de W y STATUS.-
Fin_ISR
   swapf   STATUS_Temp,W   ; Invertimos lo nibles de STATUS_Temp.-
   movwf   STATUS
   swapf   W_Temp, f   ; Invertimos los nibles y lo guardamos en el mismo registro.-
   swapf   W_Temp,W   ; Invertimos los nibles nuevamente y lo guardamos en W.-
   retfie         ; Salimos de interrupción.-
;..........................................

Quedaria asi mas o menos. Tampoco debes llamar tu a la interrupcion.

Desconectado Patri

  • PIC10
  • *
  • Mensajes: 11
Re: PWM con 2 interrupciones PIC16f887
« Respuesta #20 en: 26 de Noviembre de 2012, 11:37:00 »
De acuerdo cambiare eso, ¿a que te refieres con que no debo llamar a la interrupcion?
Se que en la simulacion funciona correctamente pero al montar el circuito y ejecutarlo en modo debugger con el pickit2 me da ese error (incluso cargandole otros programas al pic me da el mismo error) y ademas a unos compañeros tambien les pasa lo mismo, no se porque puede ser...
Gracias!!

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: PWM con 2 interrupciones PIC16f887
« Respuesta #21 en: 26 de Noviembre de 2012, 13:29:43 »
Citar
¿a que te refieres con que no debo llamar a la interrupcion?

Me refiero a esta instruccion:

call   TIMER_interrupcion


Citar
Se que en la simulacion funciona correctamente pero al montar el circuito y ejecutarlo en modo debugger con el pickit2 me da ese error (incluso cargandole otros programas al pic me da el mismo error) y ademas a unos compañeros tambien les pasa lo mismo, no se porque puede ser...

En cuanto a que os pase a todos y tambien con otros programas tiene pinta de ser una mala conexion del pickit2 o del PC...

Desconectado Patri

  • PIC10
  • *
  • Mensajes: 11
Re: PWM con 2 interrupciones PIC16f887
« Respuesta #22 en: 26 de Noviembre de 2012, 14:27:40 »
Me dejas mas tranquila... La señal en el osciloscopio esta bien asi que espero que este bien. Muchas gracias por la ayuda!!!


 

anything