Autor Tema: Rutina de interrupcion  (Leído 2576 veces)

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

Desconectado migwel

  • PIC10
  • *
  • Mensajes: 3
Rutina de interrupcion
« en: 16 de Noviembre de 2009, 01:19:51 »
Pues ya limpié la bandera de interrupción en RB1, pero aún cuando desborda el TMR0 atiende dos veces la rutina de interrupción y no se por que...es decir, no regresa a esperar el valor, y vuelve a atender la rutina de interrupción...¿Alguna Idea?

#include<p18f452.h>
#include<portb.h>
#include<timers.h>
#pragma config WDT = OFF

int temp, t1, t2, d;
   
void RAI(void);
void main(void)

{
   
   TRISC = 0;      // Puerto C salida
   TRISB = 255;   // Puerto B entrada
   
   OpenRB0INT(PORTB_CHANGE_INT_ON & PORTB_CHANGE_INT_ON & RISING_EDGE_INT & PORTB_PULLUPS_ON);

   OpenRB1INT(PORTB_CHANGE_INT_ON & PORTB_CHANGE_INT_ON & FALLING_EDGE_INT & PORTB_PULLUPS_ON);

   OpenTimer0(TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_1);

   INTCONbits.GIEH = 1; // Activa la GIH
   
   //INTCONbits.TMR0IE = 1; // Permite la interrupción por desborde de TMR0

   while(1)
   
      {
      }
     
   }

# pragma code InterruptVectorHigh = 0x08

void InterruptVectorHigh(void)

   {
   _asm
      goto RAI
   _endasm
   }
   
# pragma code
# pragma interrupt RAI

   
void RAI(void)
   {
      if(INTCONbits.INT0IF == 1)   // Si hay un flanco en RBO
     
         {         
            temp = (unsigned char) ReadTimer0(); // Lee TMR0 de 8 bits
            WriteTimer0( 0 ); // Reseteamos el TMR0
            t2 = temp + (d*256);
            d = 0;
            INTCONbits.INT0IF = 0; // Limpiamos la bandera de interrupción
         }   
         
         
      if(INTCONbits.TMR0IF == 1)  // Si se desbordó el TMR0
     
         {
            d = d + 1;   // Cuenta los desbordamientos
            INTCONbits.TMR0IF = 0;   // Limpiamos la bandera de interrupción
         }
         
      else
         {
            temp = (unsigned char) ReadTimer0(); // Lee TMR0 de 8 bits
            t1 = temp + (d*256);
            INTCONbits.INT0IF = 1; // Decimos que hay una interrupción
            INTCON3bits.INT1IF = 1; // Se limpia la bandera de interrupción de en RB1
         }
   }


Gracias...
« Última modificación: 16 de Noviembre de 2009, 15:25:54 por migwel »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Rutina de interrupcion
« Respuesta #1 en: 16 de Noviembre de 2009, 01:39:53 »
Hay que borrar la bandera de interrupción del evento ocurrido en RB1.


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

Desconectado migwel

  • PIC10
  • *
  • Mensajes: 3
Re: Rutina de interrupcion
« Respuesta #2 en: 16 de Noviembre de 2009, 15:44:34 »
Pues ya limpié la bandera de interrupción en RB1, pero aún cuando desborda el TMR0 atiende dos veces la rutina de interrupción y no se por que...es decir, no regresa a esperar el valor, y vuelve a atender la rutina de interrupción...¿Alguna Idea?

#include<p18f452.h>
#include<portb.h>
#include<timers.h>
#pragma config WDT = OFF

int temp, t1, t2, d;
   
void RAI(void);
void main(void)

{
   
   TRISC = 0;      // Puerto C salida
   TRISB = 255;   // Puerto B entrada
   
   OpenRB0INT(PORTB_CHANGE_INT_ON & PORTB_CHANGE_INT_ON & RISING_EDGE_INT & PORTB_PULLUPS_ON);

   OpenRB1INT(PORTB_CHANGE_INT_ON & PORTB_CHANGE_INT_ON & FALLING_EDGE_INT & PORTB_PULLUPS_ON);

   OpenTimer0(TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_1);

   INTCONbits.GIEH = 1; // Activa la GIH
   
   //INTCONbits.TMR0IE = 1; // Permite la interrupción por desborde de TMR0

   while(1)
   
      {
      }
     
   }

# pragma code InterruptVectorHigh = 0x08

void InterruptVectorHigh(void)

   {
   _asm
      goto RAI
   _endasm
   }
   
# pragma code
# pragma interrupt RAI

   
void RAI(void)
   {
      if(INTCONbits.INT0IF == 1)   // Si hay un flanco en RBO
     
         {         
            temp = (unsigned char) ReadTimer0(); // Lee TMR0 de 8 bits
            WriteTimer0( 0 ); // Reseteamos el TMR0
            t2 = temp + (d*256);
            d = 0;
            INTCONbits.INT0IF = 0; // Limpiamos la bandera de interrupción
         }   
         
         
      if(INTCONbits.TMR0IF == 1)  // Si se desbordó el TMR0
     
         {
            d = d + 1;   // Cuenta los desbordamientos
            INTCONbits.TMR0IF = 0;   // Limpiamos la bandera de interrupción
         }
         
      else
         {
            temp = (unsigned char) ReadTimer0(); // Lee TMR0 de 8 bits
            t1 = temp + (d*256);
            INTCONbits.INT0IF = 1; // Decimos que hay una interrupción
            INTCON3bits.INT1IF = 1; // Se limpia la bandera de interrupción de en RB1
         }
   }


Gracias...


Ya lo estuve checando...y creo que hay un problema con el TMR0, ó no se bien, porque en lo se mete a donde atiende al desbordamiento de TMR0 y lo que tarda en regresar, el TMR0 vuelve a desbordar y por eso atiende 2 veces la rutina de interrupción por RB0. Pero no se porque se tarda 255 estados en esta parte...AYUDA POR FAVOR...GRACIAS


 

anything