Autor Tema: Problema Interrupciones Multiples [18F4550]  (Leído 4357 veces)

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

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Problema Interrupciones Multiples [18F4550]
« en: 16 de Agosto de 2012, 14:04:51 »
Estoy tratando de utilizar las interrupciones del timer0 y timer1 simultaneamente. Una cada 10ms y la otra cada 3ms respectivamente. Luego de configurar todo, el primer problema surge en que solo se interrumpe una sola vez y nunca mas. El codigo es:

Citar
#include    "p18f4550.h"
#include   "timers.h"

#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config MCLRE = ON
#pragma config PLLDIV = 1   //Divide by 1 (4 MHz oscillator input) (OSC tiene que ser multiplo de 4Mhz)

#define led1   PORTAbits.RA0   
#define led2   PORTAbits.RA1   

void interrupcion(void);

#pragma code prioridad_alta = 0X0008
void interrupcion_alta (void)
   {
   _asm goto interrupcion _endasm
   }
#pragma code

void interrupcion(void)
   {
   if(INTCONbits.TMR0IF == 1)             // check for TMR0 overflow
      {                     
       INTCONbits.TMR0IF = 0;          // clear interrupt flag
       TMR0H = 0xD8;                   // set the timer to expire in 10 ms. (at 4MHz)
       TMR0L = 0xA0;
      led1=!led1;
      }

   if(PIR1bits.TMR1IF == 1)             // check for TMR3 overflow
      {                     
        PIR1bits.TMR1IF = 0;            // clear interrupt flag
        TMR1H = 0xE5;                   // set the timer to expire in 3.3 ms. (at 4MHz)
        TMR1L = 0xF5;
      led2=!led2;
      }
   }

void main(void)
   {
   OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_1);
   TMR0H = 0xD8;
   TMR0L = 0xA0;

   OpenTimer1(TIMER_INT_ON & T1_16BIT_RW & T1_SOURCE_INT & T1_PS_1_1 & T1_OSC1EN_OFF &  T1_SYNC_EXT_OFF );
   TMR1H = 0xE5;
   TMR1L = 0xF5;

   INTCONbits.PEIE = 1;
   INTCONbits.GIEH = 1;

   TRISA = 0x00;

   led1=0;   
   led2=0;

   while(1)
      {

      }
   }

Muchas gracias por la ayuda!!

Desconectado irukza

  • PIC12
  • **
  • Mensajes: 87
Re: Problema Interrupciones Multiples [18F4550]
« Respuesta #1 en: 16 de Agosto de 2012, 15:38:37 »
Hola aripod

El problema es que C18 pone en cero el bit INTCONbits.GIEH automaticamente cada vez que entra en una rutina de atencion de interrupciones. Entonces, justo antes de salir de la rutina debes poner este bit en uno.
Agrega la linea que pongo en rojo y con eso tiene que funcionar.
saludos

void interrupcion(void)
   {
   if(INTCONbits.TMR0IF == 1)             // check for TMR0 overflow
      {                     
       INTCONbits.TMR0IF = 0;          // clear interrupt flag
       TMR0H = 0xD8;                   // set the timer to expire in 10 ms. (at 4MHz)
       TMR0L = 0xA0;
      led1=!led1;
      }

   if(PIR1bits.TMR1IF == 1)             // check for TMR3 overflow
      {                     
        PIR1bits.TMR1IF = 0;            // clear interrupt flag
        TMR1H = 0xE5;                   // set the timer to expire in 3.3 ms. (at 4MHz)
        TMR1L = 0xF5;
      led2=!led2;
      }
INTCONbits.GIEH = 1;
   }

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Problema Interrupciones Multiples [18F4550]
« Respuesta #2 en: 16 de Agosto de 2012, 16:08:17 »
Agragada esa linea interrumpe....pero...los tiempos no son los que esperaba ver.....es mas, son aleatorios...no esta produciendo el desborde inclusive en la proporcion que deberia (tres interrupciones del timer1 por cada interrupcion del timer0)

Desconectado irukza

  • PIC12
  • **
  • Mensajes: 87
Re: Problema Interrupciones Multiples [18F4550]
« Respuesta #3 en: 16 de Agosto de 2012, 17:24:23 »
Eso es porque esta mal el valor que le das al TMR1. Cargalo con el valor 0xf448. No te olvides de modificar este valor en la rutina de atencion a interrupciones.

Desconectado irukza

  • PIC12
  • **
  • Mensajes: 87
Re: Problema Interrupciones Multiples [18F4550]
« Respuesta #4 en: 16 de Agosto de 2012, 17:49:52 »
Perdon, me doy cuenta ahora que hice el calculo para 3ms. El valor que debes usar es 0xf31c para 3.3ms.
Saludos

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Problema Interrupciones Multiples [18F4550]
« Respuesta #5 en: 16 de Agosto de 2012, 20:10:20 »
Cambie el valor que estaba mal calculado....y el resultado que veo en proteus esta  en la imagen adjuntada.

La señal en amarillo es la del timer0 y la de azul es del timer1. El osc esta en 5mS/Div, por lo cual se puede ver que ni la de timer0 es de 10mS y ni la de azul es de 3mS. Es mas, cambia el tiempo de la interrupcion......y se puede ver que una es la inversa de la otra.
« Última modificación: 16 de Agosto de 2012, 20:38:01 por aripod »

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Problema Interrupciones Multiples [18F4550]
« Respuesta #6 en: 18 de Agosto de 2012, 12:46:45 »
Las interrupciones andan bien cuando las voy viendo con el MPLABSim, por tres interrupciones del timer1 hace una del timer0....pero,,,dentro de la interrupcion cuando hago LATDbits.LATD0=!LATDbits.LATD0, nunca pone en uno en el puerto.....pero si lo hago dentro del main, usando una variable de bandera en la interrupcion en vez de cambiar el valor del puerto, anda perfecto.
No se pueden cambiar los valores de los puertos, ya sea dentro de la interrupcion o en una llamada proveniente de la interrupcion?? Solo puedo cambiar valores de puertos cuando no hay interrupciones??
« Última modificación: 18 de Agosto de 2012, 13:18:20 por aripod »

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Problema Interrupciones Multiples [18F4550]
« Respuesta #7 en: 18 de Agosto de 2012, 13:31:43 »
has probado a poner LATDbits.LATD0=!PORTDbits.RD0; ?

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Problema Interrupciones Multiples [18F4550]
« Respuesta #8 en: 18 de Agosto de 2012, 13:33:37 »
Con LATDbits.LATD0=!PORTDbits.RD0; anduvo perfecto!!
Gracias por la ayuda!!

Edit: Me apure en responder.....con el MPLABSim anda bien,,,pero cuando lo veo en proteus deja de andar....
« Última modificación: 18 de Agosto de 2012, 14:02:13 por aripod »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema Interrupciones Multiples [18F4550]
« Respuesta #9 en: 18 de Agosto de 2012, 14:48:28 »
Los registros LAT se usan para escribir en el puerto y los registros PORT para leerlos, ten en cuenta eso  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Problema Interrupciones Multiples [18F4550]
« Respuesta #10 en: 18 de Agosto de 2012, 15:03:11 »
Los registros LAT se usan para escribir en el puerto y los registros PORT para leerlos, ten en cuenta eso  ;-)


Saludos!

Teniendo en cuenta eso, ahora con el while infinito vacio y sin banderas, tengo en las interrupciones:
Citar
void interrupcion(void)
   {
   if(INTCONbits.TMR0IF == 1)             // check for TMR0 overflow
      {                    
       INTCONbits.TMR0IF = 0;          // clear interrupt flag
       TMR0H = 0xD8;                   // set the timer to expire in 10 ms. (at 4MHz)
       TMR0L = 0xA0;
      LATDbits.LATD0=!PORTDbits.RD0;
      //bandera1=!bandera1;
      }

   if(PIR1bits.TMR1IF == 1)             // check for TMR1 overflow
      {                    
        PIR1bits.TMR1IF = 0;            // clear interrupt flag
        TMR1H = 0xF4;                   // set the timer to expire in 3.3 ms. (at 4MHz)
        TMR1L = 0x48;
      LATDbits.LATD1=!PORTDbits.RD1;
      //bandera2=!bandera2;
      }
   
   INTCONbits.GIEH = 1;
   }
Viendolo en el watch anda bien,,,,pero cuando lo veo en proteus deja de andar.....es confiable esto en proteus o deberia bajarlo al pic y ver con un osciloscopio?
« Última modificación: 18 de Agosto de 2012, 15:05:36 por aripod »

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: Problema Interrupciones Multiples [18F4550]
« Respuesta #11 en: 18 de Agosto de 2012, 19:53:10 »
No hay nada mejor que probarlo en la vida real, ya me paso que en el proteus no simulaba bien, pero en el ckto si o a veces ocurria al reves.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema Interrupciones Multiples [18F4550]
« Respuesta #12 en: 18 de Agosto de 2012, 20:05:26 »
El tema de colocar INTCONbits.GIEH=1 al terminar la interrupción yo no lo uso  :roll: Me parece que el problema viene en la simulación con MPLAB SIM y no de C18.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Problema Interrupciones Multiples [18F4550]
« Respuesta #13 en: 18 de Agosto de 2012, 20:08:21 »
Voy a probar de no usarllo al final de la interrupcion....y lo voy a bajar al pic entonces......
Otra vez, gracias a los que me ayudaron!

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Problema Interrupciones Multiples [18F4550]
« Respuesta #14 en: 19 de Agosto de 2012, 12:30:52 »
aripod:
           con las modificaciones que hiciste ¿funcionó bien la simulación en proteus?.
                Saludos.
                           Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes