Duda en interrupcion de recepcion con CCS

Hola a todos.

Tengo montado un programa en CCS que quiero controlar acciones a traves de la interrupcion de tipo #int_RDA por puerto serie, y lo envio por labview.

La cuestion es que envio un caracter, lo recibe y me lo envia para confirmar, activo y desactivo variables a nivel de 1 y 0, pero cuando el programa principal empieza no hace nada se estanca en la primera condicion que le ordeno dentro del main, es como sino reaccionara con las condiciones que le doy en la interrupcion.

Haber si se me puede decir donde fallo

Muchas gracias.

Dejo el codigo del programa.

PHP:
#include "NewPFC.h"
#include <ds1307.c>
#include <24AA1025.c>
#define SIZE 32

int clock_on=250,i=0,j=0,k=0;
int16 address=0,count=0;
char buffer1[SIZE],buffer2[SIZE],buffer3[SIZE],buffer4[SIZE],buffer5[SIZE],buffer6[SIZE];
BYTE hora,minuto,segundo,mes,any,dia,semana;
BYTE start1,start2,start3,start4,flag1,flag2,flag3; 

#int_RDA
void  RDA_isr(void) 
{
   disable_interrupts(INT_RDA);
   if(kbhit())
   {
      switch (getc())
      {
         case 'K':
                  putc('R');
                  start3=1;
                  start2=0;
                  break;
         case 'J':  
                  putc('M');
                  start2=1;
                  start3=0;
                  start4=0;
                  break;
         case 'D':
                  start1=1;
                  break;       
      }
   }
   enable_interrupts(INT_RDA);
}

#int_TIMER0
void  TIMER0_isr(void) 
{
   disable_interrupts(INT_TIMER0);
   if(i<SIZE)
   {
      set_adc_channel(4);
      buffer1[i]=read_adc();
      set_adc_channel(5);
      buffer2[i]=read_adc();
      set_adc_channel(6);
      buffer3[i]=read_adc();
      set_adc_channel(7);
      buffer4[i]=read_adc();
      set_adc_channel(8);
      buffer5[i]=read_adc();
      set_adc_channel(9);
      buffer6[i]=read_adc();
      i++;
      set_timer0(clock_on);
   }
   enable_interrupts(INT_TIMER0);   
}



void main()
{

   setup_adc_ports(sAN4|sAN5|sAN6|sAN7|sAN8|sAN9|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_4);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
   enable_interrupts(INT_RDA);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab

   start2=1;
   flag1=1;
      
   // TODO: USER CODE!!

   while(true)
   {
         if(start1==1)
         {
            dia=getc();
            mes=getc();
            any=getc();
            hora=getc();
            minuto=getc();
            segundo=getc();
            ds1307_introducir_tiempo(dia, mes, any, semana, hora, minuto, segundo);
            start1=0;
            flag2=1;
            start3=1;
         }   
         if(start2==1)
         {
            while(flag1==1)
            {
               for(j=0;j<=SIZE;j++)
               {
                  output_high(PIN_A0);
                  write_ext_eeprom(address, buffer1[j]);
                  address++;
                  write_ext_eeprom(address, buffer2[j]);
                  address++;
                  write_ext_eeprom(address, buffer3[j]);
                  address++;
                  write_ext_eeprom(address, buffer4[j]);
                  address++;
                  write_ext_eeprom(address, buffer5[j]);
                  address++;
                  write_ext_eeprom(address, buffer6[j]);
                  address++;
                  ds1307_obtener_calendario(dia, mes, any, semana);
                  write_ext_eeprom(address,dia);
                  address++;
                  write_ext_eeprom(address,mes);
                  address++;
                  write_ext_eeprom(address,any);
                  address++;
                  ds1307_obtener_hora(hora, minuto, segundo);
                  write_ext_eeprom(address,hora);
                  address++;
                  write_ext_eeprom(address,minuto);
                  address++;
                  write_ext_eeprom(address,segundo);
                  address++;
               }
               count++;
               i=0;
               j=0;
            }
            count=0;
            address=0;
         }   
         if(start3==1)
         {
            while(flag2==1)
            {
               for(j=0;j<=count;j++)
               {
                  for(k=0;k<=32;j++)
                  {
                     output_high(PIN_A1);
                     putc(read_ext_eeprom(address));
                     address++;
                     putc(read_ext_eeprom(address));
                     address++;
                     putc(read_ext_eeprom(address));
                     address++;
                     putc(read_ext_eeprom(address));
                     address++;
                     putc(read_ext_eeprom(address));
                     address++;
                     putc(read_ext_eeprom(address));
                     address++;
                     putc(read_ext_eeprom(address));
                     address++;
                     putc(read_ext_eeprom(address));
                     address++;
                     putc(read_ext_eeprom(address));
                     address++;
                     putc(read_ext_eeprom(address));
                     address++;
                     putc(read_ext_eeprom(address));
                     address++;
                     putc(read_ext_eeprom(address));
                     address++;
                     delay_ms(100);
                  }
               }
               start3=0;
               flag2=0;
            }
               start4=1;
               flag3=1;
               address=0;
         }         
         if(start4==1)
         {
            while(flag3==1)
            {
               for(j=0;j<=SIZE;j++)
               {
                  putc(buffer1[j]);
                  putc(buffer2[j]);
                  putc(buffer3[j]);
                  putc(buffer4[j]);
                  putc(buffer5[j]);
                  putc(buffer6[j]);
                  ds1307_obtener_calendario(dia, mes, any, semana);
                  putc(dia);
                  putc(mes);
                  putc(any);
                  ds1307_obtener_hora(hora, minuto, segundo);
                  putc(hora);
                  putc(minuto);
                  putc(segundo);   
               }
            }
            
         }
     }
}
 
Última edición por un moderador:
Has intentado limpiar la interrupción con clear_interrupt(INT_RDA), antes del enable... pues algunas veces no se limpia el flag automáticamente con la lectura del registro serial. Si no te funciona prueba sacar toda tu rutina de captura y comparación fuera del RDA y ponla en el main envuelta de un IF cuya variable clave de acceso se habilita en la interrupcion RDA por ejemplo:

PHP:
int1 clave=0;
#INT_RDA
void SerialRX()
{
clave=1;
disable_interrupts(INT_RDA);
}

void main()
{
do
{
....
...
if(clave)
{
...
......
...
}
}while(true);
}

Y ya que estamos con la INT_RDA te pregunto si supieras alguna forma de desertar del SLEEP con esta interrupcion, puesto que en proteus funciona pero en la practica no.
 
Última edición por un moderador:
Atrás
Arriba