TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ncoliv en 30 de Noviembre de 2008, 01:08:57

Título: ayuda 1307
Publicado por: ncoliv en 30 de Noviembre de 2008, 01:08:57
HOLA; DE ANTE MANO MUCHAS GRACIAS POR LAS RESPUESTAS SE QUE TENDRÉ ALGUNAS.

Estoy tratando de vincular el rtc 1307 con el pic 16F877A y leer el tiempo en lcd el programita es el siguiente

////////////////////////////////////////////////////////////////////////////////
////////////ESTE PROGRAMA UTILZA EL CIRCUITO DS1307 PARA MOSTRAR LA ////////////
//////////HORA EN TIEMPO REAL A TRAVEZ DE UN  LCD DE 2 POR 16 CARACTERES/////


#include <16F877A.h>                ///   libreria para el manejo del pic16f877a
#use delay(clock=4000000)          ///   declara  la frecuencia del cristal
#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT
#include <ds1307.c>
#include <lcd.c>


#use fast_io(A)
#use fast_io(B)
#use fast_io(C)                     ///   con esta instruccion evitamos que
#use fast_io(D)                     ///   se este configurando cada vez que usamos
#use fast_io(E)                     ///   alguna instruccion de entrada o salida


#byte portc = 7                     /// se definen direcciones de memoria
#byte portd = 8

int sec;
int min;
int hrs;
int  day;
int  month;
int  yr;
int  dow;


////////////////////////////////////////////////////////////////////////////////
//////////////////////Comienzo de la funcion principal//////////////////////////
////////////////////////////////////////////////////////////////////////////////
void main()
{

   ds1307_init(0);                          ///se inicializa el ds1307
   
   set_tris_a(0xff);
   set_tris_d(0x00);
   set_tris_b(0x00);
   set_tris_c(0x04);
   set_tris_e(0x01);
   port_b_pullups(true);
 
 
  lcd_init();                               /// inicializamos lcd
 
 
 
  // Set date for -> 15 June 2005 Tuesday
  // Set time for -> 15:20:55 (9:49:00 am)
 
  ds1307_set_date_time(8,11,7,2,9,49,00);   /// se escribe en el displositivo
                                            /// el tiempo deseado
  while(1)
  {
 
    delay_ms(100);
   
  ds1307_get_date(day,month,yr,dow);        /// se obtiene la fecha 
  ds1307_get_time(hrs,min,sec);             /// se obtiene la hora
  lcd_gotoxy(1,2);
  printf(lcd_putc,"%02d:%02d:%02d          ",hrs,min,sec);   ///se despliegan los datos
 
    }
}

Lo compiLo y aparencen lo siguiente

Executing: "C:\Archivos de programa\PICC\Ccsc.exe" +FM "rtc0.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 203 "rtc0.c" Line 58(1,1): Condition always TRUE
      Memory usage:   ROM=16%      RAM=25% - 30%
      0 Errors,  2 Warnings.
Loaded C:\rtc0\rtc0.cof.
BUILD SUCCEEDED: Sun Nov 30 00:00:33 2008

Las conexiones del RTC
PIN 1 y 2 al cristal
pin 4 y 8         0  y 5 volts respectivamente
pin 5 sda del pic
pin 6scl del pic

lo alimente y se enojo ( se calento) puede que se haya dañado y tbien el pic
que estoy haciendo mal
está bien el programita?

MUCHAS GRACIAS !!!!!!!!!

Título: Re: ayuda 1307
Publicado por: BrunoF en 30 de Noviembre de 2008, 01:33:10
Hola! No vi mucho, pero el delay configurado a 40Mhz me asusta...Decíme que no estás usando un cristal de 40Mhz en un 16F877A...Los 16F877A no pueden ser puestos a trabajar a frecuencias mayores a los 20Mhz. Usandolos a 40Mhz es seguro que lo quemaste o estás por lograrlo...

Saludos.
Título: Re: ayuda 1307
Publicado por: ncoliv en 30 de Noviembre de 2008, 02:21:23
Hola brunof, estoy utilizando un XT de 4Mhz, y aclaro que sda y scl tbien tiene r de 10K a la fuente ademas de conectarse con el pic.
Gracias por la respuesta
Título: Re: ayuda 1307
Publicado por: Cryn en 30 de Noviembre de 2008, 12:17:58
colocaste condensadores en la alimentación??, uno de 100nF viene bien, si queres también le colocas un electrolítico de 1uF o de 10uF, que caliente me parece bastante raro, rarísimo, si la circuitería esta bien, no debería pasar eso, donde lo armaste? en un proto? prueba armarlo en otro proto
Título: Re: ayuda 1307
Publicado por: ncoliv en 30 de Noviembre de 2008, 12:22:30
La alimentación esta bien, como puedo saber si estan qumados??
Título: Re: ayuda 1307
Publicado por: Cryn en 30 de Noviembre de 2008, 12:47:43
prueba con otro ds1307 creo que es la única forma de saber si esta dañado, pues su comunicación es I2C como bein sabes, me parece un poco difícil saber si esta dañado
Título: Re: ayuda 1307
Publicado por: ncoliv en 30 de Noviembre de 2008, 13:43:56
Gracias Cryn, creo que era una falsa conexión, ahora en el LCD veo en la 1° línea " fReal Time Clock y en la de abajo "ff:ff:fffff-ff-2"  y estas líneas no se encuentran  en el programa. ¿Seran del RTC?
Gracias
Título: Re: ayuda 1307
Publicado por: Cryn en 30 de Noviembre de 2008, 14:00:56
 :z) eeh?

mmm después de la inicialización del lcd, dale un retardo de unos 5 o 10 ms

y en estas líneas:
lcd_gotoxy(1,2);
printf(lcd_putc,"%02d:%02d:%02d          ",hrs,min,sec);

mejor coloca esto:
printf(lcd_putc,"\f%02d:%02d:%02d",hrs,min,sec);

y creo que irá mejor con eso
Título: Re: ayuda 1307
Publicado por: MLO__ en 30 de Noviembre de 2008, 14:13:57
Hola.

Otra cosa: En los #fuses, si estas usando un cristal de 4MHz, quita HS y pon mejor XT.

Si te aparece algo que no esta en el programa es porque estas programando un programa que no es, de pronto programaste algun .hex con el mismo nombre, de todas maneras, porque no posteas la libreria DS1307?? seri bueno verla.

Saludos
Título: Re: ayuda 1307
Publicado por: BrunoF en 30 de Noviembre de 2008, 15:09:51
Hola! No vi mucho, pero el delay configurado a 40Mhz me asusta...Decíme que no estás usando un cristal de 40Mhz en un 16F877A...Los 16F877A no pueden ser puestos a trabajar a frecuencias mayores a los 20Mhz. Usandolos a 40Mhz es seguro que lo quemaste o estás por lograrlo...

Saludos.

Perdón, vi un cero de mas... :oops: :oops: :oops:

Si se calienta el uC debe ser probablemente a una mala conexión en su alimentación, o bien estás configurando mal algun pin de E/S...

Saludos.
Título: Re: ayuda 1307
Publicado por: ncoliv en 30 de Noviembre de 2008, 18:54:41
Muchachos con las modificaciones realizadas solo obtengo en la primera línea del lcd todas las casillas de los caracteres, ahora no hay ninguna leyenda, la verdad no se que puede estar pasando.Gracias por las respuestas
Título: Re: ayuda 1307
Publicado por: ncoliv en 30 de Noviembre de 2008, 18:58:33
les posteo el driver del ds1307


///////////////////////////////////////////////////////////////////////////////////////
///                               DS1307.C                                           ///
///                     Driver for Real Time Clock                                   ///
///                     modified by Redpic 08/2006                                   ///
///                  http://picmania.garcia-cuervo.com                               ///
///                                                                                  ///
/// void ds1307_init(val)                                                            ///
///                  - Enable oscillator without clearing the seconds register       ///
///                    used when PIC loses power and DS1307 run from 3V BAT          ///
///                  - Config Control Register with next parameters:                 ///
///                     DS1307_ALL_DISABLED          All disabled                    ///
///                     DS1307_OUT_ON_DISABLED_HIHG  Out to Hight on Disable Out     ///
///                     DS1307_OUT_ENABLED           Out Enabled                     ///
///                     DS1307_OUT_1_HZ              Freq. Out to 1 Hz               ///
///                     DS1307_OUT_4_KHZ             Freq. Out to 4.096 Khz          ///
///                     DS1307_OUT_8_KHZ             Freq. Out to 8.192 Khz          ///
///                     DS1307_OUT_32_KHZ            Freq. Out to 32.768 Khz         ///
///                                                                                  ///
///                     Example init:                                                ///
///                     ds1307_init(DS1307_ALL_DISABLED);                            ///
///                     ds1307_init(DS1307_OUT_ENABLED | DS1307_OUT_1_HZ);           ///
///                                                                                  ///
/// void ds1307_set_date_time(day,mth,year,dow,hour,min,sec) - Set the date/time     ///
///                                                                                  ///
/// void ds1307_get_date(day,mth,year,dow)                   - Get the date          ///
///                                                                                  ///
/// void ds1307_get_time(hr,min,sec)                         - Get the time          ///
///                                                                                  ///
/// char ds1307_read_nvram_byte(char addr)                   - Read byte in address  ///
///                                                                                  ///
/// void ds1307_write_nvram_byte(char addr, char value)      - Write byte in address ///
///                                                                                  ///
/// void ds1307_get_day_of_week(char* ptr)                   - Get string Day Of Week///
///                                                                                  ///
/// If defined USE_INTERRUPTS all functions disable Global Interrupts on starts and  ///
///                           enable Global on ends else usar can do it hiself       ///
///                                                                                  ///
///////////////////////////////////////////////////////////////////////////////////////

#ifndef RTC_SDA
#define RTC_SDA  PIN_B0
#define RTC_SCL  PIN_B1
#endif

#use i2c(master, sda=RTC_SDA, scl=RTC_SCL)

#define DS1307_ALL_DISABLED         0b00000000 // All disabled
#define DS1307_OUT_ON_DISABLED_HIHG 0b10000000 // Out to Hight on Disable Out
#define DS1307_OUT_ENABLED          0b00010000 // Out Enabled
#define DS1307_OUT_1_HZ             0b00000000 // Freq. Out to 1 Hz
#define DS1307_OUT_4_KHZ            0b00000001 // Freq. Out to 4.096 Khz
#define DS1307_OUT_8_KHZ            0b00000010 // Freq. Out to 8.192 Khz
#define DS1307_OUT_32_KHZ           0b00000011 // Freq. Out to 32.768 Khz

#define Start_user_address_nvram    0x08
#define End_user_address_nvram      0x3f

char days_of_week[7][11]={"Lunes\0","Martes\0","Miércoles\0","Jueves\0","Viernes\0","Sábado\0","Domingo\0"};

byte ds1307_bin2bcd(byte binary_value);
byte ds1307_bcd2bin(byte bcd_value);

void ds1307_init(int val){

   byte seconds = 0;

#ifndef USE_INTERRUPTS
   disable_interrupts(global);
#endif

   i2c_start();
   i2c_write(0xD0);
   i2c_write(0x00);
   i2c_start();
   i2c_write(0xD1);
   seconds = ds1307_bcd2bin(i2c_read(0));
   i2c_stop();
   seconds &= 0x7F;

   delay_us(3);

   i2c_start();
   i2c_write(0xD0);
   i2c_write(0x00);
   i2c_write(ds1307_bin2bcd(seconds));
   i2c_start();
   i2c_write(0xD0);
   i2c_write(0x07);
   i2c_write(val);
   i2c_stop();

#ifndef USE_INTERRUPTS
   enable_interrupts(global);
#endif

}

void ds1307_set_date_time(byte day, byte mth, byte year, byte dow, byte hr, byte min, byte sec){

#ifndef USE_INTERRUPTS
   disable_interrupts(global);
#endif

  sec &= 0x7F;
  hr &= 0x3F;

  i2c_start();
  i2c_write(0xD0);
  i2c_write(0x00);
  i2c_write(ds1307_bin2bcd(sec));
  i2c_write(ds1307_bin2bcd(min));
  i2c_write(ds1307_bin2bcd(hr));
  i2c_write(ds1307_bin2bcd(dow));
  i2c_write(ds1307_bin2bcd(day));
  i2c_write(ds1307_bin2bcd(mth));
  i2c_write(ds1307_bin2bcd(year));
  i2c_stop();

#ifndef USE_INTERRUPTS
   enable_interrupts(global);
#endif

}

void ds1307_get_date(byte &day, byte &mth, byte &year, byte &dow){

#ifndef USE_INTERRUPTS
   disable_interrupts(global);
#endif

  i2c_start();
  i2c_write(0xD0);
  i2c_write(0x03);
  i2c_start();
  i2c_write(0xD1);
  dow  = ds1307_bcd2bin(i2c_read() & 0x7f);
  day  = ds1307_bcd2bin(i2c_read() & 0x3f);
  mth  = ds1307_bcd2bin(i2c_read() & 0x1f);
  year = ds1307_bcd2bin(i2c_read(0));
  i2c_stop();

#ifndef USE_INTERRUPTS
   enable_interrupts(global);
#endif

}

void ds1307_get_time(byte &hr, byte &min, byte &sec){

#ifndef USE_INTERRUPTS
   disable_interrupts(global);
#endif

  i2c_start();
  i2c_write(0xD0);
  i2c_write(0x00);
  i2c_start();
  i2c_write(0xD1);
  sec = ds1307_bcd2bin(i2c_read() & 0x7f);
  min = ds1307_bcd2bin(i2c_read() & 0x7f);
  hr  = ds1307_bcd2bin(i2c_read(0) & 0x3f);
  i2c_stop();

#ifndef USE_INTERRUPTS
   enable_interrupts(global);
#endif

}


char ds1307_read_nvram_byte(char addr){

   char retval;

#ifndef USE_INTERRUPTS
   disable_interrupts(global);
#endif

   i2c_start();
   i2c_write(0xD0);
   i2c_write(addr);

   i2c_start();
   i2c_write(0xD1);
   retval = i2c_read(0);
   i2c_stop();

   return(retval);

#ifndef USE_INTERRUPTS
   enable_interrupts(global);
#endif

}

void ds1307_write_nvram_byte(char addr, char value){

#ifndef USE_INTERRUPTS
   disable_interrupts(global);
#endif

   i2c_start();
   i2c_write(0xD0);
   i2c_write(addr);
   i2c_write(value);
   i2c_stop();

#ifndef USE_INTERRUPTS
   enable_interrupts(global);
#endif

}

void ds1307_get_day_of_week(char* ptr){

   byte lday;
   byte lmonth;
   byte lyr;
   byte ldow;
   ds1307_get_date(lday,lmonth,lyr,ldow);
   sprintf(ptr,"%s",days_of_week[ldow]);
}

///////////////////////////////////////////////////////////////////////////////

byte ds1307_bin2bcd(byte binary_value){

  byte temp;
  byte retval;

  temp = binary_value;
  retval = 0;
  while(1){
    if(temp >= 10){
      temp -= 10;
      retval += 0x10;
    }else{
      retval += temp;
      break;
    }
  }
  return(retval);
}

byte ds1307_bcd2bin(byte bcd_value){

  byte temp;

  temp = bcd_value;
  temp >>= 1;
  temp &= 0x78;
  return(temp + (temp >> 2) + (bcd_value & 0x0f));
}

///////////////////////////////////////////////////////////////////////////////
AGRADECERIA ALGUN OPINION AL RESPECTO
GRACIAS
Título: Re: ayuda 1307
Publicado por: Cryn en 30 de Noviembre de 2008, 19:08:23
donde vi esa librería :roll:

Pues la librería esta probada y certificada que esta muy bien :mrgreen:, seguramente muchos además de mi persona que hemos utilizado ella, con las modificaciones muy útiles del maestro rojo.

Creo que el problema o bien puede ser con la compatibilidad de tu LCD con el controlador HD44780 que exige la librería de CCS, o en la sentencia que estabas escribiendo y que mal corregí yo:

printf(lcd_putc,"\f%02d:%02d:%02d",hrs,min,sec);

que debería ser:

printf(lcd_putc,"\f%02u:%02u:%02u",hrs,min,sec);
Título: Re: ayuda 1307
Publicado por: ncoliv en 01 de Diciembre de 2008, 00:32:33
Para empezar a descartar dispositivos....., estoy trabajando con el PICSTART plus y el mplab, si el pic 16f877a estuviera quemado al hacer la vinculación de programación ( al comunicarse la pc con el pic) el software me avisaría de algún error en la comunicACIÓN???. porque cuando programo el pic muestra una programación satisfactoria esta todo bien con el pic????????? si es así le echaría la culpa al rtc!!! y probaría con otro
 Gracias 
Título: Re: ayuda 1307
Publicado por: tithanae en 01 de Diciembre de 2008, 16:44:17
mira baja las resistencias del rtc de 10k a 4.7k  a mi me paso algo parecido me avisas a demas te comento que es medio estricto el 1307 yo lo tenia armado en un proto y parece que estaba sucio o muy anchos los huecos que nunca me funciono en el proto tube que armarlo en placa ademas los pines de la bateria de respaldo no te olvides de ponerla a tierra si no la ocupas
Título: Re: ayuda 1307
Publicado por: ncoliv en 01 de Diciembre de 2008, 20:23:11
De a poco se avanza, ahora me aparece esto en el LCD:

45:85:85

esto sucede con tu modificación Cryn, que le sucederá al programa es una incognita!
hasta otro post, gracias
Título: Re: ayuda 1307
Publicado por: MGLSOFT en 01 de Diciembre de 2008, 23:36:42
Esta mostrandote los valores en Hexa.
Título: Re: ayuda 1307
Publicado por: ncoliv en 02 de Diciembre de 2008, 03:01:47
Ok. MGLSOFT, solo que los numeros no varían.

encontre este programita y me tira lo siguiente :

Freal  Time   Clock ( primera linea del LCD)
ff:ff:fffff-ff-2 (segunda linea del LCD)

se los posteo para ver cual puede ser el error

//Programa que usa protocolo I2C para
//escribir y leer tiempo del DS1307
//saca tiempo en LCD

//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)

#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=250; //ms a tardar entre lectura y lectura

//Justo cuando prende circuito, la fecha que establece es la siguiente
seconds= 0x00;
minutes= 0x38;
hours  = 0x15; //modo 24 hrs
day    = 0x05; //1 es domingo
date   = 0x13;
month  = 0x01;
year   = 0x05;
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);

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
   printf(lcd_putc,"f%2x-%2x-20%2x
",date,month,year); //dd-mm-year
   printf(lcd_putc,"%2x:%2x:%2x",hours,minutes,seconds); //23:59:59
   }
}



 MUCHAS GRACIAS POR LAS RESPUESTAS!!!!!!!

Título: Re: ayuda 1307
Publicado por: ncoliv en 02 de Diciembre de 2008, 03:28:54
otra consulta de acuerdo a esta línea

#use i2c(MASTER, SDA=PIN_b1, SCL=PIN_b0,slow)

el sda y scl del rtc tendrían que ir conestados al pin B1 y B0 del PIC????

GRacias
Título: Re: ayuda 1307
Publicado por: tithanae en 02 de Diciembre de 2008, 13:25:57
eso sale cuando  esta funcionado mal el bus I2C revisa hardware y sofware del el bus a mi me paso lo mismo un par de veses
Título: Re: ayuda 1307
Publicado por: ncoliv en 02 de Diciembre de 2008, 18:35:36
la duda es la siguiente: el bus

use i2c(MASTER, SDA=PIN_b1, SCL=PIN_b0,slow)

el sda y scl del rtc tendrían que ir conestados al pin B1 y B0 del PIC????

yo los tengo conectados al rc4 y rc3 respectivamente.
Título: Re: ayuda 1307
Publicado por: MLO__ en 02 de Diciembre de 2008, 19:12:44
Hola.

Debes conectarlo tal como esta en la configuracion del #use i2c (), si no, no te va a funcionar nunca  :mrgreen:

Saludos
Título: Re: ayuda 1307
Publicado por: RedPic en 02 de Diciembre de 2008, 19:44:08
Un detalle que quizás te pueda interesar puedes verlo aquí (http://www.todopic.com.ar/foros/index.php?topic=22242.msg175690#msg175690)
Título: Re: ayuda 1307
Publicado por: ncoliv en 03 de Diciembre de 2008, 00:37:00
Gracias muchachos empezó a tomar color la situación. Lo que se aprecia en el LCD es lo siguiente:

fReal time Clock
17:01:22f13-01-2

El conteo de los segundos se actualiza cada 8 segundos es decir pasa de ( por eejmplo) de 8 a 16 a 24 a 32 y asi permanentemente como puedo hacer para que se incremente de a un segundo.

como puedo hacer para borrar la primera linea y que alli aparezca la H:m:s
y en la segunda DD-mm-yeras

muchas gracias !!!!!!!!!
Título: Re: ayuda 1307
Publicado por: ncoliv en 03 de Diciembre de 2008, 01:35:56
Bueno logre ubicar la fecha y la hora en el primer y segundo renglon como lo quería.
aparece:
13-01-2005
15:55:13



Todavía no puedo hacer que el conteo se vea cada segundo. a que se  debe que la hora se actualice cada 8 seg, como lo mencioné en el post anterior.
Gracias 
Título: Re: ayuda 1307
Publicado por: MGLSOFT en 03 de Diciembre de 2008, 09:11:59
Que cristal utilizas??
Título: Re: ayuda 1307
Publicado por: ncoliv en 03 de Diciembre de 2008, 11:49:37
El del PIC es de 4 Mhz y del RTC es de 32768 Hz.
Gracias
Título: Re: ayuda 1307
Publicado por: ncoliv en 03 de Diciembre de 2008, 17:26:16
Muchas gracias, todo marcha sobre ruedas, veo en el display lo que necesito., respecto al incremento tuve que disminuir el tiempo en que lee el pic el rtc y todo solucionado, estoy viendo la fecha y la hora. y el incremento en 1 seg.
muchas gracias nuevamente por la ayuda.
Surge otra consulta:
Como podría colocar en hora el reloj mediante pulsadores externos.
Gracias se aprende mucho con el apoyo de este foro
Título: Re: ayuda 1307
Publicado por: Cryn en 03 de Diciembre de 2008, 18:04:43
que bueno que hayas solucionado la cuenta, para comentario, también decirte que me aparecía el famoso 45:85:85 y esto era porque no inicializaba la hora, osea, yo nunca le daba un set_hora(..); porque lo hacía manualmente (mediante un teclado) y ya la pila se encargaba del resto; me aparecía esos números grandes cuando le sacaba la pila y volvía a encenderlo sin ella, al volver a colocar la pila la hora se volvía a 00:00:00, osea que el RTC quería tener pila, jeje. Es un detalle para considerar, como ya te recomendaron anteriormente si no usas la pila mejor conecta a tierra el pin que le corresponde.

Para modificar la hora con pulsadores no será muy complicado, seguramente tendrás algunos pulsadores, te recomiendo los siguientes:

INC(incrementar+) DEC(decrementar-) EDIT(modificar) OK(aceptar), el último opcional

o ya dependerá de tí, de cuanta facilidad le desees dar a un usuario, pero creo que mínimamente 3 pulsadores

con uno de ellos (EDIT de preferencia) posicionas en que variable modificarás el dato (hh, mm, ss, dd, mm, aa) al presionar por ejemplo EDIT configurarás las horas, al volver a presionar EDIT pasas a minutos y así sucesivamente hasta llegar al último dato que puedas modificar y al terminar todo con EDIT también saldrás y se habrán guardado los datos en el RTC, los datos que habrán sido modificados primeramente en memoria RAM, para al final pasarlo al Reloj.

variarás el dato correspondiente con + -

tendrás que controlar todo eso con variables, variables correspondientes a cada dato y al tipo de dato que variarás, para que se guarden en el lugar correspondiente en RAM y posteriormente en el reloj.

nose si se entendió, pero solo avisas. Como mencioné esta es la forma que se me ocurre, ya dependerá de ti si quieres más pulsadores y por lo tanto más opciones.
Título: Re: ayuda 1307
Publicado por: ncoliv en 04 de Diciembre de 2008, 01:03:08
Esa es la idea Cryn, pero como se hace, como guardo en memoria, como hago correr el cursor. Las preguntas sonmuchas espero me des algunas pistas. Por lo menos logré vizualizar el reloj y ya lo puse en hora mediante el programa, pero se  atraza cdo lo saco del programador  y lo llevo al protoboard. (otra forma sería de programarlo adelantado por ejemplo dos min que es lo que me lleva ubicarlo nueva,mente en el circuito ) por eso quiero utilizar pulsadores para la puesta en hora. Alguna informacion o explicación te agradecería mucho.
Título: Re: ayuda 1307
Publicado por: Cryn en 04 de Diciembre de 2008, 01:33:14
Ahorita ya me da un poco de sueño y no tengo las ideas claras :oops:

Permíteme ordenar las ideas que tengo y mañana te lo lanzo de golpe :mrgreen:

un saludo.
Título: Re: ayuda 1307
Publicado por: ncoliv en 07 de Diciembre de 2008, 23:26:35
Hola Cryn, encontre un programa que es justamente lo que quiero hacer, pero esta configurado, para un ds1302 y un pic 16f648a, trataré de adaptarlo para lo integraditos que estoy manejando. Una pregunta que versión del simulador proteus, me recomiendas ya que puedo buscarlos en la red. Muchas gracias.
Título: Re: ayuda 1307
Publicado por: Cryn en 07 de Diciembre de 2008, 23:36:57
Hola, caray disculpa por no haber hecho lo que te dije por acá, pasa que me encuentro algo corto de tiempo, disculpa, si hasta el miércoles me libro, con gusto te continuo ayudando.

por ahora decirte que una versión que tiene el ds1307 para ir simulando es la 7.2 SP2, el SP6 va de las mil maravillas también.

seguro que podrás estar adaptándolo, si tienes alguna duda pues avisas, quizá podamos ayudarte

un saludo.
Título: Re: ayuda 1307
Publicado por: ncoliv en 07 de Diciembre de 2008, 23:46:24
Gracias por la respuesta Cryn, ese software lo puedo conseguir de la red.
Gracias.
Título: Re: ayuda 1307
Publicado por: ncoliv en 08 de Diciembre de 2008, 20:59:55
Hola con la version shareware del proteus lite puedo simular este programa
gracias
Título: Re: ayuda 1307
Publicado por: ncoliv en 09 de Diciembre de 2008, 22:03:12
hola muchachos nuevamente otra pregunta, ¿con este programa proteus puedo simular programas hechos con el ccs c ?
Gracias
Título: Re: ayuda 1307
Publicado por: MLO__ en 10 de Diciembre de 2008, 12:16:47
Hola.

Claro, y no solo hechos con CCS si no tambien con varios compiladores como C18, MikroC, HiTech y hasta con ASM.

Saludos
Título: Re: ayuda 1307
Publicado por: ncoliv en 21 de Diciembre de 2008, 21:13:58
Aprovecho este medio para desear una FELIZ NAVIDAD y un venturoso y prospero AÑO NUEVO a todos los usuarios de este magnifico foro.
Título: Re: ayuda 1307
Publicado por: Cryn en 21 de Diciembre de 2008, 22:45:18
Hola ncoliv, feliz navidad para ti también!! y que pases un muy buen fin de año prosperidad para el siguiente!!

gracias por pasar a felicitarnos :-/

y como te fue con el  proyecto? todavía sigue pendiente, porque podemos acabarlo :mrgreen:

un saludo
Título: Re: ayuda 1307
Publicado por: ncoliv en 22 de Diciembre de 2008, 03:07:29
Hola cryn, todavía estoy en eso; conseguí un programita que esta hecho para el  rtc 1302 y el F648A lo trataré de adaptarlo para el 1307 y el f877a hace lo que necesito, modifica la hora  con pulsadores, lo estoy estudiando. Si existe algun problemita seguro que lo posteare. Gracias por la colaboracion de antemano!!.
Título: Re: ayuda 1307
Publicado por: ncoliv en 22 de Diciembre de 2008, 03:41:22
Tbien conseguí el proteus, baje algunos tutoriales pero ninguno me dice como ingrsar el programa en CCs C para simularlo seguiré buscando ....
hasta otro post.saludos!
Título: Re: ayuda 1307
Publicado por: Cryn en 22 de Diciembre de 2008, 12:09:06
Hola ncoliv, para meter el programa en el pic del proteus solo debes ingresar a las características del micro, el archivo .cof generado por el compilador es el que se utiliza para la depuración, más o menos así:

(http://img237.imageshack.us/img237/1886/01xb1.jpg)

(http://img187.imageshack.us/img187/6883/02qb0.jpg)

(http://img253.imageshack.us/img253/7392/03bh2.jpg)
también colocas el valor de cristal que estás utilizando, para que todo marche bien

Una vez cargado esto podes comenzar la depuración presionando el botón paso (play/pause), eso te dará más o menos este resultado:
(http://img166.imageshack.us/img166/1787/04jo5.jpg)
y ahi tienes los botones para ir paso a paso o seguir ejecutando, y uno de los más importantes las bolitas rojas con la flecha encima, que es el breakpoint, tu lo colocas en cualquier línea de código y al ejecutar con PLAY, el código se detendrá en ese punto y te mostrará la ventana de depuración.

En el menú DEBUG están varias opciones de depuración y también los iconos mencioné anteriormente, por ultimo se muestra la ubicación del botón paso (PLAY/PAUSE)
(http://img201.imageshack.us/img201/3449/05hu7.jpg)

Espero esto pueda ayudarte, un saludo amigo!
Título: Re: ayuda 1307
Publicado por: ncoliv en 22 de Diciembre de 2008, 15:46:45
Gracias CRYN, intentaré simular un ejemplo pequeño siguiendo esta ayuda para ir familiarizandome
saludos y muchas gracias nuevamente.
Título: Re: ayuda 1307
Publicado por: Cryn en 22 de Diciembre de 2008, 18:29:41
Para manipular la hora con pulsadores en los pines A0, A1 y A2 yo haría lo siguiente:

Código: [Seleccionar]
#define edit PIN_A0
#define add PIN_A1
#define less PIN_A2

void main(void){
   int1 config=0;
   int var=0,temp_hh,temp_mm,temp_ss,temp_dd,temp_me,temp_an;

   ... //configuraciones
   while(true){
      if(config==0){
         get_hora();      // capturo hora y fecha del RTC
         get_fecha();
         printf(lcd_putc,"\f%02u:%02u:&02u",hh,mm,ss);      // lo muestro en el LCD
         printf(lcd_putc,"\f%02u/%02u/&02u",dd,me,an);
         delay_ms(200);
      }
      if(input(edit)){      // si se pulso edit
         do{
            delay_ms(20);      // antirrebote
         }while(input(edit));
         if(config==0){      // si estaba en modo normal
            config=1;         // cambio a modo configuración
            temp_hh=hh;    // copio los valores del RTC capturados anteriormente a variables temporales
            temp_mm=mm;
            temp_ss=ss;
            temp_dd=dd;
            temp_me=me;
            temp_an=an;
         }
         var++;        // var indica que variable se va a modificar, si horas, minutos,etc.
         if(var==7){   // si var es 7 ya no hay más variables que modificar
            var=0;      // y vuelvo a modo normal, osea mostrar la hora
            config=0;
            set_hora(temp_hh,temp_mm,temp_ss);    // fijo la nueva hora y fecha configurada
            set_fecha(temp_dd,temp_me,temp_an);
         }
      }
      if(input(add) && config==1){   // si pulso add y está en modo configurar
         do{
            delay_ms(20);
         }while(input(add));
         if(var==1){         // incremento valor de horas
            temp_hh++;
            if(temp_hh>59)
               temp_hh=0;
         }
         else if(var==2){   // incremento valor minutos
            temp_mm++;
            if(temp_mm>59)
               temp_mm=0;
         }
         else if(var==3){   // incremento segundos
            temp_ss++;
            if(temp_ss>59)
               temp_ss=0;
         }
         else if(var==4){
         ...
         }
         else if(var==5){
         ...
         }
         else if(var==6){
         ...     // algo similar para el día, mes y año, te lo dejo de tarea :mrgreen:, podes controlar tb el mes si es de
         // 30 ó 31, o si es febrero bisiesto o no, y hasta un otro pulsador para moverse entre las variables a
        // modificar, para ir de derecha a izquierda tb
         }
      }
      if(input(less) && config==1){
         ...   //mismo proceso anterior pero ahora decrementando en cada variable correspondiente
      }
   }
}

Creo que con eso puede servir, claro que falta que termines el código y que lo pongas a correr para detectar los bugs. Por ejemplo las funciones set_xxx() y get_xxx() son para el RTC que con la librería puedes crearlas facilmente.

Ojala pueda servirte, un saludo, y algo tarde la respuesta de la idea que te dije, pero más vale tarde que nunca, no? y disculpas por al tardanza, s tienes alguna duda sobre el código ahí me avisas

Un saludete.
Título: Re: ayuda 1307
Publicado por: ncoliv en 24 de Diciembre de 2008, 00:55:48
Trabajaré tbien sobre este programita. Tengo para entretenerme. Estoy armando un circuito basico en proteus como prender un led. hasta ahora sin resultados positivos.Bueno muchas Felicidades .GRACIAS !!
hasta otro post
Título: Re: ayuda 1307
Publicado por: ncoliv 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
Título: Re: ayuda 1307
Publicado por: ncoliv 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

Título: Re: ayuda 1307
Publicado por: Cryn 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.
Título: Re: ayuda 1307
Publicado por: ncoliv 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

Título: Re: ayuda 1307
Publicado por: Cryn 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:
Título: Re: ayuda 1307
Publicado por: ncoliv 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?
 
Título: Re: ayuda 1307
Publicado por: ncoliv 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!!
 
Título: Re: ayuda 1307
Publicado por: Cryn 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
}
Título: Re: ayuda 1307
Publicado por: ncoliv en 15 de Enero de 2009, 00:40:18
Ok CRYN estudiaré el programa
Gracias por la respuesta.
Título: Re: ayuda 1307
Publicado por: Cryn 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

Título: Re: ayuda 1307
Publicado por: ncoliv 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


Título: Re: ayuda 1307
Publicado por: MLO__ 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
Título: Re: ayuda 1307
Publicado por: ncoliv 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.
Título: Re: ayuda 1307
Publicado por: ncoliv 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
   }
}
Título: Re: ayuda 1307
Publicado por: Cryn 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 (http://www.todopic.com.ar/foros/index.php?topic=13282.0) 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
Título: Re: ayuda 1307
Publicado por: ncoliv en 22 de Enero de 2009, 21:54:50
Cryn muchas gracias por tus aportes y sobre todo por tu predisposiciòn. Entiendo lo que es una libreria solo que estoy confundido porque en el ultimo programita que postee no se invoca al ds1307.c y sin embargo el mismo funciona de maravillas. ahora existe otro  que presenta el ds1307.c  en la cabecera del programa y en el mismo se llama a las funciones definidas en la libreria y no pasa nada, es decir no anda el programa (el cableado esta corecto). Bien a pesar de todo seguire investigando el tema , considerare, tus aportes y como tu dices seguirè preguntando.
hasta otro post.
saludos 
Título: Re: ayuda 1307
Publicado por: Cryn en 24 de Enero de 2009, 17:57:01
ahora ya hasta me confundiste a mi :D :D

que lío se ha hecho esto, pues decirte que el último código que pegaste por acá no está modificando con los pulsadores porque no existen rutinas para que se haga ello, como te mencione podemos dividirlo en 2 partes:

1. manejo del reloj (librería)
2. manejo de los pulsadores

en este ultimo código no esta el punto 2, por eso no funciona, te falta incluirle las rutinas para modificar los datos

tremendo lío al que nos metiste :D

ojala que podamos salir de este sin problemas

suerte, un saludo
Título: Re: ayuda 1307
Publicado por: ncoliv en 30 de Enero de 2009, 19:08:37
Ok, Cryn solucione my problema, ahora tengo dos programitas que leen el rtc. estan posteados en estas consultas, la diferencia es en la configuraciones de los pines para la comunicacion I2C., uno es más sencillo de interpretatr que el otro ( por lo menos para mí), ahora trabajaré en la modificacion de la hora y fecha.
Muchas gracias por tus aportes.
Título: Re: ayuda 1307
Publicado por: Cryn en 30 de Enero de 2009, 19:11:44
bien, que bueno que hayas encontrado las fallas, ahora a seguir programando para con las modificaciones

 :-/
Título: Re: ayuda 1307
Publicado por: ncoliv en 01 de Febrero de 2009, 13:05:05
Hola Cryn estoy en la tarea de fusionar las dos partes del programa.
Para provocar el incremento de las h, min, dias, mes, etc, tengo que interrupir la visualización en el LCD de estas variables.

para esto utilizo " enable_interrupts(global)" ¿Como funciona esta interrupcion?, ¿ con algun puerto en especial? Utilizo los pines  B3 y B5 para incrementar y configurar respectivamente.¿La tengo que definir en la cabecera?
 
gracias   
Título: Re: ayuda 1307
Publicado por: Cryn en 01 de Febrero de 2009, 14:32:37
mmm cuantos botones vas a tener? y que funciones tendrá cada uno?

porque puedes, por ejemplo capturar los datos (de fecha y hora) en variables temporales, hasta que termines la configuración, y modificas solo estas temporales con los pulsadores, para después que se termine la configuración, enviar estos nuevos datos la RTC para que se configure la nueva hora y/o fecha

y pues en el LCD visualizarías estos datos temporales, y no directamente lo que tiene el RTC.

enable_interrupts(global) sirve para habilitar todas las interrupciones, para validar todas las interrupciones, si por ej activaste la interrupción por desborde del TIMER0, pero no activaste las interrupciones globales el timer no provocará interrupción.

Talvez puedas definir B3 y B5 con mejores nombres, o más entendibles, por ejemplo:

#define pin_b3 inc
#define pin_b5 dec

solo para cuestiones de entendimiento, porque puedes de lo contrario manejarlo con los nombres pin_b3 o _b5 sin problemas, ya que su sabrás que hace cada uno

un saludo
Título: Re: ayuda 1307
Publicado por: ncoliv en 02 de Febrero de 2009, 16:54:55
Hola Cryn, para definir a los pines B3 y B5 como entradas utilizo  "set_ tris_b ( 0x24) (los otros pines seran salidas), con B3 incrementare y B5 entraré a configurar y pasare por cada variable.
Una duda: Los set_tris_ sirven para configurar cada pin del puerto? y los use_fast_io () para que sirven   
gracias.
 A tu pregunta tendré dos botones como lo habias supuesto. saludos
Título: Re: ayuda 1307
Publicado por: Cryn en 02 de Febrero de 2009, 19:17:54
sería set_tris_b(0x28); para que b3 y b5 sean entradas y el resto salidas

Si lo tris sirven para configurar si un pin es Entrada o Salida (entrada con 1, salida con 0)
EL fast_io sirve para optimizar el código, porque cuando no está presente no es necesario que hagamos definición de TRIS, ya que el compilador lo hará automáticamente cada vez que maneje los puerto, esto qeuire decir que habrá código redundante muchas veces. En cambio si colocamos fast_io le estamos diciendo al compilador que colocaremos los tris para ese puerto, y el compilador no colocará por ningún lado tris cuando se maneje el puerto
Título: Re: ayuda 1307
Publicado por: ncoliv en 02 de Febrero de 2009, 22:19:18
ok, Cryn gracias. .....otras consultas :
utilizaré el pin B4 para llegar a la funcion configurar , el programa empieza

void main(void)
{
 lcd_init(); //Inicializa lcd   
if(input(PIN_B4)==0){ //Si se pulsa Configurar 
while(!input(PIN_B4)){} //elimina rebotes 
configurar(); //ve a menu configurar

while(1)
{
////////en esta parte esta la actualizacion y lectura del rtc esta funcionando OK //////////
}
}

La funcion configurar empieza de la siguiente forma:

///////////////////FUNCION CONFIGURAR ////////////////////////
void configurar(void)
{
do{
switch(menu)
{
case 0: lcd_putc("\fConfigurar\nhoras?" ); //horas
if(!input(PIN_B5)){
while(!input(PIN_B5)){}
horas();
menu=1;
//apunta siguiente opcion
}
break;
case 1: lcd_putc("\fConfigurar\nminutos?" ); //minutos
if(!input(PIN_B5)){
while(!input(PIN_B5)){}
minutos();
menu=2;
//apunta siguiente opcion
///////////////////////y asi continua esta funcion /////////////
Los pines del puerto B que utilizo para esto, están en pullups en modo normal con una r330 a 5V al inicio la b4 esta a masa por lo que deberia ir a configurar y mostrarme las opciones pero no pasa nada ¿ QUE ERROR ESTARÉ COMETIENDO?
Título: Re: ayuda 1307
Publicado por: Cryn en 02 de Febrero de 2009, 22:55:07
antes del while(1) que es tu ciclo de trabajo, solo van configuraciones del micro, esto es los TRIS, A/D si hay, timers, etc.

dentro el while(1) se encuentra el programa que se va ejecutar todo el tiempo en el micro, si colocas un if fuera del while(1) ese solo se ejecutará una vez y nunca más a menos que resetees

entonces te voy corrigiendo algunas cosas:

void main(void){
   lcd_init(); //Inicializa lcd   
   while(1){
   if(input(PIN_B4)==0){ //Si se pulsa Configurar
      while(!input(PIN_B4)){} //elimina rebotes
      configurar(); //ve a menu configurar
   } //se te olvidó la llave al final del if
  //todo dentro del while(1)
////////en esta parte esta la actualizacion y lectura del rtc esta funcionando OK //////////
   //como funciona bien esta la dejas
   }
}

La funcion configurar empieza de la siguiente forma:

///////////////////FUNCION CONFIGURAR ////////////////////////
void configurar(void){
   do{
      switch(menu){
         case 0: lcd_putc("\fConfigurar\nhoras?" ); //horas
            if(!input(PIN_B5)){
               while(!input(PIN_B5)){}
               horas();
               menu=1;
               //apunta siguiente opcion
            }
            break;
         case 1: lcd_putc("\fConfigurar\nminutos?" ); //minutos
            if(!input(PIN_B5)){
               while(!input(PIN_B5)){}
               minutos();
               menu=2;
               //apunta siguiente opcion
            } otra llave que talvez si esta, pero para que no se olviden
               ///////////////////////y asi continua esta funcion /////////////

y hasta ahora me parece que va muy bien

El error creo que esta porque el if está fuera del while(1)

Un saludo, ya va tomando buena forma tu proyecto, sigue así
Título: Re: ayuda 1307
Publicado por: ncoliv en 02 de Febrero de 2009, 23:43:04
Ok, Cryn, en la funcion configurar utilizo la sentencia swich y en esta la variable entera "menu" otro error que estoy cometiendo es que en ningun lugar inicializo "menu", este esta definido como "int menu"
 la pregunta es como la inicializo y en donde.
Gracias

#include <16F877A.h>                ///   libreria para el manejo del pic16f877a
#use delay(clock=4000000)          ///   declara  la frecuencia del cristal
#fuses XT,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOPROTECT
#include <ds1307.c>
#include <lcd.c>


#use fast_io(A)
#use fast_io(B)
#use fast_io(C)                     ///   con esta instruccion evitamos que
#use fast_io(D)                     ///   se este configurando cada vez que usamos
#use fast_io(E)                     ///   alguna instruccion de entrada o salida


#byte portc = 7                     /// se definen direcciones de memoria
#byte portd = 8

int sec;
int min;
int hr;
int  day;
int  mth;
int  year;
int  dow;
int  menu;
   
///DEFINICION DE FUNCIONES
void configurar(void);
void horas(void);
void minutos(void);
void dia(void);
void mes(void);
void anio(void);
Título: Re: ayuda 1307
Publicado por: Cryn en 02 de Febrero de 2009, 23:55:57
puedes hacerlo despues del lcd_init

quedaría así:

void main(){
   lcd_init();
   menu=0;
   while(1){
      ...
   }
}

o cuando lo defines:
int menu=0;
Título: Re: ayuda 1307
Publicado por: ncoliv en 03 de Febrero de 2009, 00:16:37
Bien, la segunda opcion es la que había utilizado. Gracias Cryn
Título: Re: ayuda 1307
Publicado por: ncoliv en 03 de Febrero de 2009, 01:45:04
Hola Cryn, esta caminando el programita, :-/
solo que ahora no actualiza el rtc, cambiaré algunas posiciones de actualizacion
Título: Re: ayuda 1307
Publicado por: Cryn en 03 de Febrero de 2009, 02:00:29
bien que ya vaya caminando, me alegra mucho, ya quiero ver unas cuantas fotos y/o videos dando al 100% :mrgreen:

posiciones? que posiciones??
Título: Re: ayuda 1307
Publicado por: ncoliv en 06 de Febrero de 2009, 23:51:49
Ok, Cryn a las de actualización, me refiero a la ubicación en las lineas del programa que leen el rtc.
Hasta ahora todo bien. salvo ese tema.   
Título: Re: ayuda 1307
Publicado por: Cryn en 10 de Febrero de 2009, 18:58:03
aah las esas posiciones :D

te recomiendo que cuando pulses el botón de editar, cambies el estado de una bandera para que momentáneamente, mientras se este editando, se deje de leer el RTC, entonces en el momento de pulsar el edit guardas en variables temporales lo que el reloj tiene en ese instante, y modificas con tus pulsadores sobre estas variables temporales, una vez terminada la edición retornas al estado inicial a esa bandera, en un ejemplo, más o menos así:

if(bandera==false){
  //leer y mostrar RTC
}
else{
  //capturar valores RTC y editar
  // también ir mostrando en el LCD los datos que se están modificando
}

al final de la edición coges las variables temporales y las grabas en el RTC y cambias de valor a la bandera para que muestre y vaya actualizando los datos en el RTC

Se entendió la idea? si no me equivoco cuando te dejé un código una de las 1ras veces y te dije que lo veas y trates de acabarlo tengo esta misma idea

espero te sea de utilidad, un saludo
Título: Re: ayuda 1307
Publicado por: ncoliv en 11 de Febrero de 2009, 11:24:22
Ok, cryn. te comento en breve lo que esta pasando.
- al inicio me muestran la hora y fecha en (00:00:00 y tbien la fecha ) allí se encuentra hasta que lo saco con el pulsador de configutrar
- con ese  pulsador lo llevo a configuracion y escribo la hora y fecha deseada ( todo bien )
- cuando salgo solo algunas variables estan actualizadas e slo que se muestra por el rtc  y comienza el conteo del reloj. lo deje un par de días y todo OK, pero sobre este tiempo erroneo.
 por eso digo que los valores  deseados no se actualizan correctamente.
seguire estudiando el tema con tus sugerencias
Un saludo.
Título: Re: ayuda 1307
Publicado por: Cryn en 11 de Febrero de 2009, 16:33:56
ahh bien, seguramente se te esta pasando una línea por ahí, por eso mejor es trabajar con temporales, porque se te enredan las cosas

espero lo soluciones
Título: Re: ayuda 1307
Publicado por: ncoliv en 12 de Febrero de 2009, 23:33:01
Hola Cryn, ya sé lo que esta pasando.
Cuando seteo las variables del dia,mes,año,hora y min con valores menores que 10 el rtc parte en forma correcta con los valores deseados.
si el seteo de estas variables es con valores mayores que 10 el inicio del RTC se incremeta. se empieza con valores mayores a los seteados.
si la variable se setea en 10 se inicia el rtc con 16, si el seteo fue de 20 se inicia el rtc con 32 y si lo seteo con 30 parte del 08.
¿como se podria solucionar este problemita?
Gracias

Título: Re: ayuda 1307
Publicado por: RedPic en 13 de Febrero de 2009, 06:19:48
Curioso. 10 en hex es 16 en decimal y 20 en hex es 32 en decimal.
Título: Re: ayuda 1307
Publicado por: ncoliv en 13 de Febrero de 2009, 14:32:13
Hola redpic, entonces se esta  seteando en HEX y el rtc lo manda a DEC?
Título: Re: ayuda 1307
Publicado por: Cryn en 13 de Febrero de 2009, 14:56:00
que raro, probablemente este pasando algo como eso pero... donde? supongo que definiste variables tipo byte, pues nose donde podría estar la falla
Título: Re: ayuda 1307
Publicado por: ncoliv en 13 de Febrero de 2009, 19:27:30
Hola Cryn, estuve estudiando el caso.
cuando incremento cualquier variable y supero el 9 pero no llego al 20 el rtc le agrega a esta 6 eso es lo que se ve en el lcd.( si seteo 11 veo 17)
si el seteo va  de 20 a 29 el rtc le agrga 12 ( si el nro a setear es 21 veo en lcd  33)
si es entre 30 y 39 le agrega 18 ( si el nro a setear es 32 veo 50)
si va de 40 a 49 le agrega 24 ( el seteo es 41 se ve 65) .y asi con la decada del 50 le agrega 30.
se puede colocar en hora perfectamente teniendo este incremento.

Mi pregunta es. puedo incrementar una variable de 0 a 16 sin que me muestren la letras que corresponden al hexa, para mostrarlos directamente en el lcd.?
Título: Re: ayuda 1307
Publicado por: Cryn en 13 de Febrero de 2009, 19:38:23
aaahhh ya ya ya, ahora entiendo tu problema, es a nivel de visualización, nada que ver con el tipo de datos ni que el rtc lo toma mal o que el pic hace otra cosa, no no, el problema esta en las instrucciones de visualización:

vi por ahí un %2X dentro de las comillas del printf, no esta mal la idea, pero ahi tienes que controlar los limites hasta donde va a visualizar, y es un rollo creado en vano

mejor usa %2u, ese es el que yo uso, y no hay ningún problema en la visualización, porque lo hace directamente en entero, el otro es hexa, por eso el rollo
Título: Re: ayuda 1307
Publicado por: ncoliv en 13 de Febrero de 2009, 20:21:17
Ok cryn seguire esa sugerencia.
Título: Re: ayuda 1307
Publicado por: ncoliv en 13 de Febrero de 2009, 23:23:01
Ok, todo bien ahora, el seteo es perfecto; tuve modificar y anular algunas líneas de programa.  :-/ :-/.

Solo queda establecer límites en el conteo de las variables
Gracias :-/ :lol:
Título: Re: ayuda 1307
Publicado por: Cryn en 14 de Febrero de 2009, 00:11:00
que bueno ncoliv, ves que era un poquito de orden :lol:

ya quiero ver imágenes :mrgreen:

un saludo
Título: Re: ayuda 1307
Publicado por: ncoliv en 20 de Febrero de 2009, 21:57:51
Ya subiré las fotos para compartirlas. Muchas gracias por sus aportes. ( Tengo que investigar ahora como se sube a you tube un videito de este proyecto )
Título: Re: ayuda 1307
Publicado por: Cryn en 20 de Febrero de 2009, 22:02:16
para subir videos a youtube solo tienes que crearte una cuenta ahí y listo buscas la etiqueta para subir y comienza el upload, para subir imágenes puedes usar el imageshack.us no hace falta tener cuenta, epro si te creas una puedes tener siempre a la vista todas la imágenes que subiste

Enhorabuena por ya tener casi listo, o talvez ya listo tu proyecto! felicidades!

un saludo amigo :-/
Título: Re: ayuda 1307
Publicado por: ncoliv en 21 de Febrero de 2009, 21:14:50
Gracias por la info Cryn. Sin tus aportes hubiera tardado más en llegar a mi meta. Ahora quisiera vincular esto con alguna variable a medir y guardar en una memoria 24lc. empezaré con este  nuevo desafio. cualquier duda. creo que puedo contar con tu asesoramiento . Muchas gracias  de antemano
Otro saludo amigo.
Título: Re: ayuda 1307
Publicado por: Cryn en 22 de Febrero de 2009, 12:11:55
claro que si ncoliv que estaré acá para algunas dudas en las que pueda ayudarte, y puedes comenzar con ello buscando en el foro, hay mucha info de manejo de memorias i2c, puedes usar a la vez un sensor de temperatura i2c y usas el mismo bus, puedes mostrar la hora y la temperatura en el LCD y guardas la info cada cierto tiempo y después analizas la variación por ejemplo.

Un saludo
Título: Re: ayuda 1307
Publicado por: ncoliv en 22 de Febrero de 2009, 20:21:36
Cryn, para la temperatura quiero aprovechar un LM35 y tbien consegui una 24lc256. Estaré investigando en este foro, algo que se adecue a lo que tengo en mente que no se aparta de lo que vos escribiste.
Saludos
Título: Re: ayuda 1307
Publicado por: camigod en 07 de Abril de 2009, 00:15:42
Hola a todos como estan?

Me paso por aca porque estoy iniciando con el manejo del RTC ds1307, estoy programando en PICC, utilizando la libreria ds1307.c, muy parecida a la posteada en este hilo anteriormente.

Estoy programando un PIC 18F4550 con 4Mhz, y manejando una lcd grafica para la visualizacion, este es el codigo que tengo:
Código: [Seleccionar]
#include <18F4550.h>

#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#include <HDM64GS12.c>
#include <graphics.c>
#include <ds1307.c>


#use STANDARD_IO (A)
int a=0,mes,dia,hor,min,sec;

void main()
{
   char k[8];
   setup_adc_ports(NO_ANALOGS);
   glcd_init(ON);
   ds1307_init();
   glcd_imagen(0);
   ds1307_set_date_time(6,4,9,0,11,30,0);
   delay_ms(500);
   while(1){
      ds1307_get_time(hor,min,sec);
      glcd_fillScreen(OFF);
      sprintf(k, "%d", min); // Convierte variable a cadena de texto, almacena en k
      glcd_text57(1, 1, k, 1, ON);
      sprintf(k, "%d", sec);
      glcd_text57(1, 9, k, 1, ON);
      delay_ms(1000);
   }
}

Como ven inicializo la LCD y el modulo I2C y el programa deberia mostrarme el minuto y los segundos actuales... la SIMULACION en PROTEUS funciona correctamente, pero en el montaje no... aparentemente se bloquea en la sentencia ds1307_init(), 

Los pines son:
SDA = PIN C4
SCL = PIN C5

no se que puedo estar haciendo mal, como ven despues de iniciar los modulos, llamo a una funcion glcd_imagen, que no la posteo pero lo que hace es mostrarme algo en la LCD para verificar que funciona... el problema es:

    SI comentareo la linea ds1307_init, la LCD muestra la imagen, pero si la dejo activa la LCD se queda en blanco... aparentemente el bloqueo esta en esa linea...

Alguien sabe que puede estar ocurriendo?

El ds1307 lo tengo conectado con 2 R de 4,7K como pullups, un cristal de 32Khz y la bateria de 3V, pero pues cualquier sujerencia la agradeceria.

Gracias
Título: Re: ayuda 1307
Publicado por: Cryn en 07 de Abril de 2009, 12:09:15
Mientras se atienda al bus I2C las interrupciones deben estar apagadas.

Si en la simulación va bien, creo que pueda ser quizá un error en las conexiones de los pines, quizá invertiste involuntariamente SCL y SDA o algunos otros, revisa las conexiones.

Quizá la librería tenga algún error, prueba cambiar de librería por la de acá, la de Redpic. (aunque funcionó la simulación, quizá este no sea el problema)

Por último diría que el reloj podría estar dañado, por no ser capaz de responder a las ordenes.

Por ahora es todo lo que se me ocurre que podría ser, si tengo algo más te aviso.

Prueba los cambios y verificaciones y avisas. Un saludo
Título: Re: ayuda 1307
Publicado por: camigod en 07 de Abril de 2009, 15:20:33
Hola a todos, gracias por la respueta Cryn,

Verifique lo que me dijiste y no he encontrado el problema, reemplase el ds1307 por uno nuevo y no paso nada, verifique la conexion y esta bien...

Ahora mi pregunta es:  En el datasheet del 18f4550 aparece que el pin B0 = SDA, y el pin B1 = SCL, cuando configuro la libreria... en los #define SDA... SCL, tengo que poner esos pines?? o si utilizo otros la libreria se encarga de la configuracion??

Intentare utilizar esos pines, para lo cual modificare la libreria de la LCD, pues los maneja para el control de la Graficadora.... y luego comento que paso.

Gracias
Título: Re: ayuda 1307
Publicado por: camigod en 07 de Abril de 2009, 18:29:40
Hola, modifique la libreria de la LCD grafica para dejar el puerto B libre, y montar el RTC en los pines B0 y B1 (sda, y scl) respectivamente.

Ahora a cosa esta mejorando, por lo menos ya se inicializan ambos modulos pero me aparece

85
85

y no se actualiza nunca... leyendo este foro encontre que ncoliv tenia el mismo problema visualizando un 45:85:85 y que no se actualizaba pero no posteo que soluciono el problema :(

Este es el codigo que estoy utilizando:
Código: [Seleccionar]
#include <18F4550.h>

#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#include <HDM64GS12.c>
#include <graphics.c>
#include "2009.c"
#include <ds1307.c>

int a=0,mes,dia,hor,min,sec;

void main()
{
   char k[8];
   setup_adc_ports(NO_ANALOGS);
   glcd_init(ON);
   ds1307_init();
   ds1307_set_date_time(6,4,9,0,11,30,0);  //Inicio la fecla y la hora como 11:30
   glcd_imagen(a);                                    // muestra una imagen que comprueba la funcionalidad de la LCD
   delay_ms(500);
   while(1){
      ds1307_get_time(hor,min,sec);           //Leo hora
      glcd_fillScreen(OFF);                          //Limpio la LCD
      sprintf(k, "%d", min);                         // Convierte variable a cadena de texto, almacena en k
      glcd_text57(1, 1, k, 1, ON);                //muestro minutos
      sprintf(k, "%d", sec);
      glcd_text57(1, 9, k, 1, ON);                //muestro segundos
      delay_ms(1000);
   }
}

Como les dije antes, la simulacion funciona correctamente y ya cambie el ds1307, y ambos me muestran los 85. el pin de la bateria lo tengo a tierra.

Gracias por su ayuda
Título: Re: ayuda 1307
Publicado por: camigod en 07 de Abril de 2009, 23:21:35
Hola, aparentemente los 85 se debian a la bateria, pues la conecte y la lcd muestra la hora que coloco en el programa, pero ahora el problema es que no avanza... se queda hay....

no se cual es la correcta conexion del cristal, y no se si necesita condensadores... pues cuando toko el cristal con los dedos... el tiempo avanza, aunque de a 2 segundos... pero avanza, entonces no se que falta en las conexiones, gracias de antemano.
Título: Re: ayuda 1307
Publicado por: MLO__ en 08 de Abril de 2009, 03:06:08
Hola.

En el datasheet del reloj hay una pauta de como hacer el mapa de tierra al cristal, es bueno hacerlo como lo indica. Saludos.
Título: Re: ayuda 1307
Publicado por: Cryn en 08 de Abril de 2009, 13:23:48
si puedes cambiar los pines de SDA y SCL en la librería que dejó redpic, con defines antes de la inclusión de la librería del RTC, sería así por ejemplo:

#define RTC_SDA  PIN_A5
#define RTC_SCL  PIN_A3
#define USE_INTERRUPTS 1  //esta es de la lib de redpic
#include <ds1307.c>

o si no se puede en tu librería, puedes buscar la linea:
#use i2c(master, sda=RTC_SDA, scl=RTC_SCL) // puede ser que ahí aparezcan pin_b0 y pin_b1
y cambiar por los pines que quieras usar.

El ds1307 solo necesita el cristal, no hace falta condensadores, los lleva internamente, y si hay que tener cuidado con la PCB y seguir las recomendaciones de la hoja de datos. Si lo estas haciendo en protoboard igual con un cable amarralo a tierra.

Título: Re: ayuda 1307
Publicado por: camigod en 08 de Abril de 2009, 14:26:18
Hola, El problema de los pines ya lo solucione, pero no entiendo lo que amarrar el cristal a tierra, podrian esplicarme como hacerlo?.

Gracias
Título: Re: ayuda 1307
Publicado por: Cryn en 08 de Abril de 2009, 14:55:59
hola, ya te respondí en el privado, y una imagen sería más o menos así:
http://www.todopic.com.ar/foros/index.php?topic=13282.msg190756#msg190756

o si puedes ver en una placa base de PC que tenga un cristal así verás a que me refiero con "amarrar" jeje un término que le dí yo, un saludo