ds1307_set_date_time(day,month,year,dow,hour,min,sec); //configuramos DS1307
enable_interrupts(int_timer0);#include <18F4550.h>
#fuses XT,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVREGEN,NOPBADEN // fuse con cristal 4Mhz
#use delay(clock=4M)
#byte portB=0x06
//Definimos Pines LCD
#define LCD_ENABLE_PIN PIN_A0
#define LCD_RS_PIN PIN_A1
#define LCD_RW_PIN PIN_A2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
#include <lcd.c>
//Definimos pines DS1307
#define RTC_SDA Pin_B1
#define RTC_SCL Pin_B2
#include "k:\Practicas PIC\Librerias\_DS1307.c"
//---------------VARIABLES GLOBALES------------------------------------------------
byte day,month,year,dow,hour,min,sec; //variables para DS1307
byte caux; //variable auxiliar para configuracion
//int temp=0,alarma=0,conf=0,ok=0;
int flag=0,var=20; //variables para Timer0
int a=1; //variable para configuracion (para saber que configuramos)
int bandera=0,bandera1=0;
int1 sqw; //variable para ver la onda cuadrada del DS1307
// I-----------NTERRUPCION por EXT Clock Out --------------------------------------------
#int_ext
ext_handler() {
lcd_putc("aqui estamos");
if(sqw==1){
ext_int_edge(0,H_TO_L);
output_low(PIN_E0);
}else{
ext_int_edge(0,L_TO_H);
output_high(PIN_E0);
}
sqw++;
}
//-------------PROGRAMA PRINCIPAL-----------------------------------------------
void main()
{
set_tris_a(0b0111111);
set_tris_b(0b00000111);
set_tris_e(0b00000000);
output_e(0x00);
port_b_pullups(false);
disable_interrupts(global);
disable_interrupts(INT_TIMER0);
disable_interrupts(int_ext);
enable_interrupts(global);
sqw=0;
enable_interrupts(int_ext);
ext_int_edge(0,H_TO_L);
ds1307_init(DS1307_OUT_ON_DISABLED_HIHG | DS1307_OUT_ENABLED | DS1307_OUT_1_HZ);//inicializa DS1307
delay_ms(10);
lcd_init();
ds1307_set_date_time(31,12,99,1,23,59,45); //configuramos DS1307
while(1)
{
}
}
Hola Cortijero me surge una duda ¿Tienes en cuenta que una vez grabado el pic con el ds conectado debes volver a borrar el pic y antes de volver a grabar comentar la linea de configuracion del dsCódigo: CSS
// ds1307_set_date_time(31,12,99,1,23,59,45); //configuramos DS1307
Saludos Miquel_S
Hola
No conozco esa libreria y no se como estará hecha, pero prueba a hacer una pausa luego de guardar los valores, por ejemplo asi:Código: CSS
mostrar(); ds1307_set_date_time(day,month,year,dow,hour,min,sec); //configuramos DS1307 delay_ms(10); // 10 ms de pausa antes de reanudar el funcionamiento. enable_interrupts(int_timer0);
Por otro lado lo que dice Miquel_S es para que cada vez que apagues el reloj no vuelva la hora a cero, pero el problema que tiene ese metodo es que si la pila se agota, ya no volvería a funcionar el reloj, para detectar un problema en el RTC cuando alimento por primera vez el circuito yo lo hago asi:
Al principio y antes del bucle principal, leo los segundos y lo guardo en un temporal, hago una pausa de 1100 ms mas o menos, siempre un poco mas de un segundo, y vuelvo a leer los segundos, si es igual al temporal guardo una hora y una fecha "cero".
De ese modo la primera vez que inicio el circuito me guarda una fecha y horas validas, y si la pila se agota, cuando la cambio, vuelve a funcionar sin tener que modificar nada en el circuito.
saludos.