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

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

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Problema Interrupciones Multiples [18F4550]
« Respuesta #15 en: 19 de Agosto de 2012, 12:35:26 »
Ya no se que toque...pero el codigo esta asi:
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   LATDbits.LATD0   
#define led2   LATDbits.LATD1   

char bandera1=0, bandera2=0;

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;
      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;   //Ver si hace falta o no.
   }

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 = 0xF4;      //   periodo del desborde =  4  x  Prescaler  x  (65535 - valor cargado en timer0)
   TMR1L = 0x48;      //                     ----------------------------------------------------
                  //                                  cristal oscilador
   
   INTCONbits.TMR0IE = 1;   //enables timer0 overflow interrupt
   INTCONbits.PEIE = 1;   //enables all unmasked peripheral interrupt 
   INTCONbits.GIEH = 1;   //enables all interrupts   

   TRISD = 0x00;
   LATD = 0x00;

   while(1)
      {
//      if(bandera1==1)
//         {
//         LATDbits.LATD2=!PORTDbits.RD2;
//         bandera1=0;
//         }
//      if(bandera2==1)
//         {
//         LATDbits.LATD3=!PORTDbits.RD3;
//         bandera2=0;
//         }

      }
   }

Y esta andando bien en proteus.....en unos dias voy a probar en el pic....seguramente tambien andara bien

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Problema Interrupciones Multiples [18F4550]
« Respuesta #16 en: 19 de Agosto de 2012, 12:52:38 »
aripod:
          Es que proteus me ha estado dando varios dolores de cabeza.  :5]. Aunque reconozco que fue por mi propia culpa. Y quería saber como había sido el resultado final.  ;-)
          Me pasó que quería ver el cambio de estado de los registros portA, portB, etc. por el watch windows. Y si no consultaba su estado mediante un IF en el programa principal proteus no mostraba ningún cambio en el watchwindows.
          Para hacer las pruebas cambiaba de estado de un pin en RB4 en plena simulación con un botón conectado tanto a gnd como a vcc con su respectiva resistencia y si bien se reflejaba el cambio de estado del pin con el cambio de color en el dibujo del pin del pic, en el watch windows no cambiaba de estado, siempre quedaba en 0.-
          Aclaro que para hacer esa prueba utilicé un programa que constaba únicamente de un while(1);
Código: [Seleccionar]
void main(void)
{
   ADCON1=0x0F;//Todos entrada/salida digitales.
   TRISB = 0b11111111; // PORTB como entradas
   TRISD = 0b00000000; // PORTD como salidas
   LATD = 0b00000000; // TODOS LOS PINES A 0
   while (1);
}

luego agregué el if que transcribo más abajo y si me mostró correctamente los cambios de estado del pin de entrada RB4.
Código: [Seleccionar]

if(PORTBbits.RB4==1) // testeamos RB4.
          {
               LATDbits.LATD0=1; // Si esta en 1 ENCENDEMOS led en RD0.
          }
        else
  {
               LATDbits.LATD0=0; // Si esta en 0 APAGAMOS Led en RD0.
          }

                    Saludos y gracias por responder.
                       Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Problema Interrupciones Multiples [18F4550]
« Respuesta #17 en: 19 de Agosto de 2012, 12:57:01 »
Al principio tenia que hacer lo mismo....pero era porque estaba haciendo LATDbits.LATD.0=!LATDbits.LATD.0 y vez de LATDbits.LATD.0=!PORTDbits.RD0;....creo que esa fue la solucion al problema....
Todo esto es porque necesitaba la int del timer1 para agregarla aun ucos que estoy usando, que basa sus ticks en el timer0......ya cuando pruebe sumandole el timer1, espero que siga andando todo!. Me parecio mas simple probar en un proyecto simple los dos timers simultaneamente para no complicar el sist. embebido mucho.... :-/

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Problema Interrupciones Multiples [18F4550]
« Respuesta #18 en: 28 de Agosto de 2012, 19:01:03 »
Probe las interrupciones con los toggles bien,,,,pero surge un poblema cuando agrego un simple int que vaya incrementando para usarlo en el bucle infinito....

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)

int numero=0;
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;
      LATDbits.LATD0=!PORTDbits.RD0;
      numero++;
      }

   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;   //Ver si hace falta o no.
   }

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 = 0xF4;      //   periodo del desborde =  4  x  Prescaler  x  (65535 - valor cargado en timer0)
   TMR1L = 0x48;      //                     ----------------------------------------------------
                  //                                  cristal oscilador
   
   INTCONbits.TMR0IE = 1;   //enables timer0 overflow interrupt
   INTCONbits.PEIE = 1;   //enables all unmasked peripheral interrupt 
   INTCONbits.GIEH = 1;   //enables all interrupts   

   TRISD = 0x00;
   LATD = 0x00;

   TRISDbits.TRISD2=1;

   while(1)
      {
      if(numero==100)
         {
         numero=0;
         }
      }
   }
El incremento de la variable numero lo hace bien, pero el if(numero==100) entra por mas que numero NO sea igual a 100......
Si deshabilito la interrupciones e incremento numero dentro del while(1) entra al if cuando numero es 100....se entiendie???
Cambie de lugar el if....lo puse dentro de la interrupcion y anda perfecto.....
« Última modificación: 28 de Agosto de 2012, 19:25:44 por aripod »

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Problema Interrupciones Multiples [18F4550]
« Respuesta #19 en: 28 de Agosto de 2012, 23:08:41 »
Probá usando el calificador volatile.
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Problema Interrupciones Multiples [18F4550]
« Respuesta #20 en: 28 de Agosto de 2012, 23:56:50 »
Le agregue el volatile pero sigue igual......en el while infinito entra con cualquier valor y si hago el if dentro de la interrupcion entra segun la condicion del if...