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

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

Desconectado ncoliv

  • PIC16
  • ***
  • Mensajes: 130
ayuda 1307
« 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 !!!!!!!!!


Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: ayuda 1307
« Respuesta #1 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.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado ncoliv

  • PIC16
  • ***
  • Mensajes: 130
Re: ayuda 1307
« Respuesta #2 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

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: ayuda 1307
« Respuesta #3 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
.

Desconectado ncoliv

  • PIC16
  • ***
  • Mensajes: 130
Re: ayuda 1307
« Respuesta #4 en: 30 de Noviembre de 2008, 12:22:30 »
La alimentación esta bien, como puedo saber si estan qumados??

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: ayuda 1307
« Respuesta #5 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
.

Desconectado ncoliv

  • PIC16
  • ***
  • Mensajes: 130
Re: ayuda 1307
« Respuesta #6 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

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: ayuda 1307
« Respuesta #7 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
.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: ayuda 1307
« Respuesta #8 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
El papel lo aguanta todo

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: ayuda 1307
« Respuesta #9 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.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado ncoliv

  • PIC16
  • ***
  • Mensajes: 130
Re: ayuda 1307
« Respuesta #10 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

Desconectado ncoliv

  • PIC16
  • ***
  • Mensajes: 130
Re: ayuda 1307
« Respuesta #11 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

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: ayuda 1307
« Respuesta #12 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);
.

Desconectado ncoliv

  • PIC16
  • ***
  • Mensajes: 130
Re: ayuda 1307
« Respuesta #13 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 

Desconectado tithanae

  • PIC16
  • ***
  • Mensajes: 109
Re: ayuda 1307
« Respuesta #14 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