Autor Tema: uso de dos interrupciones.  (Leído 1840 veces)

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

Desconectado oman

  • PIC10
  • *
  • Mensajes: 14
uso de dos interrupciones.
« en: 08 de Septiembre de 2011, 17:28:15 »
buen dia.

estoy realizando un proyecto nokia 3220 y microcontrolador para el cual me base en un gran numero de temas de este foro y de otros tambien. en el cual manejo dos interrupciones una externa por rb0, #int_ext y la otra #int_rda de la comunicacion serie con el celular. pero tengo un problema el cual me impide el correcto funcionamiento del programa. la interrupcion #int_ext la utilizo para que cuando se active, el microcontrolador le indique al celular que me mande un mensaje, que contiene valores de sensores. la interrupcion #int_rda la utilizo para guardar los mensajes que me llegan al celular, los cuales seran prosesados para activar algun actuador.

la simulacion en proteus corre bien pero nadamas funciona una interrupcion ya sea la #int_rda, con la cual puedo solo recibir mensajes y activar actuadores, pero la #int_ex deja de funcionar. por el contrario puedo lograr que la interrupcion #int_ex funcione y asi mandar mensajes, pero entonces la interrupcion #int_rda deja de funcionar.

ya e leido mucha informacion sobre este problema pero no logro encontrar una solucion, espero que ustedes me puedan brindar un consejo para solucionarlo.

acontinuacion pongo el codigo con este codigo puedo enviar mensajes, pero no puedo recibirlos:

#include <16f877a.h>
#device adc=10
#FUSES nowdt,xt,noprotect
#use delay (clock=4000000)
#use rs232(baud=9600,parity=N,xmit=pin_c6,rcv=pin_c7,bits=8,stop=1)

#priority  int_rda, int_ext

#include <lcd.c> // librerias usadas
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#use fast_io(a)
#use fast_io(b)
#use fast_io(d)
#use fast_io(c)

//Variables
//Aquí podemos observar las variables utilizadas en el desarrollo de la aplicación:
//////////////////////////////////////////////////////////////////
int xbuff=0x00;   // Indice: siguente char en cbuff.
char cbuff[longbuff]; // Buffer de longitud longbuff.
char rcvchar=0x00; // ultimo caracter recibido.

float iluminacion=0; // Almacena el valor ADC, donde se encuantra la fotorresistencia
float temperatura=0;// Almacena la temperatura proporcionada por el LM35.

int interrupcion = 0; // Bandera utilizada para enviar un mensaje de texto
                       // mediante la funcion enviarMSM().

int16 lectADC0; // Obtiene el valor del ADC canal 0,
// y para luego ser usado para controlar el PWM del CCP2.

char sms[25]; // Almacena el MSM mensaje y discriminamos la parte
// que no nos interesa.
int m; // Auxiliar
   
char pwm[4]; // Almacena el valor que se quiere para el PWM del CCP1
// que proviene del mensaje de texto.
int p;  // auxiliar
int16 x = 0; // Almacena el valor del PWM en formato int16 que proviene del mensaje de
// texto, que originalmente es recibido como char, y el cual es necesario convertirlo
// primero, para luego ser usado en el PWM del CCP1.

int estado = 0;//Estado del relevador
//////////////////////////////////////////////////////////////////


//Declaracion de funciones
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void inicbuff(void); // Borra buffer
void addcbuff(char c); // Añade caracter recibido al buffer
void enviarMSM(void); //Envia un messaje a un determinado numero telefonico.
void hacerLlamada(void); //Hace llamada de prueba y luego la corta
void AbilitaLlegadaMSM(void);
void decodificacionMSM(void); //Decodificacion del MSM recibido y lo ejecuta.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Interrupciones
//////////////////////////////////////////////////////////////////
#int_ext
void ext_isr(void) // Interrupcion externa por RB0.
{
   interrupcion = 1; //Se habilita la bandera cuando ocurre una interrupcion.
   return;
}
#int_rda
void serial_isr(void) // Interrupcion recepcion serie USART
{
   rcvchar=0x00;  //inicializo el caracter recibido
   rcvchar=getchar();
   addcbuff(rcvchar);   // Es almacenado
   return;
}

// Desarrollo de funciones
////////////////////////////////////////////////////////////////////
void addcbuff(char c) // Añade a cbuff el ultimo caracter recibido.
{
   cbuff[xbuff++]=c; //Añade caracter recibido al buffer
   return;
}


void inicbuff(void) //inicializa a cero cbuff
{
   int i;
   for(i=0;i<longbuff;i++)  //bucle que pone a cero
   {                       // todos los caracteres
      cbuff=0x00;       // en el buffer.
   }
   xbuff=0x00; //inicializo el indice de siguente caracter.
   return;
}


void enviarMSM(void)  //envia un mensaje

   set_adc_channel(0); // Selecciono el canal.
   delay_ms(200);
   iluminacion = read_adc(); // Lee el canal
   delay_ms(50);
   set_adc_channel(1); // Selecciono el canal.
   delay_ms(200);
   temperatura = read_adc(); // Lee el canal.
   delay_ms(50);
   
   //delay_ms(30);
   printf("AT\r\n"); // Llama la atencion al telefono. 
   delay_ms(3000);
   printf("AT+CMGF=1\r\n"); //Configura en modo texto al celular.
   delay_ms(3000);
   printf("AT+CMGS=\"618xxxxxxx\"\r\n");// N° MIO del destinatario.
   delay_ms(4000); //del celular al que se envia el sms
   if(estado == 0)
   {
      printf("Rele off");
      delay_ms(50);
   }
   if(estado == 1)
   {
      printf("Rele on");
      //delay_ms(50);
   }
   printf("\rTemperatura = %2.2fC",((temperatura*1.46627)/10.0));
   delay_ms(20);
   printf("\rPWM SMS = %f%%", x*100.0/1023.0);
   delay_ms(20);
   printf("\rPWM ILUM = %Lu%%", (lectADC0/10) );
   putc(26); //ascii(26)=(ctrl+z) envia el mensaje   
   delay_ms(4000);
   printf(lcd_putc,"\fTemp= %2.2fC",((temperatura*1.46627)/10.0));
   delay_ms(4000);
   return;
}
void decodificacionMSM(void)
{
   
}

//Programa principal
/////////////////////////////////////////////////////////////////////
void main()
{   
 
   disable_interrupts(int_rda);  // desabilitamos interrupciones
   disable_interrupts(int_ext);
   disable_interrupts(global);
   
   set_tris_b(0x01);
   set_tris_a(0x03);  // configuramos los puertos
   set_tris_d(0x00);
   set_tris_c(0x80);
   
   output_low(pin_c1);
   output_low(pin_c2);
   output_low(pin_b4); //
   output_low(pin_b2); // Ponemos los pines en nivel bajo solo para asegurar
   output_low(pin_b3); //
   
   port_b_pullups(true); // Pull - up para RB0.
   
   lcd_init();  // inicalizamos el LCD
   
   printf(lcd_putc,"\fProyecto\nTitulacion");// mandamos un mensaje a la lcd
   
   int u;
   for(u=0;u<8;u++)
   {
      retardoPinb2();
   }
   hacerLlamada();   
   AbilitaLlegadaMSM();
               
   enable_interrupts(int_ext); // Habilitamos la interrupcion externa por Rb0
   ext_int_edge(l_to_h); // Con flanco de bajo a alto.
   enable_interrupts(int_rda);//Habilita interrupcion serial.
   enable_interrupts(global);//Habilitacion de interrupcion general
   
   setup_timer_2(T2_DIV_BY_4,249,1);// Configuramos el timer2 a 1khz
   setup_ccp1(CCP_PWM); // Configuramos los modulos como
   setup_ccp2(CCP_PWM); //  dos modulos ccpx como pwm.
   
   set_pwm2_duty(0);
   set_pwm1_duty(0);
   
   setup_ADC_ports(AN0_AN1_VREF_VREF); // Configuramos los pines del puerto A.
   // Resolucion = 1.46627 V/LSB
   setup_adc(adc_clock_internal); // Configuramos el conversor A/D
   set_adc_channel(0); // Especificamos el canal a utilizar con la
   // la funcion read_adc();. Este sensor es el de la iluminacion.
       
   inicbuff(); // vaciamos el buffer
   /////////////////////////////////////////////////////////////////////////////
   while(1)
   {
   
       output_high(pin_b4);
       delay_ms(10);
       output_low(pin_b4);
       delay_ms(10);
     
      //////////////////////////////////////////////////////////////////////////////////////////////
      if (interrupcion==1)
      {
         enviarMSM(); //se llama a la funcion.
         interrupcion = 0; // ponemos la bandera de vuelta a cero para cuando suceda otra evento
         estado=0;
      }
     
 
      decodificacionMSM(); // Se llama a la funcion encargada de decodifucar el MSM.
     
      inicbuff(); // Se borra el buffer
   }///////////////////////////////////////////////////////////////////////////
}
//////////////////////////////////////

Desconectado edward2011

  • PIC10
  • *
  • Mensajes: 4
Re: uso de dos interrupciones.
« Respuesta #1 en: 11 de Septiembre de 2012, 17:55:19 »
Amigo yo se muy poco de micro pero tengo entendido que el micro atiende una sola interrupción a la vez... quizás es eso lo que te esta pasando....


 

anything