Autor Tema: Locura con las interrupciones  (Leído 2179 veces)

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

Desconectado QIQE

  • PIC18
  • ****
  • Mensajes: 335
Locura con las interrupciones
« en: 27 de Marzo de 2007, 16:44:49 »
Hola amigos estoy usando un PIC18f4580 para hacer un "watimetro" el watimetro realmente es un mcp3905, este me da una salida en frecuencia mi problema es el siguiente:

tengo hecho un programa que convierte frecuencia a valor con una interrupcion externa por rb0 y un timer, luego tb necesitoque envie y reciba datos por el rs 232 pero cuando junto todo m i programa que lleva mas cosas no me entra en la interrupción externa, llevo unos dias dandole vueltas podeis mirarlo estoy desesperado:S:S

Código: [Seleccionar]

#include <18F4580.h>
#device adc=10

#FUSES NOWDT,NOPROTECT,NOLVP,HS                    //No Watch Dog Timer
#FUSES
#use delay(clock=20000000)
#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3)


#include <ctype.h>
#include <string.h>
#include <lcd.c>


#int_EXT
void EXT_isr()
   {
   printf("jajaaj");
   switch (flancos)
      {
       case 0:                     //Primer flanco de subida
                set_timer1(0);
                desbordes=0;
                flancos =1;
                printf("jajaaj");
                break;
               
        case 1:                     //Segundo Flanco de subida               
               
               
                TIMER1=get_timer1();
                //medir_frecuencia();     
                flancos=2;
               printf("ejej");
           
                break;
       }     
   }


//----------------Interrupcion puerto serie --------------------------------

#int_RDA
void serial_isr()
{
rcvchar=0x00;


   if (kbhit())
      {

      cbuff[xbuff++]=getc();
      if (xbuff>longitud)
      xbuff=longitud;
      }

}



#INT_TIMER1
void desborda_T1()
   {
   desbordes++;   
   
   }









//##############################################################################
//##                                                                          ##
//##                        Programa                                          ##
//##                                                                          ##
//##############################################################################

void main()
{
   setup_adc_ports(ALL_ANALOG );
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
   setup_timer_2(T2_DIV_BY_1,0,1);
   
   enable_interrupts(INT_RDA);
   ext_int_edge(0,H_TO_L);  //Interrupcion 0 por flanco de subida
   enable_interrupts(INT_TIMER1);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);

   while (true)
  {\\mi código}
}


Muchas gracias por vuestro tiempo.

Saludos desde valencia!!!

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: Locura con las interrupciones
« Respuesta #1 en: 27 de Marzo de 2007, 18:57:09 »
Hola qiqe!

Vamos a ver esto:

Código: [Seleccionar]
#int_EXT
void EXT_isr()
   {
   printf("jajaaj");
   switch (flancos)
      {
       case 0:                     //Primer flanco de subida
                set_timer1(0);
                desbordes=0;
                flancos =1;
                printf("jajaaj");
                break;
               
        case 1:                     //Segundo Flanco de subida               
               
               
                TIMER1=get_timer1();
                //medir_frecuencia();     
                flancos=2;
               printf("ejej");
           
                break;
       }     
   }

Deduzco que la variable 'flancos' es una variable global, ¿no? Confirma esto porfa.

Así a bote pronto veo que 'flancos' lo igualas a 1 y que despues lo igualas a 2.

Aquí a 1:

Código: [Seleccionar]
case 0:                     //Primer flanco de subida
                set_timer1(0);
                desbordes=0;
                flancos =1;
                printf("jajaaj");
                break;

Aquí a 2:

Código: [Seleccionar]
case 1:                     //Segundo Flanco de subida               
               
               
                TIMER1=get_timer1();
                //medir_frecuencia();     
                flancos=2;
               printf("ejej");
           
                break;

Lo tendrías que igualar a 1 y a 0, es decir:

Código: [Seleccionar]
case 0:                     //Primer flanco de subida
                set_timer1(0);
                desbordes=0;
                flancos =1;
                printf("jajaaj");
                break;

Código: [Seleccionar]
case 1:                     //Segundo Flanco de subida               
               
               
                TIMER1=get_timer1();
                //medir_frecuencia();     
                flancos=0;
               printf("ejej");
           
                break;

Ya nos cuentas.


Un saludo desde Alicante.


Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: Locura con las interrupciones
« Respuesta #2 en: 28 de Marzo de 2007, 06:17:05 »
¿Puede ser que un printf() ocupe "demasiado" tiempo dentro de la interrupción y empeicen a aparecer cosas raras?

Desconectado QIQE

  • PIC18
  • ****
  • Mensajes: 335
Re: Locura con las interrupciones
« Respuesta #3 en: 28 de Marzo de 2007, 08:50:50 »
hola azicuetano, correcto flanco es global, su valor flanco lo recojo en el el bucle principal si flanco==2 hago cosas y al final flanco=0, el problema es que nunca entra en la interrupción externa nunca recibo jajaaj ni jejej con lo que deduzco que nunca llega a entrar :S:S
« Última modificación: 28 de Marzo de 2007, 09:10:26 por qiqe »
Muchas gracias por vuestro tiempo.

Saludos desde valencia!!!

Desconectado dhmejia

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 260
Re: Locura con las interrupciones
« Respuesta #4 en: 28 de Marzo de 2007, 09:23:21 »
luego tb necesitoque envie y reciba datos por el rs 232 pero cuando junto todo m i programa que lleva mas cosas no me entra en la interrupción externa

Según esto solo tienes el problema cuando trabajas con el programa completo, deberías mostrarnos todo el código.

saludos.
Pereira - Colombia

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Locura con las interrupciones
« Respuesta #5 en: 28 de Marzo de 2007, 10:15:43 »
Habilitaste las interrupciones con eneble_interrupts()?

Si lo que tienes es un circuito que te entrega frecuencia (supongo que un tren de pulsos cuyo período es proporcional a la señal que tiene a su entrada), mejor no utilizas uno de los temporizadores como contador y te ahorras tener que procesar cada pulso con INT_EXT. No se me parece mejor utilizar este método cuando lo que tienes es una entrada alimentada por un convertidor Algo/Frecuencia.

Un saludo Reinier


 

anything