Interrupcion externa y conversion ADC no me funcionan juntos CCS

Estoy controlando el ds1307 y midiendo temperatura, utilizo una interrupción externa para configurar el reloj y a la vez mido temperatura. Separados funcionan pero los junto y el ADC no deja que se active la interrupción, que podría ser?

aquí mi código:

C:
#include <18F4550.h>
#device adc=10
#include <stdlib.h>
#fuses NOWDT,NOPROTECT,NOLVP //INTRC_IO
#use delay(clock=8000000)
//#use delay(internal=8000000)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8, parity=N)  //parametros para la comunicación rs232
#use i2c(Master,sda=PIN_c0,scl=PIN_c1,FORCE_SW)       //Configuración I2C por software
#include <lcd.c>



/*************Declaracion de entradas y salidas*************/
#define  boton        pin_b0
#define  led_confi    pin_b7
/***********************************************************/


/*************Declaracion de variables globales*************/
//int flag=0;

char cadena[6];
unsigned int8 segundos,minutos,horas;
unsigned int8 diasS,diasM,meses,anios;

//para la temperatura
int16 q;
float p;
/***********************************************************/



/*************Inicializacion de Funciones*************/
void test_uart(void);
void despliega(void);
void reloj_inicia(void);
void Transforma(void);
void reloj_ingreso(void);

void ds1307_write(unsigned int8 address, int8 data);
void entero_bcd(void);

void temperatura(void);
/*****************************************************/


/*************interrupcion externa presionando boton*************/
#int_EXT
void  EXT_isr(void)
   {

    output_high(led_confi);
    delay_ms(2000);
    output_low(led_confi);
    
    printf("\n\r\n\r Configuracion reloj:");
    
    printf("\n\r año (dos ultimos digitos):");   
    gets(cadena);
    printf("%s",cadena);
    anios=atoi(cadena);

  
    printf("\n\r mes:");
    gets(cadena);
    printf("%s",cadena);
    meses=atoi(cadena);


    printf("\n\r dia:");
    gets(cadena);
    printf("%s",cadena);
    diasM=atoi(cadena);

              
    printf("\n\r hora:");   
    gets(cadena);
    printf("%s",cadena);
    horas=atoi(cadena);

    
    printf("\n\r minuto:");   
    gets(cadena);
    printf("%s",cadena);
    minutos=atoi(cadena);

    
    printf("\n\r segundo:");   
    gets(cadena);
    printf("%s",cadena);
    segundos=atoi(cadena);

  
    //se omite la validacion de datos, porque se asume que la PC mandara los datos correctos
    //se escriben los nuevos datos en el reloj
    entero_bcd();
    reloj_ingreso();
  
   }
/**************************************/


 
/******funcion principal******/
void main()
   { 
   enable_interrupts(GLOBAL);//habilito interrupción global
   enable_interrupts(INT_EXT);//habilito interrupción externa

 
   setup_adc_ports(ALL_ANALOG );     //Canal 0 analógico
   setup_adc(ADC_CLOCK_INTERNAL);    //Fuente de reloj RC
   set_adc_channel(0);           //Habilitación canal0


  
   lcd_init();   
   test_uart();
   reloj_inicia();
  
   while(true)
      {
      temperatura(); //muestrea temperatura
      despliega();   //despliega la hora y fecha
      Delay_ms(1000);
      }

 
   }
/******fin de funcion principal******/



/***********captura temperatura***********/
void temperatura(void)
{
      delay_us(20);
      q = read_adc();                  //Lectura canal 0
      p =q*0.48828125;           //Conversión de temperatura, formula valida para el lm35
}
/***********fin de captura temperatura***********/



/***********test de conexion uart***********/
void test_uart(void)
{
int cont;

for(cont=0;cont<10;cont++)
   {
   delay_ms(1000);
   printf("conectando %d",cont);
   printf("\r\n");
   }
}
/***********fin de test de conexion uart***********/




/***********INICIA RELOJ CON VALORES POR DEFECTO***********/
void reloj_inicia(void)
{
                        //inicia todo en cero
  ds1307_write(0x00,0); //segundos
  ds1307_write(0x01,0); //minutos
  ds1307_write(0x02,0); //horas

  //ds1307_write(0x03,0); //dia de la semana, esto no lo uso de momento
  ds1307_write(0x04,0); //dia del mes
  ds1307_write(0x05,0); //meses
  ds1307_write(0x06,0); //años
  ds1307_write(0x07,0x10); // frecuencia de salida de 1 hertz
 
}
/***********TERMINA RELOJ CON VALORES POR DEFECTO***********/



/***********INGRESA HORA Y FECHA AL RELOJ***********/
void reloj_ingreso(void)
{
 
  ds1307_write(0x00,segundos); //segundos
  ds1307_write(0x01,minutos); //minutos
  ds1307_write(0x02,horas); //horas
  //ds1307_write(0x03,0); //dia de la semana,  esto no lo uso de momento
  ds1307_write(0x04,diasM); //dia del mes
  ds1307_write(0x05,meses); //meses
  ds1307_write(0x06,anios); //años
  ds1307_write(0x07,0x10); // frecuencia de salida de 1 hertz 
 
}
/***********FIN DE INGRESA HORA Y FECHA AL RELOJ***********/


/***********LECTURA DESDE EL RELOJ***********/
void leer_tiempo() {

  i2c_start();               // Issue start signal
  i2c_write(0xD0);           // DIRECCION DEL RELOJ
  i2c_write(0X00);              // INICIA DESDE LA DIRECCION CERO
  i2c_start();               // Issue repeated start signal
  i2c_write(0xD1);           // DIRECCION DEL RELOJ MAS EL BIT DE LECTURA


  segundos = i2c_read(1);     // Read seconds byte
  minutos = i2c_read(1);     // Read minutes byte
  horas = i2c_read(1);       // Read hours byte
  diasS = i2c_read(1);         // Read year/day byte
  diasM = i2c_read(1);         // Read year/day byte
  meses = i2c_read(1);       // Read weekday/month byte
  anios = i2c_read(0);        //0
  i2c_stop();                // Issue stop signal
}
/***********FIN DE LECTURA DESDE EL RELOJ***********/




/***********muestra en rs232***********/
void despliega(void)
{
leer_tiempo();
Transforma(); //transforma de bcd a decimal

lcd_gotoxy(1,1);
printf(lcd_putc,"fecha:%d%d:%d%d:%d%d",(diasM/10),(diasM%10),(meses/10),(meses%10),(anios/10),(anios%10));

lcd_gotoxy(1,2);
printf(lcd_putc,"h:%d%d:%d%d:%d%d %f C",(horas/10),(horas%10),(minutos/10),(minutos%10),(segundos/10),(segundos%10),p);
}
/***********FIN DE MUESTRA EN uart***********/



void Transforma(void)   //bcd a entero, se convierte para poder visualizarlo en el display
{
  segundos=((segundos & 0xF0) >> 4)*10+(segundos & 0x0F);  // Transform segundos
  minutos=((minutos & 0xF0) >> 4)*10+(minutos & 0x0F);     // Transform months
  horas=((horas & 0xF0)  >> 4)*10+(horas & 0x0F);         // Transform hours
  anios=((anios & 0xF0)  >> 4)*10+(anios & 0x0F);         // Transform años
  diasS=((diasS & 0x30) >> 4)*10+(diasS & 0x0F);       // Transform day
  diasM=((diasM & 0x30) >> 4)*10+(diasM & 0x0F);       // Transform day
  meses=((meses & 0x10)  >> 4)*10+(meses & 0x0F);   // Transform month
}


  
void ds1307_write(unsigned int8 address, int8 data){
  i2c_start();                                   // Start I2C protocol
  i2c_write(0xD0);                               // DS1307 address
  i2c_write(address);                            // Send register address
  i2c_write(data);                              // Write data to the selected register
  i2c_stop();                                    // Stop I2C protocol
}

 
void entero_bcd(void)   //entero a bcd, se convierte antes de ingresarlo al reloj
   {
   int alta=0;
   int baja=0;
  
   /*para segundos*/
   alta=segundos/10;
   baja=segundos%10;
  
   alta=alta<<4;
   segundos=alta^baja;
  
   /*para minutos*/
   alta=minutos/10;
   baja=minutos%10;
  
   alta=alta<<4;
   minutos=alta^baja;
      
   /*para horas*/
   alta=horas/10;
   baja=horas%10;
  
   alta=alta<<4;
   horas=alta^baja;
  
   /*para diasM*/
   alta=diasM/10;
   baja=diasM%10;
  
   alta=alta<<4;
   diasM=alta^baja;
  
   /*para meses*/
   alta=meses/10;
   baja=meses%10;
  
   alta=alta<<4;
   meses=alta^baja;
  
   /*para anios*/
   alta=anios/10;
   baja=anios%10;
  
   alta=alta<<4;
   anios=alta^baja;
   }
 

Adjuntos

D@rkbytes

Moderador
Tienes esto:
setup_adc_ports(ALL_ANALOG );

Si configuras todos los puertos con ADC como análogos, estás inhibiendo que RB0 funcione como digital, porque RB0 es AN12.

Si únicamente estás usando RA0 como entrada análoga, deberías usar:
setup_adc_ports(AN0);
 
¿La rutina de interrupción es la de ajuste del reloj?
Yo no lo hubiera hecho así, dará lo mismo quitar los delays, de todos modos se queda ahí esperando una cadena...
 
Claro. En la rutina de la interrupcion, jamas te conviene poner nada mas que cosas muy basicas, como sumas o asignacion de variables, como una bandera para poder, luego en el main hacer lo que se quiera. Pero para tu caso, ni siquiera hace falta una interrupcion, simplemente verifica el estado del pulsador en el loop del main
 

Arriba