Autor Tema: ayuda 1307  (Leído 17243 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ncoliv

  • PIC16
  • ***
  • Mensajes: 130
Re: ayuda 1307
« Respuesta #45 en: 12 de Enero de 2009, 22:04:57 »
Hola muchachos, de nuevo en el ruedo, estoy modificando un  programita hecho para el ds1302 lo quiero lleevar al ds1307el problema es el siguiente me aparecen estos errores:
>>> Warning 203 "C:\ARCHIV~1\PICC\drivers\ds1307.c" Line 233(1,1): Condition always TRUE
*** Error 12 "rtc2.c" Line 81(13,14): Undefined identifier  -- rtc_get_date
*** Error 12 "rtc2.c" Line 82(13,14): Undefined identifier  -- rtc_get_time
*** Error 12 "rtc2.c" Line 100(9,10): Undefined identifier  -- rtc_init
*** Error 48 "rtc2.c" Line 116(1,11): Expecting a (
*** Error 76 "rtc2.c" Line 116(1,2): Expect ;
*** Error 12 "rtc2.c" Line 189(5,8): Undefined identifier   por
*** Error 12 "rtc2.c" Line 197(17,18): Undefined identifier  -- rtc_set_datetime
*** Error 12 "rtc2.c" Line 201(1,15): Undefined identifier   interrupciones
*** Error 12 "rtc2.c" Line 213(12,22): Undefined identifier   incremento
*** Error 51 "rtc2.c" Line 215(1,5): A numeric expression must appear here
*** Error 51 "rtc2.c" Line 216(1,5): A numeric expression must appear here
*** Error 51 "rtc2.c" Line 217(1,5): A numeric expression must appear here
*** Error 76 "rtc2.c" Line 280(1,2): Expect ;
*** Error 76 "rtc2.c" Line 306(1,2): Expect ;
      14 Errors,  1 Warnings.
 buscandolaS LINEAS veo lo siguiente:
if(var==0)
var=2; //...ajuste fino de 130ms aprox
flag=0; //reset flag para contar 130ms aprox
rtc_get_date(day,mth,year); //coge dia,mes,año //linea 81
rtc_get_time(hour,min,sec ); //coge hora,minuto,segundo //linea 82
printf(lcd_putc,"\fFecha: %2X/%2X/%2X\nHora: %2X:%2X:%2X",day,mth,year,hour,min,sec);

que puede estar sucediendo en esta linea
muchas gracias

Desconectado ncoliv

  • PIC16
  • ***
  • Mensajes: 130
Re: ayuda 1307
« Respuesta #46 en: 13 de Enero de 2009, 16:54:33 »
Hola nuevamente, a que se deberan estos errrores:

*** Error 12 "rtc2.c" Line 81(13,14): Undefined identifier  -- rtc_get_date
*** Error 12 "rtc2.c" Line 82(13,14): Undefined identifier  -- rtc_get_time

en estas dos lineas

81 rtc_get_date(day,mth,year); //coge dia,mes,año
82 rtc_get_time(hour,min,sec ); //coge hora,minuto,segundo

 estoy modificando un programita hecho para un rtc ds1302 para un 1307


Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: ayuda 1307
« Respuesta #47 en: 13 de Enero de 2009, 22:48:09 »
Hola ncoliv, cuantos errores muestra, ese error aparece porque o bien no has definido la función o está incorrecto

me parece que en la definición falta especificar si devuelve o no algún tipo de dato, antepón un void en la definición de la función:

void rtc_get_date();  //primero se puede definir que habrá la función

void rtc_get_date(){   // y después la desarrollas
...
}

y para llamarla harás:
rtc_get_date();   //esto en el main

nose si se entendió o si realmente será ese el problema, por mi parte quisiera ayudarte con esto, pero necesito ver los códigos que has hecho y la librería de ser necesario, si deseas podrías adjuntarlo acá o subirlos a un servidor de la web y pasarnos el link

un saludo.
.

Desconectado ncoliv

  • PIC16
  • ***
  • Mensajes: 130
Re: ayuda 1307
« Respuesta #48 en: 14 de Enero de 2009, 00:34:06 »
Ok cryn, te agradezco la respuesta. aqui van las líneas con las que stoy trabajando:


//Este programa una version del rtc1302 adaptada al 1307
////////////////////////////////////////////////////////////////////////////////////
// Programa: Reloj-Calendario DS1307
// Version: 0.0
//
// Dispositivo: PIC 16F877A Compilador: CCS
// Entorno IDE: MPLAB IDE v7.21 Simulador: Proteus 6.7sp3
//
// Notas: Se muestra por pantalla de lcd la fecha y hora obtenida mediante la
// lectura del DS1307. Pudiendose modificar mediante los botones Conf/Ok y up.
// Se utiliza variables globales:
// ·day-> dia ds1302/07
// ·mth -> mes ds1302/07
// ·year -> año ds1302/07
// ·hour -> hora ds1302/07
// ·min -> minutos ds1302/07
// ·sec-> segundos ds1302/07
// ·menu -> variable que muestra opcion del menu configurar
// ·flag -> variable que cuenta hasta 130ms aprox.
// ·var -> ajuste fino para que desborde cada 130ms aprox.
// Se carga el TMR0 con 0 por lo tanto se desborda en 65ms aprox, queremos
// visualizar y restaurar valores cogidos del ds1302 cada 130ms aprox por lo tanto
// utilizamos una variable llamada flag que sera la encargada de dicha tarea.
// Al inicio del programa debe ser configurado el reloj, siendo el boton 'up' el
// encargado de ir moviendose mediante las opciones del menu:hora,minutos,....
// y el boton 'Conf/Ok' el encargado de configurar el reloj(cuando estemos en modo ver
// hora y fecha) o el encargado de salir de la configuracion de las opciones(cuando
// estemos en formato de configurar fecha y hora).
// Tener en cuenta que hay que poner la directiva NOLVP para que el pin B4 sea de
// salida.
// Conexiones: B0 -> SDA DS1307
// B1 -> SCL DS1307
// B2-> I/O DS1307
// B3 -> Boton 'up'
// B5 -> Boton 'Conf/Ok'
// D0 -> E
// D1 -> RS
// D2 -> RW
// D4 -> D4
// D5 -> D5
// D6 -> D6
// D7 -> D7
// D3 -> Zumbador(beep)
//////////////////////////////////////////////////////////////////////////////////

#include <16f877a.h> //pic a utilizar
#use delay(CLOCK=4000000) //Fosc=4Mhz
#fuses HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT //comandos para el programador
#use standard_io(b)
#use standard_io(d)
#define use_portd_lcd TRUE //utilizar el port d para lcd
#define RTC_SCL PIN_B1 //definimos pin's...
#define RTC_IO PIN_B2
#define RTC_SDA PIN_B0 //...de conexion de la rtc ds1302
#include <ds1307.c> //libreria de rtc ds1307
#include <lcd.c> //libreria de lcd



///VARIABLES GLOBALES
byte day,mth,year,dow,hour,min,sec; //variabes para ds1307
byte menu=0,flag =0,var=2; //variables para menu configurar

///DEFINICION DE FUNCIONES
void configurar(void);
void horas(void);
void minutos(void);
void dia(void);
void mes(void);
void anio(void);
void beep(void);

///LLAMADA FUNCION INTERRUPCION
#INT_TIMER0
void interrupcion()
{
if(flag>var){ //¿ya es 130ms aprox?
var--; //SI -> decremento var...
if(var==0)
var=2; //...ajuste fino de 130ms aprox
flag=0; //reset flag para contar 130ms aprox
rtc_get_date(day,mth,year); //coge dia,mes,año
rtc_get_time(hour,min,sec ); //coge hora,minuto,segundo
printf(lcd_putc,"\fFecha: %2X/%2X/%2X\nHora: %2X:%2X:%2X",day,mth,year,hour,min,sec);

//lcd
}

set_timer0(0); //reset TMR0
flag++; //incremento variable flag
}

///PROGRAMA
void main(void){

enable_interrupts(INT_TIMER0); //interrupcion TIMER0 activada
setup_counters(RTCC_INTERNAL,RTCC_DIV_256); //configuracion interrupcion TMR0
set_timer0(0); //carga TMR0

lcd_init(); //inicializa lcd
rtc_init(); //inicializa rtc

lcd_putc("Reloj Calendario\n VsZeNeR'05" ); //presentacion...
delay_ms(800); //...inicial

configurar(); //ve a menu configurar
enable_interrupts(GLOBAL); //activadas interrupciones

for( ; ; ){ //bucle...
if(input(PIN_A5)==0){ //Si se pulsa Conf....
while(!input(PIN_A5)){} //elimina rebotes
beep();
configurar();
} //ve a menu

configurar
}; //...infinito
}

///FUNCION CONFIGURAR
void configurar(void){
disable_interrupts(GLOBAL); //desactivadas interrupciones

do{
switch(menu){
case 0: lcd_putc("\fConfigurar\nhoras?" ); //horas
if(!input(PIN_A5)){
while(!input(PIN_A5)){}
beep();
horas();
menu=1;

//apunta siguiente opcion
}
break;
case 1: lcd_putc("\fConfigurar\nminutos?" ); //minutos
if(!input(PIN_A5)){
while(!input(PIN_A5)){}
beep();
minutos();
menu=2;

//apunta siguiente opcion
}
break;
case 2: lcd_putc("\fConfigurar\ndia?" ); //dias
if(!input(PIN_A5)){
while(!input(PIN_A5)){}
beep();
dia();
menu=3;

//apunta siguiente opcion
}
break;
case 3: lcd_putc("\fConfigurar\nmes?" ); //mes
if(!input(PIN_A5)){
while(!input(PIN_A5)){}
beep();
mes();
menu=4;

//apunta siguiente opcion
}
break;
case 4: lcd_putc("\fConfigurar\nanio?" ); //años
if(!input(PIN_A5)){
while(!input(PIN_A5)){}
beep();
anio();
menu=5;

//apunta siguiente opcion
}
break;
case 5: lcd_putc("\fSalir\nconfigurar?" ); //salir configuracion
if(!input(PIN_A5)){
menu=6;
beep();
}
}

if(!input(PIN_A3)){ //controla el boton up...
while(!input(PIN_A3)){}
menu++;
if(menu>5)
menu=0;
} //...para mostrar menu

por lcd

delay_ms(130); //retardo para ver lcd
}while(menu<6);

menu=0;

//actualiza indices menu
rtc_set_datetime(day,mth,year,dow,hour,min); //nueva hora,minuto,...
enable_interrupts(GLOBAL); //activadas

interrupciones
set_timer0(0);

//carga TMR0
}
///FUNCION CONFIGURA HORAS
void horas(void){
printf(lcd_putc,"\fConf.Horas:\nHora: %2X:%2X:%2X",hour,min,sec); //muestra por lcd
do{
if(!input(PIN_A3)){ //¿se ha pulsado up?
while(!input(PIN_A3)){} //elimina rebotes
hour++; //SI ->

incremento hour
switch(hour){ //limites...
case 0x0A: hour=0x10;break;
case 0x1A: hour=0x20;break;
case 0x24: hour=0x00;
}

//...hour
printf(lcd_putc,"\nHora: %2X:%2X:%2X",hour,min,sec); //muestra por lcd hour
}
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCION CONFIGURA MINUTOS
void minutos(void){
printf(lcd_putc,"\fConf.Minutos:\nHora: %2X:%2X:%2X",hour,min,sec); //muestra por lcd
do{
if(!input(PIN_A3)){ //¿se ha pulsado up?
while(!input(PIN_A3)){} //elimina rebotes
min++; //SI -> incremento min
switch(min){ //limites...
case 0x0A: min=0x10;break;
case 0x1A: min=0x20;break;
case 0x2A: min=0x30;break;
case 0x3A: min=0x40;break;
case 0x4A: min=0x50;break;
case 0x5A: min=0x00;
} //...min
printf(lcd_putc,"\nHora: %2X:%2X:%2X",hour,min,sec); //muestra por lcd min
}
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCION CONFIGURA DIAS
void dia(void){
printf(lcd_putc,"\fConf.Dias:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por lcd
do{
if(!input(PIN_A3)){ //¿se ha pulsado up?
while(!input(PIN_A3)){} //elimina rebotes
day++; //SI -> incremento day
switch(day){ //limites...
case 0x0A: day=0x10;break;
case 0x1A: day=0x20;break;
case 0x2A: day=0x30;break;
case 0x32: day=0x01;
} //...day
printf(lcd_putc,"\fConf.Dias:\nFecha: %2X/%2X/%2X",day,mth,year);

//muestra por lcd day
}
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCION CONFIGURA MES
void mes(void){
printf(lcd_putc,"\fConf.Mes:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por lcd
do{
if(!input(PIN_A3)){ //¿se ha pulsado up?
while(!input(PIN_A3)){} //elimina rebotes
mth++; //SI -> incremento mth
switch(mth){ //limites...
case 0x0A: mth=0x10;break;
case 0x13: mth=0x01;
} //...mth
printf(lcd_putc,"\fConf.Mes:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por

lcd
}
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCION CONFIGURA AÑOS
void anio(void){
printf(lcd_putc,"\fConf.Anio:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por lcd
do{
if(!input(PIN_A3)){ //¿se ha pulsado up?
while(!input(PIN_A3)){} //elimina rebotes
year++; //SI -> incremento mth
switch(year){ //limites...
case 0x0A: year=0x10;break;
case 0x1A: year=0x20;break;
case 0x2A: year=0x30;break;
case 0x3A: year=0x40;break;
case 0x4A: year=0x50;break;
case 0x5A: year=0x60;break;
case 0x6A: year=0x70;break;
case 0x7A: year=0x80;break;
case 0x8A: year=0x90;break;
case 0x9A: year=0x00;
} //...year
printf(lcd_putc,"\fConf.Anio:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por

lcd
}
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCION BEEP
void beep(void){
output_high(PIN_B3); //activa zumbador
delay_ms(50);
output_low(PIN_B3); //desactiva zumbador
}

lo puedes compilar y encontrar las líneas de los errores
tratare de estudiar lo que me dices.
un saludo


Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: ayuda 1307
« Respuesta #49 en: 14 de Enero de 2009, 01:16:11 »
hola bueno esto es lo que yo haría:

Código: [Seleccionar]
//Este programa una version del rtc1302 adaptada al 1307
////////////////////////////////////////////////////////////////////////////////////
// Programa: Reloj-Calendario DS1307
// Version: 0.0
//
// Dispositivo: PIC 16F877A Compilador: CCS
// Entorno IDE: MPLAB IDE v7.21 Simulador: Proteus 6.7sp3
//
// Notas: Se muestra por pantalla de lcd la fecha y hora obtenida mediante la
// lectura del DS1307. Pudiendose modificar mediante los botones Conf/Ok y up.
// Se utiliza variables globales:
// ·day-> dia ds1302/07
// ·mth -> mes ds1302/07
// ·year -> año ds1302/07
// ·hour -> hora ds1302/07
// ·min -> minutos ds1302/07
// ·sec-> segundos ds1302/07
// ·menu -> variable que muestra opcion del menu configurar
// ·flag -> variable que cuenta hasta 130ms aprox.
// ·var -> ajuste fino para que desborde cada 130ms aprox.
// Se carga el TMR0 con 0 por lo tanto se desborda en 65ms aprox, queremos
// visualizar y restaurar valores cogidos del ds1302 cada 130ms aprox por lo tanto
// utilizamos una variable llamada flag que sera la encargada de dicha tarea.
// Al inicio del programa debe ser configurado el reloj, siendo el boton 'up' el
// encargado de ir moviendose mediante las opciones del menu:hora,minutos,....
// y el boton 'Conf/Ok' el encargado de configurar el reloj(cuando estemos en modo ver
// hora y fecha) o el encargado de salir de la configuracion de las opciones(cuando
// estemos en formato de configurar fecha y hora).
// Tener en cuenta que hay que poner la directiva NOLVP para que el pin B4 sea de
// salida.
// Conexiones: B0 -> SDA DS1307
// B1 -> SCL DS1307
// B2-> I/O DS1307
// B3 -> Boton 'up'
// B5 -> Boton 'Conf/Ok'
// D0 -> E
// D1 -> RS
// D2 -> RW
// D4 -> D4
// D5 -> D5
// D6 -> D6
// D7 -> D7
// D3 -> Zumbador(beep)
//////////////////////////////////////////////////////////////////////////////////

#include <16f877a.h> //pic a utilizar
#use delay(CLOCK=4000000) //Fosc=4Mhz
#fuses HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT //comandos para el programador
#use standard_io(b)
#use standard_io(d)
#define use_portd_lcd TRUE //utilizar el port d para lcd
#define RTC_SCL PIN_B1 //definimos pin's...
#define RTC_IO PIN_B2
#define RTC_SDA PIN_B0 //...de conexion de la rtc ds1302
#include <ds1307.c> //libreria de rtc ds1307
#include <lcd.c> //libreria de lcd

///VARIABLES GLOBALES
byte day,mth,year,dow,hour,min,sec; //variabes para ds1307
byte menu=0,flag =0,var=2; //variables para menu configurar

///DEFINICION DE FUNCIONES
void configurar(void);
void horas(void);
void minutos(void);
void dia(void);
void mes(void);
void anio(void);
void beep(void);
//******************/////////////////*************
//definición de las funciones
void rtc_get_date(dd,mm,yy);
void rtc_get_time(hh,mm,ss);
void rtc_set_datetime(dd,mm,yy,dow,hh,mi);
void rtc_init(void);
//***********************************************//

///LLAMADA FUNCION INTERRUPCION
#INT_TIMER0
void interrupcion(){
   if(flag>var){ //¿ya es 130ms aprox?
      var--; //SI -> decremento var...
   if(var==0)
      var=2; //...ajuste fino de 130ms aprox
   flag=0; //reset flag para contar 130ms aprox
   rtc_get_date(day,mth,year); //coge dia,mes,año
   rtc_get_time(hour,min,sec ); //coge hora,minuto,segundo
   printf(lcd_putc,"\fFecha: %2X/%2X/%2X\nHora: %2X:%2X:%2X",day,mth,year,hour,min,sec);
   //lcd
   }
   set_timer0(0); //reset TMR0
   flag++; //incremento variable flag
}

///PROGRAMA
void main(void){
   enable_interrupts(INT_TIMER0); //interrupcion TIMER0 activada
   setup_counters(RTCC_INTERNAL,RTCC_DIV_256); //configuracion interrupcion TMR0
   set_timer0(0); //carga TMR0

   lcd_init(); //inicializa lcd
   rtc_init(); //inicializa rtc

   lcd_putc("Reloj Calendario\n VsZeNeR'05" ); //presentacion...
   delay_ms(800); //...inicial

   configurar(); //ve a menu configurar
   enable_interrupts(GLOBAL); //activadas interrupciones

   for( ; ; ){ //bucle...
      if(input(PIN_A5)==0){ //Si se pulsa Conf....
         while(!input(PIN_A5)){} //elimina rebotes
         beep();
         configurar();
      } //ve a menu configurar
   }; //...infinito
}

///FUNCION CONFIGURAR
void configurar(void){
   disable_interrupts(GLOBAL); //desactivadas interrupciones
   do{
      switch(menu){
         case 0: lcd_putc("\fConfigurar\nhoras?" ); //horas
            if(!input(PIN_A5)){
               while(!input(PIN_A5)){}
               beep();
               horas();
               menu=1;
               //apunta siguiente opcion
            }
            break;
         case 1: lcd_putc("\fConfigurar\nminutos?" ); //minutos
            if(!input(PIN_A5)){
               while(!input(PIN_A5)){}
                  beep();
                  minutos();
                  menu=2;
                  //apunta siguiente opcion
               }
            break;
         case 2: lcd_putc("\fConfigurar\ndia?" ); //dias
            if(!input(PIN_A5)){
               while(!input(PIN_A5)){}
               beep();
               dia();
               menu=3;
               //apunta siguiente opcion
            }
            break;
         case 3: lcd_putc("\fConfigurar\nmes?" ); //mes
            if(!input(PIN_A5)){
               while(!input(PIN_A5)){}
               beep();
               mes();
               menu=4;
               //apunta siguiente opcion
            }
            break;
         case 4: lcd_putc("\fConfigurar\nanio?" ); //años
            if(!input(PIN_A5)){
               while(!input(PIN_A5)){}
               beep();
               anio();
               menu=5;
               //apunta siguiente opcion
            }
               break;
         case 5: lcd_putc("\fSalir\nconfigurar?" ); //salir configuracion
            if(!input(PIN_A5)){
               menu=6;
               beep();
            }
      }
      if(!input(PIN_A3)){ //controla el boton up...
         while(!input(PIN_A3)){}
         menu++;
         if(menu>5)
            menu=0;
      } //...para mostrar menu por lcd
      delay_ms(130); //retardo para ver lcd
   }while(menu<6);
   menu=0;
   //actualiza indices menu
   rtc_set_datetime(day,mth,year,dow,hour,min); //nueva hora,minuto,...
   enable_interrupts(GLOBAL); //activadas interrupciones
   set_timer0(0);
   //carga TMR0
}

///FUNCION CONFIGURA HORAS
void horas(void){
   printf(lcd_putc,"\fConf.Horas:\nHora: %2X:%2X:%2X",hour,min,sec); //muestra por lcd
   do{
      if(!input(PIN_A3)){ //¿se ha pulsado up?
         while(!input(PIN_A3)){} //elimina rebotes
         hour++; //SI -> incremento hour
         switch(hour){ //limites...
            case 0x0A: hour=0x10;break;
            case 0x1A: hour=0x20;break;
            case 0x24: hour=0x00;
         }
         //...hour
         printf(lcd_putc,"\nHora: %2X:%2X:%2X",hour,min,sec); //muestra por lcd hour
      }
   }while(input(PIN_A5));
   while(!input(PIN_A5)){} //elimina rebotes
}

///FUNCION CONFIGURA MINUTOS
void minutos(void){
   printf(lcd_putc,"\fConf.Minutos:\nHora: %2X:%2X:%2X",hour,min,sec); //muestra por lcd
   do{
      if(!input(PIN_A3)){ //¿se ha pulsado up?
         while(!input(PIN_A3)){} //elimina rebotes
         min++; //SI -> incremento min
         switch(min){ //limites...
            case 0x0A: min=0x10;break;
            case 0x1A: min=0x20;break;
            case 0x2A: min=0x30;break;
            case 0x3A: min=0x40;break;
            case 0x4A: min=0x50;break;
            case 0x5A: min=0x00;
         } //...min
         printf(lcd_putc,"\nHora: %2X:%2X:%2X",hour,min,sec); //muestra por lcd min
      }
   }while(input(PIN_A5));
   while(!input(PIN_A5)){} //elimina rebotes
}

///FUNCION CONFIGURA DIAS
void dia(void){
   printf(lcd_putc,"\fConf.Dias:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por lcd
   do{
      if(!input(PIN_A3)){ //¿se ha pulsado up?
         while(!input(PIN_A3)){} //elimina rebotes
         day++; //SI -> incremento day
         switch(day){ //limites...
            case 0x0A: day=0x10;break;
            case 0x1A: day=0x20;break;
            case 0x2A: day=0x30;break;
            case 0x32: day=0x01;
         } //...day
         printf(lcd_putc,"\fConf.Dias:\nFecha: %2X/%2X/%2X",day,mth,year);
         //muestra por lcd day
      }
   }while(input(PIN_A5));
   while(!input(PIN_A5)){} //elimina rebotes
}

///FUNCION CONFIGURA MES
void mes(void){
   printf(lcd_putc,"\fConf.Mes:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por lcd
   do{
      if(!input(PIN_A3)){ //¿se ha pulsado up?
         while(!input(PIN_A3)){} //elimina rebotes
         mth++; //SI -> incremento mth
         switch(mth){ //limites...
            case 0x0A: mth=0x10;break;
            case 0x13: mth=0x01;
         } //...mth
         printf(lcd_putc,"\fConf.Mes:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por lcd
      }
   }while(input(PIN_A5));
   while(!input(PIN_A5)){} //elimina rebotes
}

///FUNCION CONFIGURA AÑOS
void anio(void){
   printf(lcd_putc,"\fConf.Anio:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por lcd
   do{
      if(!input(PIN_A3)){ //¿se ha pulsado up?
         while(!input(PIN_A3)){} //elimina rebotes
         year++; //SI -> incremento mth
         switch(year){ //limites...
            case 0x0A: year=0x10;break;
            case 0x1A: year=0x20;break;
            case 0x2A: year=0x30;break;
            case 0x3A: year=0x40;break;
            case 0x4A: year=0x50;break;
            case 0x5A: year=0x60;break;
            case 0x6A: year=0x70;break;
            case 0x7A: year=0x80;break;
            case 0x8A: year=0x90;break;
            case 0x9A: year=0x00;
         } //...year
         printf(lcd_putc,"\fConf.Anio:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por lcd
      }
   }while(input(PIN_A5));
   while(!input(PIN_A5)){} //elimina rebotes
}

///FUNCION BEEP
void beep(void){
   output_high(PIN_B3); //activa zumbador
   delay_ms(50);
   output_low(PIN_B3); //desactiva zumbador
}

//****************************************
//acá las desarrollas utilizando talvez las funcioens de la libreria
void rtc_get_date(dd,mm,yy){

}

void rtc_get_time(hh,mm,ss){

}
void rtc_set_datetime(dd,mm,yy,dow,hh,mi){

}

void rtc_init(void){

}

pasa que los errores:
*** Error 12 "rtc2.c" Line 81(13,14): Undefined identifier  -- rtc_get_date
*** Error 12 "rtc2.c" Line 82(13,14): Undefined identifier  -- rtc_get_time
y otros pasan porque estas funciones

rtc_get_date
rtc_get_time

no están definidas, y debes definirlas como las que están definidas arriba de ellas
y tampoco están desarrolladas, ya que o bien utilizas el nombre que tiene en la librería o defines tus funciones y las desarrollas utilizando las funciones que tienes en la librería; las desarrolas como las otras funciones están desarrolladas después del MAIN

creo que por ahí va la cosa, espero me haya dejado entender, sino pues avisas, porque creo que después todo está bien

un saludo.

PD: si vas a colocar códigos largos te sugiero que utilices las etiquetas de código, hace que tu post se vea mejor y apetecible para leer :mrgreen:
.

Desconectado ncoliv

  • PIC16
  • ***
  • Mensajes: 130
Re: ayuda 1307
« Respuesta #50 en: 14 de Enero de 2009, 03:06:15 »
Cryn, el error que estaba cometiendo era el de invocar la  funcion ( y otras) rtc_get_date definidas en el driver del ds1302.c. La que esta definida en el driver ds1307.c es       void_ds1307_get_date(day,mth,year,dow);

ahora cuando compilo esta linea de programa:

void ds1307_get_date(day,mth,year,dow); //coge dia,mes,año

marca este error

* Error 51 "rtc2.c" Line 82(1,5): A numeric expression must appear here

como veras ya no indica que no esta definida debido a que en la cabecera esta definida por el include< DS1307.c>
Pregunta ¿se tendria que armar la funcion void ds1307_get_date en este programa?, ¿no basta invocarla desde su  driver?
 

Desconectado ncoliv

  • PIC16
  • ***
  • Mensajes: 130
Re: ayuda 1307
« Respuesta #51 en: 14 de Enero de 2009, 10:03:22 »
armo la funcion pór ejemplo "void ds1307_get_date(day,mth,year,dow)" utilizando la libreria del driver ds1307 al final del programa como vos sugieres y me aparecen mas errores.
Para seguir depurandolo .....que significa este error

*** Error 51 "rtc2.c" Line 90(1,5): A numeric expression must appear here

hace referencia a esta línea

void ds1307_get_date(day,mth,year,dow)

Gracias por el aporte!!
 

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: ayuda 1307
« Respuesta #52 en: 14 de Enero de 2009, 18:41:43 »
si vas a usar las funciones directamente de la libreria (driver) ya no hace falta que las definas nuevamente en tu código, porque ya están definidas en el driver, simplemente debes llamarlas con el nombre correcto y los datos que necesite como parámetros, para llamar a las funciones solo es necesario colocar el nombre de la función, bueno te lo corregí en el programa que me pasaste, se me estaba olvidando que usabas la libreria de redpic, entonces el código con las modificaciones queda así:


Código: [Seleccionar]
//Este programa una version del rtc1302 adaptada al 1307
////////////////////////////////////////////////////////////////////////////////////
// Programa: Reloj-Calendario DS1307
// Version: 0.0
//
// Dispositivo: PIC 16F877A Compilador: CCS
// Entorno IDE: MPLAB IDE v7.21 Simulador: Proteus 6.7sp3
//
// Notas: Se muestra por pantalla de lcd la fecha y hora obtenida mediante la
// lectura del DS1307. Pudiendose modificar mediante los botones Conf/Ok y up.
// Se utiliza variables globales:
// ·day-> dia ds1302/07
// ·mth -> mes ds1302/07
// ·year -> año ds1302/07
// ·hour -> hora ds1302/07
// ·min -> minutos ds1302/07
// ·sec-> segundos ds1302/07
// ·menu -> variable que muestra opcion del menu configurar
// ·flag -> variable que cuenta hasta 130ms aprox.
// ·var -> ajuste fino para que desborde cada 130ms aprox.
// Se carga el TMR0 con 0 por lo tanto se desborda en 65ms aprox, queremos
// visualizar y restaurar valores cogidos del ds1302 cada 130ms aprox por lo tanto
// utilizamos una variable llamada flag que sera la encargada de dicha tarea.
// Al inicio del programa debe ser configurado el reloj, siendo el boton 'up' el
// encargado de ir moviendose mediante las opciones del menu:hora,minutos,....
// y el boton 'Conf/Ok' el encargado de configurar el reloj(cuando estemos en modo ver
// hora y fecha) o el encargado de salir de la configuracion de las opciones(cuando
// estemos en formato de configurar fecha y hora).
// Tener en cuenta que hay que poner la directiva NOLVP para que el pin B4 sea de
// salida.
// Conexiones: B0 -> SDA DS1307
// B1 -> SCL DS1307
// B2-> I/O DS1307
// B3 -> Boton 'up'
// B5 -> Boton 'Conf/Ok'
// D0 -> E
// D1 -> RS
// D2 -> RW
// D4 -> D4
// D5 -> D5
// D6 -> D6
// D7 -> D7
// D3 -> Zumbador(beep)
//////////////////////////////////////////////////////////////////////////////////

#include <16f877a.h> //pic a utilizar
#use delay(CLOCK=4000000) //Fosc=4Mhz
#fuses HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT //comandos para el programador
#use standard_io(b)
#use standard_io(d)
#define use_portd_lcd TRUE //utilizar el port d para lcd
#define RTC_SCL PIN_B1 //definimos pin's...
#define RTC_IO PIN_B2
#define RTC_SDA PIN_B0 //...de conexion de la rtc ds1302
#include <ds1307.c> //libreria de rtc ds1307
#include <lcd.c> //libreria de lcd

///VARIABLES GLOBALES
byte day,mth,year,dow,hour,min,sec; //variabes para ds1307
byte menu=0,flag =0,var=2; //variables para menu configurar

///DEFINICION DE FUNCIONES
void configurar(void);
void horas(void);
void minutos(void);
void dia(void);
void mes(void);
void anio(void);
void beep(void);

///LLAMADA FUNCION INTERRUPCION
#INT_TIMER0
void interrupcion(){
   if(flag>var){ //¿ya es 130ms aprox?
      var--; //SI -> decremento var...
   if(var==0)
      var=2; //...ajuste fino de 130ms aprox
   flag=0; //reset flag para contar 130ms aprox
   ds1307_get_date(day,mth,year,dow);  //coge dia,mes,año
   ds1307_get_time(hour,min,sec);      //coge hora,minuto,segundo
   printf(lcd_putc,"\fFecha: %2X/%2X/%2X\nHora: %2X:%2X:%2X",day,mth,year,hour,min,sec);
   //lcd
   }
   set_timer0(0); //reset TMR0
   flag++; //incremento variable flag
}

///PROGRAMA
void main(void){
   enable_interrupts(INT_TIMER0); //interrupcion TIMER0 activada
   setup_counters(RTCC_INTERNAL,RTCC_DIV_256); //configuracion interrupcion TMR0
   set_timer0(0); //carga TMR0

   lcd_init(); //inicializa lcd
   ds1307_init(DS1307_OUT_1_HZ); //inicializa RTC DS1307

   lcd_putc("Reloj Calendario\n VsZeNeR'05" ); //presentacion...
   delay_ms(800); //...inicial

   configurar(); //ve a menu configurar
   enable_interrupts(GLOBAL); //activadas interrupciones

   for( ; ; ){ //bucle...
      if(input(PIN_A5)==0){ //Si se pulsa Conf....
         while(!input(PIN_A5)){} //elimina rebotes
         beep();
         configurar();
      } //ve a menu configurar
   }; //...infinito
}

///FUNCION CONFIGURAR
void configurar(void){
   disable_interrupts(GLOBAL); //desactivadas interrupciones
   do{
      switch(menu){
         case 0: lcd_putc("\fConfigurar\nhoras?" ); //horas
            if(!input(PIN_A5)){
               while(!input(PIN_A5)){}
               beep();
               horas();
               menu=1;
               //apunta siguiente opcion
            }
            break;
         case 1: lcd_putc("\fConfigurar\nminutos?" ); //minutos
            if(!input(PIN_A5)){
               while(!input(PIN_A5)){}
                  beep();
                  minutos();
                  menu=2;
                  //apunta siguiente opcion
               }
            break;
         case 2: lcd_putc("\fConfigurar\ndia?" ); //dias
            if(!input(PIN_A5)){
               while(!input(PIN_A5)){}
               beep();
               dia();
               menu=3;
               //apunta siguiente opcion
            }
            break;
         case 3: lcd_putc("\fConfigurar\nmes?" ); //mes
            if(!input(PIN_A5)){
               while(!input(PIN_A5)){}
               beep();
               mes();
               menu=4;
               //apunta siguiente opcion
            }
            break;
         case 4: lcd_putc("\fConfigurar\nanio?" ); //años
            if(!input(PIN_A5)){
               while(!input(PIN_A5)){}
               beep();
               anio();
               menu=5;
               //apunta siguiente opcion
            }
               break;
         case 5: lcd_putc("\fSalir\nconfigurar?" ); //salir configuracion
            if(!input(PIN_A5)){
               menu=6;
               beep();
            }
      }
      if(!input(PIN_A3)){ //controla el boton up...
         while(!input(PIN_A3)){}
         menu++;
         if(menu>5)
            menu=0;
      } //...para mostrar menu por lcd
      delay_ms(130); //retardo para ver lcd
   }while(menu<6);
   menu=0;
   //actualiza indices menu
   ds1307_set_date_time(day,mth,year,dow,hour,min,sec);   //nueva hora,minuto,...
   enable_interrupts(GLOBAL); //activadas interrupciones
   set_timer0(0);
   //carga TMR0
}

///FUNCION CONFIGURA HORAS
void horas(void){
   printf(lcd_putc,"\fConf.Horas:\nHora: %2X:%2X:%2X",hour,min,sec); //muestra por lcd
   do{
      if(!input(PIN_A3)){ //¿se ha pulsado up?
         while(!input(PIN_A3)){} //elimina rebotes
         hour++; //SI -> incremento hour
         switch(hour){ //limites...
            case 0x0A: hour=0x10;break;
            case 0x1A: hour=0x20;break;
            case 0x24: hour=0x00;
         }
         //...hour
         printf(lcd_putc,"\nHora: %2X:%2X:%2X",hour,min,sec); //muestra por lcd hour
      }
   }while(input(PIN_A5));
   while(!input(PIN_A5)){} //elimina rebotes
}

///FUNCION CONFIGURA MINUTOS
void minutos(void){
   printf(lcd_putc,"\fConf.Minutos:\nHora: %2X:%2X:%2X",hour,min,sec); //muestra por lcd
   do{
      if(!input(PIN_A3)){ //¿se ha pulsado up?
         while(!input(PIN_A3)){} //elimina rebotes
         min++; //SI -> incremento min
         switch(min){ //limites...
            case 0x0A: min=0x10;break;
            case 0x1A: min=0x20;break;
            case 0x2A: min=0x30;break;
            case 0x3A: min=0x40;break;
            case 0x4A: min=0x50;break;
            case 0x5A: min=0x00;
         } //...min
         printf(lcd_putc,"\nHora: %2X:%2X:%2X",hour,min,sec); //muestra por lcd min
      }
   }while(input(PIN_A5));
   while(!input(PIN_A5)){} //elimina rebotes
}

///FUNCION CONFIGURA DIAS
void dia(void){
   printf(lcd_putc,"\fConf.Dias:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por lcd
   do{
      if(!input(PIN_A3)){ //¿se ha pulsado up?
         while(!input(PIN_A3)){} //elimina rebotes
         day++; //SI -> incremento day
         switch(day){ //limites...
            case 0x0A: day=0x10;break;
            case 0x1A: day=0x20;break;
            case 0x2A: day=0x30;break;
            case 0x32: day=0x01;
         } //...day
         printf(lcd_putc,"\fConf.Dias:\nFecha: %2X/%2X/%2X",day,mth,year);
         //muestra por lcd day
      }
   }while(input(PIN_A5));
   while(!input(PIN_A5)){} //elimina rebotes
}

///FUNCION CONFIGURA MES
void mes(void){
   printf(lcd_putc,"\fConf.Mes:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por lcd
   do{
      if(!input(PIN_A3)){ //¿se ha pulsado up?
         while(!input(PIN_A3)){} //elimina rebotes
         mth++; //SI -> incremento mth
         switch(mth){ //limites...
            case 0x0A: mth=0x10;break;
            case 0x13: mth=0x01;
         } //...mth
         printf(lcd_putc,"\fConf.Mes:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por lcd
      }
   }while(input(PIN_A5));
   while(!input(PIN_A5)){} //elimina rebotes
}

///FUNCION CONFIGURA AÑOS
void anio(void){
   printf(lcd_putc,"\fConf.Anio:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por lcd
   do{
      if(!input(PIN_A3)){ //¿se ha pulsado up?
         while(!input(PIN_A3)){} //elimina rebotes
         year++; //SI -> incremento mth
         switch(year){ //limites...
            case 0x0A: year=0x10;break;
            case 0x1A: year=0x20;break;
            case 0x2A: year=0x30;break;
            case 0x3A: year=0x40;break;
            case 0x4A: year=0x50;break;
            case 0x5A: year=0x60;break;
            case 0x6A: year=0x70;break;
            case 0x7A: year=0x80;break;
            case 0x8A: year=0x90;break;
            case 0x9A: year=0x00;
         } //...year
         printf(lcd_putc,"\fConf.Anio:\nFecha: %2X/%2X/%2X",day,mth,year); //muestra por lcd
      }
   }while(input(PIN_A5));
   while(!input(PIN_A5)){} //elimina rebotes
}

///FUNCION BEEP
void beep(void){
   output_high(PIN_B3); //activa zumbador
   delay_ms(50);
   output_low(PIN_B3); //desactiva zumbador
}
.

Desconectado ncoliv

  • PIC16
  • ***
  • Mensajes: 130
Re: ayuda 1307
« Respuesta #53 en: 15 de Enero de 2009, 00:40:18 »
Ok CRYN estudiaré el programa
Gracias por la respuesta.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: ayuda 1307
« Respuesta #54 en: 15 de Enero de 2009, 14:46:18 »
es el mismo amigo, solo le cambia las instrucciones

rtc_get_date
rtc_get_time

por las que dice en la librería:

ds1307_get_date
ds1307_get_time
y las otras tb, init y set_date_time

nada más pruebalo haber si funciona bien

.

Desconectado ncoliv

  • PIC16
  • ***
  • Mensajes: 130
Re: ayuda 1307
« Respuesta #55 en: 15 de Enero de 2009, 17:59:55 »
Es lo que había pensado, gracias. Ya hice todos los cambios. Manejo los pulsadores por el puerto B tbien los modifique en el programa.
lo compilo y me aparece esto:
Executing: "C:\Archivos de programa\PICC\Ccsc.exe" +FM "cryn.c" +DF +LN +T +A +M +Z +Y=9 +EA
>>> Warning 203 "C:\ARCHIV~1\PICC\drivers\ds1307.c" Line 233(1,1): Condition always TRUE
>>> Warning 216 "cryn.c" Line 286(1,2): Interrupts disabled during call to prevent re-entrancy:  (@delay_ms1)
>>> Warning 216 "cryn.c" Line 286(1,2): Interrupts disabled during call to prevent re-entrancy:  (lcd_putc)
>>> Warning 216 "cryn.c" Line 286(1,2): Interrupts disabled during call to prevent re-entrancy:  (@PRINTF_X_136)
>>> Warning 216 "cryn.c" Line 286(1,2): Interrupts disabled during call to prevent re-entrancy:  (@I2C_WRITE_1)
>>> Warning 216 "cryn.c" Line 286(1,2): Interrupts disabled during call to prevent re-entrancy:  (lcd_send_nibble)
>>> Warning 216 "cryn.c" Line 286(1,2): Interrupts disabled during call to prevent re-entrancy:  (lcd_send_byte)
>>> Warning 216 "cryn.c" Line 286(1,2): Interrupts disabled during call to prevent re-entrancy:  (@I2C_READ_1)
>>> Warning 216 "cryn.c" Line 286(1,2): Interrupts disabled during call to prevent re-entrancy:  (ds1307_bcd2bin)
      Memory usage:   ROM=44%      RAM=29% - 36%
      0 Errors,  9 Warnings.
Loaded C:\todos\cryn\cryn.cof.
BUILD SUCCEEDED: Thu Jan 15 16:53:23 2009

Creo que vamos por buen camino. Otras consultas
los patitas  equivalentes:

en el 1302 SCLK  en el 1307 SCL
"      "        RST   ------------->SDA
Hago las conecciones correspondientes y se observa en el LCD en la parte superior las matrices de cada caracter. No obtengo  ninguna leyenda del programa
que pueede estar pasando.
Gracias



Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: ayuda 1307
« Respuesta #56 en: 15 de Enero de 2009, 20:00:19 »
Hola.

El DS1302 se comunica por un protocolo diferente el 3-wire, mientras que el DS1307 es por I2C, hay grandes diferencias entre los dos protocolos, el I2C hace uso de una direccion para comunicarse con el dispositivo, mientras que el 3-wire no, el I2C no necesita de un pin habilitador el 3-wire si, revisa los datasheets de los dos integrados para ver mas claramente las diferencias.

Los warning son debido al uso de funciones que toman mucho tiempo dentro de una interrupcion, para evitar volver a entrar en la misma interrupcion el compilador las deshabilita, seria mejor colocar flags unicamente dentro de las interrupciones y procesarlas en el programa principal.

Saludos
El papel lo aguanta todo

Desconectado ncoliv

  • PIC16
  • ***
  • Mensajes: 130
Re: ayuda 1307
« Respuesta #57 en: 16 de Enero de 2009, 00:33:29 »
Gracias MLO.Creo que no será tan facil adaptar este programita para un ds1307.
De todas formas ya estoy en la tarea.
Supongo que tendre que invocar un driver I2C.

Desconectado ncoliv

  • PIC16
  • ***
  • Mensajes: 130
Re: ayuda 1307
« Respuesta #58 en: 16 de Enero de 2009, 10:07:14 »
Este programita actualmente esta funcionando, solo que no se modifica la hora.  Tengo una duda.......en ninguna parte del programa hago referencia a las funciones del driver "ds1307.c" tales como:
ds1307_get_date
ds1307_get_time
ds1307_init(DS1307_OUT_1_HZ) y las demas.
ni siquiera las incluyo en la cabecera del program
se ve claramenet que emplea la comunicación I2C. por que sucede esto. Muchas gracias.
como se podria modificarlo para que tome las funciones del driver( seria otra forma de leer rtc.)

les dejo el programa:

 
/Programa que usa protocolo I2C para
//escribir y leer tiempo del DS1307
//saca tiempo en LCD
//funciona, es lo importante

//migsantiago

// Conexiones de la LCD:
//     D0  enable
//     D1  rs
//     D2  rw
//     D4  D4
//     D5  D5
//     D6  D6
//     D7  D7
//
//   LCD pins D0-D3 are not used and PIC D3 is not used.

#include <16f877a.h>
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect
#use delay(clock=4000000)

#include "lcd.c"
#use standard_io (D)


#use fast_io (b)
//#include<ds1307.c>
#use i2c(MASTER, SDA=PIN_b1, SCL=PIN_b0,slow)

//Registros DS1307
#define ds_seconds 0x00
#define ds_minutes 0x01
#define ds_hours 0x02
#define ds_day 0x03
#define ds_date 0x04
#define ds_month 0x05
#define ds_year 0x06
#define ds_control 0x07

//DS1307
//Vbat a tierra

void main(void)
{

int16 retardo; //Cada cuando actualiza lectura en LCD

//Dato en registro ds, a mandar o leer
int seconds,minutes,hours,day,date,month,year,control;

retardo=20; //ms a tardar entre lectura y lectura

//Justo cuando prende circuito, la fecha que establece es la siguiente
seconds= 0x00;
minutes= 0x46;
hours  = 0x15; //modo 24 hrs
day    = 0x05; //1 es domingo
date   = 0x03;
month  = 0x11;
year   = 0x08;
control= 0x00; //OUT=0 SQWE=0 RS0-1=0 no hay onda cuadrada


//Establece fecha y hora
i2c_start(); //Inicia I2C
i2c_write(0xd0); //Direcciona DS1307 write
i2c_write(ds_seconds); //Indica que empiece en registro ds_seconds
//Aquí establece fecha y hora respecto a la puesta arriba
i2c_write(seconds);
i2c_write(minutes);
i2c_write(hours);
i2c_write(day);
i2c_write(date);
i2c_write(month);
i2c_write(year);
i2c_write(control);
i2c_stop(); //Ya puso la hora y fecha
//El RTC ya está marcando el tiempo y fecha

//Rutina LCD
lcd_init(); //Inicia LCD
//lcd_putc("f"); //Limpia LCD
//lcd_putc("Real Time Clock"); //rtc
//lcd_putc("     DS1307");
//delay_ms(3000);
delay_ms(100);
while(1)
   {

   delay_ms(retardo); //Usuario lee


   //Obtiene datos de DS1307
   i2c_start(); //Inicia I2C
   i2c_write(0xd0); //Direcciona DS1307 write
   i2c_write(ds_seconds); //Indica que ponga registro en ds_seconds
   i2c_stop();

   i2c_start();
   i2c_write(0xd1); //Lee DS1307
   seconds = i2c_read();
   minutes = i2c_read();
   hours = i2c_read();
   day = i2c_read();
   date = i2c_read();
   month = i2c_read();
   year = i2c_read(0); //no ack
   i2c_stop();

   //Representa datos en la LCD
lcd_gotoxy(1,1);
   printf(lcd_putc,"%2x-%2x-20%2x",date,month,year); //dd-mm-year
lcd_gotoxy(1,2);
   printf(lcd_putc,"%2x:%2x:%2x",hours,minutes,seconds); //23:59:59
   }
}

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: ayuda 1307
« Respuesta #59 en: 18 de Enero de 2009, 02:13:27 »
no entiendo a que quieres llegar ncoliv, ya me confundiste totalmente :z)

creo que tienes las ideas muy revueltas déjame aclararte una cosa muy importante:

** Una librería es una serie de funciones, definiciones, etc., elaboradas por una persona, un equipo de personas o una institución u otros; dicha librería está destinada a manipular determinados componentes (mediante las funciones que ésta tiene) como memorias I2C, LCD's, RTC's, GLCD's, Sensores, etc., y hacer más fácil la vida de nosotros los programadores porque las reutilizaremos, eso quiere decir que ya no hace falta que nos pasemos un día, o quizá muchos más desarrollando funciones para un componente x. Esto podemos asemejarlo a lo que los grandes lenguajes de programación utilizan que es la REUSABILIDAD, solo necesitamos saber entonces como funciona está librería que cosas necesita variables, datos que devuelve, etc.

La librería DS1307 que fue muy bien explicada y con varios aportes del muy conocido Redpic acá en el foro funciona de las mil maravillas.

En tu proyecto empezaste con esta librería si mal no recuerdo y creo que te iba bien y decidiste incrementarle pulsadores para realizar cambios en la fecha y hora, en sí para "configuración personalizada del reloj", muy buena idea y que hace a tu proyecto mejor.

Para ello, solo debes agregar las rutinas necesarias para detectar los pulsos y el respectivo proceso que se realice cuando uno u otro evento suceda. Si la memoria no me falla encontraste un código que hacía lo que tu buscabas pero lamentablemente utilizaba un DS1302, yo también te dí una pauta de más o menos como podrías manipular los pulsadores. Creo que no te fue tan mal con eso y lograste entender la lógica de esa programación.

Así que solo te resta fusionar ambas ideas:

- utilizar la librería ds1307.c
- manipular con los pulsadores la configuración

En resumen lo que yo haría es:

#include <16f877a.h>
#include...    // otros includes y configuraciones del uC
....
#define RTC_SDA  PIN_B1   // todo esto con la librería que está en el link
#define RTC_SCL  PIN_B0
#define USE_INTERRUPTS 1
#include <ds1307.c>

...

... // en alguna de tus funciones, cuando tengas todos los datos de hora y fecha recopilados
... //los guardas con la función de la librería que se llama:
ds1307_set_date_time(day,mth,year,dow,hour,min,sec); // los nombres que están en los paréntesis son
    // los correspondientes a las variables que fuiste incrementando con los pulsadores

... // en otras funciones leeré la fecha y hora, cuando sea necesario, para mostrarlo en tu display:
ds1307_get_date(day,mth,year,dow);
ds1307_get_time(hr,min,sec);


void main(){
   ... // configuraciones de puertos y otros
   ds1307_init(val); // val será la configuración que le darás al RTC, esta explicado en la cabecera de la librería.
...
   while(true){
   ...
   }
}

Es la idea general, espero me hayas entendido, sino ya sabes pregunta por acá; lo que hiciste tiene quizá una de las partes que debes fusionar, por eso no funciona.

Un saludo amigo, espero tengas pronto el resultado que quieres de este tu proyecto
.