TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ADY12 en 27 de Mayo de 2015, 04:13:44
-
Hola,
No consigo que muestro la fecha en la que se encuentra, la hora funciona correctamente, pero si pongo la fecha dentro del while aparece la fecha pero el tiempo. He probado de varias maneras pero no hay manera, aquí os dejo el código.
#include <18F4550.h>
#fuses XT //Cristal de cuarzo de 8 MHz
#fuses NOWDT //Perro guardian deshabilitado
#fuses NOPROTECT //Inhabilitado la proteccion contra la lectura
#fuses NOLVP
#fuses MCLR //Reset
#use delay(clock=20000000)
#use i2c(master,SDA=PIN_B5,SCL=PIN_A3,FORCE_SW) //I2C
#include "C:\Users\LIBRERIAS_CCS\ds1307.c" //Reloj
#include "C:\Users\\PROGRAMA_DEFINITIVO\flex_lcd420.c" //LCD
unsigned int8 sec;
unsigned int8 min;
unsigned int8 hrs;
unsigned int8 day;
unsigned int8 mth;
unsigned int8 year;
unsigned int8 dow;
char time;
unsigned int1 am_pm;
unsigned int8 sec_cache=0;
void main(){
ds1307_init();
// Set date for -> 15 Mayo 2015 Viernes
// Set time for -> 11:20:55
ds1307_set_date_time(22,5,15,1,11,0,53,20);
while(True)
{
ds1307_get_time(hrs,am_pm,min,sec);
if(am_pm){time='P';}
else{ time='M';}
if(sec_cache!=sec){
sec_cache=sec;
lcd_init();
lcd_putc('\f');
lcd_gotoxy(1,1);
printf(lcd_putc,"\f\%02d:\%02d:\%02d \%cM\n", hrs,min,sec,time);
}
}
ds1307_get_date(day,mth,year,dow);
lcd_gotoxy(1,2);
printf(lcd_putc,"\f\%02d:\%02d:\%02d", day,mth,year);
}
-
El clock que tengo es de 32KHz.
-
Hola y saludo desde mexico :) tal ves deberias a probar y modificar incluye esto en tu programa
#INCLUDE <18F4550.h>
#FUSES PLL3, CPUDIV1, USBDIV, HSPLL, NOFCMEN, NOWDT, NOPROTECT, NOIESO, PUT
#FUSES NOBROWNOUT, VREGEN, NOWDT, NOSTVREN, NOLVP, NODEBUG, NOPROTECT, NOCPB
#FUSES NOXINST, NOWRT, NOEBTRB, MCLR, NOLPT1OSC, NOPBADEN, STVREN, NODEBUG
#USE DELAY(CLOCK = 48MHZ)
#USE RS232(BAUD = 9600, XMIT = PIN_A0,RCV = PIN_A1)
#DEFINE DEBUG
//REGISTROS UTILIZADOS PARA LA COMUNICACION CON EL DS1307
//-------------------------------------------------------
BYTE SEC,MIN,HRS,DAY,MONTH,YEAR,DOW;
Ahora en el main
DS1307_INIT(); // INICIALIZAR DS1307
DS1307_SET_DATE_TIME(01,01,13,1,12,00,00); // AJUSTA LA FECHA A -> 11 DE JULIO DEL 2013 JUEVES
// AJUSTA LA HORA A -> 12:0:0
WHILE(TRUE)
{
DS1307_GET_DATE(DAY,MONTH,YEAR,DOW); // LEE EL DIA, EL MES, EL AÑO Y DOW
DS1307_GET_TIME(HRS,MIN,SEC); // LEE LA HORA, LOS MINUTOS Y LOS SEGUNDOS
ESCRIBE_HORA(); // VISUALIZA LA HORA EN LCD
IF(!INPUT(PIN_D0)) {
AJUSTA_HORA();
}
DELAY_MS(100);
}
///
Lo siguiente es tomado de la libreria que viene default en ccs compiler
void ds1307_get_date(BYTE &day, BYTE &mth, BYTE &year, BYTE &dow)
{
i2c_start();
i2c_write(0xD0);
i2c_write(0x03); // Start at REG 3 - Day of week
i2c_start();
i2c_write(0xD1);
dow = bcd2bin(i2c_read() & 0x7f); // REG 3
day = bcd2bin(i2c_read() & 0x3f); // REG 4
mth = bcd2bin(i2c_read() & 0x1f); // REG 5
year = bcd2bin(i2c_read(0)); // REG 6
i2c_stop();
}
void ds1307_get_time(BYTE &hr, BYTE &min, BYTE &sec)
{
i2c_start();
i2c_write(0xD0);
i2c_write(0x00); // Start at REG 0 - Seconds
i2c_start();
i2c_write(0xD1);
sec = bcd2bin(i2c_read() & 0x7f);
min = bcd2bin(i2c_read() & 0x7f);
hr = bcd2bin(i2c_read(0) & 0x3f);
i2c_stop();
}