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:
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;
}