Autor Tema: ds1307 y getc()  (Leído 1919 veces)

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

Desconectado otix

  • PIC10
  • *
  • Mensajes: 4
ds1307 y getc()
« en: 26 de Agosto de 2006, 07:34:10 »
Buenas alguien seria tan amable de decirme pq si habilito
#use I2C(master, sda=PIN_c4, scl=PIN_c3,RESTART_WDT,slow) y le añado el forzado de hardware _force_HW.
el programilla no funciona.
simplemente estaba intentando adaptar un ejemplo de ccs a una libreria de ds1307 pero no veo pq no debe funcionar por forzar el hard del 16f877...lo he montado en proteus
gracias de antemano..   ufff.....esto de los comienzos
añado un zip del proteus
#include <16F877A.h>
#device  ICD=TRUE
#fuses  HS,NOWDT
#use delay(clock=20000000,RESTART_WDT)
#use rs232(baud=9600, BITS= 8, PARITY =N ,RESTART_WDT,  xmit=PIN_C6, rcv=PIN_C7,)

#include <ds1307.c>

/******************************************************************************/
/******************************************************************************/
int get_number()
{
char  first,second;
  do {
    first=getc();
  } while ((first<'0') || (first>'9'));
 // putc(first);
  first-='0';

  do {
    second=getc();
  } while (((second<'0') || (second>'9')) && (second!='\r'));
  //putc(second);

  if(second=='\r')
    return(first);
  else
    return((first*10)+(second-'0'));
}
/******************************************************************************/
/******************************************************************************/

void set_clock(){
   BYTE day, mth, year, dow, hour, min, sec ;

   printf("\r\nPress ENTER after 1 digit answers.");
   printf("\r\nYear 20: ");
   year=get_number();
   printf("\r\nMonth: ");
   mth=get_number();
   printf("\r\nDay: ");
   day=get_number();
   printf("\r\nWeekday 1-7: ");
   dow=get_number();
   printf("\r\nHour: ");
   hour=get_number();
   printf("\r\nMin: ");
   min=get_number();
   printf("\r\nSec: ");
   sec=get_number();
   printf("\r\n\n");
   setyear(year);
   setmonth(mth);
   setday(day);
   setdayofweek(dow);
   sethour(hour);
   setminute(min);
   setsecond(sec);
   printf("\r\n\n");
}
/******************************************************************************/
/******************************************************************************/





void main(void)
              {

 init_uhr();
 set_clock();


         while (1){
                  gettime();
                  printf(  "%02u:%02u:%02u  %02u:%02u:%02u\n\r", system_time_day,
                  system_time_month,system_time_year, system_time_hh,system_time_mm, system_time_ss);

                  delay_ms(1000);
                  }
                  }

/***********************************************************************************/
/*                                                                                 */
/* Funktionen zur Ansteuerung des DS1307 RealTimeClocks                            */
/* ----------------------------------------------------                            */
/*                                                                                 */
/* (C) 2003  Markus Willimann azsol GmbH                                           */
/*                                                                                 */
/* Version 1.0  4.08.2003                                                          */
/*                                                                                 */
/***********************************************************************************/
//#use I2C(master, sda=PIN_c4, scl=PIN_c3,force_HW,RESTART_WDT,slow)
#use I2C(master, sda=PIN_c4, scl=PIN_c3,RESTART_WDT,slow)
//********************** Definitionen ***************
#define DS1307_I2C_INPUT_ADDR           0xD0            // Adresse ueber die auf den DS1307 geschr. wird
#define DS1307_I2C_OUTPUT_ADDR          0xD1            // Adresse ueber die auf den DS1307 geschr. wird
//***************************************************
int  system_time_ss,system_time_mm,system_time_hh,system_time_dayofweek,
     system_time_day ,system_time_month,system_time_year;
//****************************** Funktionen ****************************************

/***********************************************************************************/
/* Fkt.   rtc_bcd_to_hex: wandelt BCE zu HEX Zahl um                               */
/*                                                                                 */
/***********************************************************************************/
char rtc_bcd_to_hex(char v)
{
  char n;

  n=v;
  n=n & 0xF0;
  n=n/16;
  v =v & 0x0F;
  n=n*10+v;
  return(n);
}

/***********************************************************************************/
/* Fkt.   rtc_hex_to_bcd: wandelt HEX zu BCD Zahl um                               */
/*                                                                                 */
/***********************************************************************************/
char rtc_hex_to_bcd(char v)
{
  char n;

  n=v;
  n=n/10;
  n=n*16;
  v =v % 10;
  n=n+v;
  return(n);
}

/***********************************************************************************/
/* Fkt.   write_rtc_ram: Schreibt ein Byte ueber I2C auf den DS1307                */
/*                                                                                 */
/***********************************************************************************/
char write_rtc_ram(char ad,char  d)
{
  d=rtc_hex_to_bcd(d);
  i2c_start();
  i2c_write(DS1307_I2C_INPUT_ADDR);
  i2c_write(ad);
  i2c_write(d);
  i2c_stop();
  delay_ms(11);
}

/***********************************************************************************/
/* Fkt.   read_rtc_ram: Liest ein Byte ueber I2C aus dem DS1307                    */
/*                                                                                 */
/***********************************************************************************/
char read_rtc_ram(char ad)
{
  char d;

  i2c_start();
  i2c_write(DS1307_I2C_INPUT_ADDR);
  i2c_write(ad);
  i2c_start();
  i2c_write(DS1307_I2C_OUTPUT_ADDR);
  d=i2c_read(0);
  i2c_stop();
  d=rtc_bcd_to_hex(d);
  return(d);
}

/***********************************************************************************/
/* Fkt.   gettime: Liest Sekunden, Minuten und Stunden ein                         */
/*                                                                                 */
/***********************************************************************************/
void gettime()
{
  system_time_ss        = read_rtc_ram(0);
  delay_us(5);
  system_time_mm        = read_rtc_ram(1);
  delay_us(5);
  system_time_hh        = read_rtc_ram(2);
  delay_us(5);
  system_time_dayofweek = read_rtc_ram(3);
  delay_us(5);
  system_time_day       = read_rtc_ram(4);
  delay_us(5);
  system_time_month     = read_rtc_ram(5);
  delay_us(5);
  system_time_year      = read_rtc_ram(6);

}

/***********************************************************************************/
/* Fkt.   init_uhr: Initialisiert den DS1307                                       */
/*        Achtung nach einem Stromausfall wird init_uhr() aufgerufen, da der DS1307*/
/*        Batterie gepuffer ist darf nicht alles geresettet werden!!               */
/***********************************************************************************/
void init_uhr()
{
   system_time_mm = read_rtc_ram(0);            // alten Minutenwert vor dem ueberschreiben Lesen
   write_rtc_ram(0x00,00);                      // CH=0
   write_rtc_ram(0,system_time_mm);             // alten Minutenwert wieder speichern
   system_time_hh = read_rtc_ram(2);            // alten Stundenwert vor dem ueberschreiben Lesen
   write_rtc_ram(0x02,00);                      // auf 24h Mode stellen
   write_rtc_ram(2,system_time_hh);             // alten Stundenwert wieder speichern
   write_rtc_ram(0x07,00);                      //OSC ON
}

/***********************************************************************************/
/* Fkt.   set-Funktionen: um alle Parameter zu schreiben.                          */
/*                                                                                 */
/***********************************************************************************/
void setsecond(char d)   {write_rtc_ram(0,d);}
void setminute(char d)   {write_rtc_ram(1,d);}
void sethour(char d)     {write_rtc_ram(2,d);}
void setdayofweek(char d){write_rtc_ram(3,d);}
void setday(char d)      {write_rtc_ram(4,d);}
void setmonth(char d)    {write_rtc_ram(5,d);}
void setyear(char d)     {write_rtc_ram(6,d);}

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: ds1307 y getc()
« Respuesta #1 en: 26 de Agosto de 2006, 08:04:15 »
Sin tener muy claro qué es lo que te puede estar pasando desearía hacerte un par de preguntas:

El Watch Dog sirve para resetar el PIC si se "cuelga", funciona de forma que si se desborda el Timer del Watch Dog provoca un reseteo del PIC, por lo que si está habilitado debe ser reiniciado periodicamente para evitar dicho desborde.

En tu programa veo que tando en el #use delay, en el #use rs232 como en el #use I2C usas la opción RESTART_WDT para evitar que tando en los delay_us ó delay_ms como en los getc o los i2c_read pueda desbordarse el Watch Dog mientras se está o esperando el tiempo del delay o esperando recibir un caracter por la RS232 o el I2C. Y sin embargo en los #fuses veo que explícitamente declaras NOWDT, o sea que deshabilitas el Watch Dog Timer.

¿Por qué? No se si será esto motivo de interferencia con otras cosas que ocurran. Pero sospecho que si se usa el WDT entonces debe usarse con todas sus consecuencias, y conocimiento, y si no se usa pues deberías quitar toda referencia a él salvo el NOWDT de los #fuses.

Veo también que activas el ICD, In Circuit Debugger. ¿Tienes el hardware correspondiente para usar el ICD? Creo que dicha opción es sólo compatible con cierto hardware que soporta el PIC y dicha función.

Después podremos ver mas cosas ...

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado otix

  • PIC10
  • *
  • Mensajes: 4
Re: ds1307 y getc()
« Respuesta #2 en: 26 de Agosto de 2006, 13:59:21 »
Hola Redpic gracias por interesarte en dar respuesta a mi pregunta.Siguiendo tu consejo he suprimido el NOWDT de los fuses pero no ha resultado.
El icd=true estaba por que estube haciendo pruebas con el ICD-1 aun suprimiendo la linea no funciona.
Lo que me sorprende es que si fuerzas un hard que el16f877 tiene, deje de funcionar y si por el contrario lo dejas en soft funcione
si fuera por interrupciones afectaria las dos opciones ... no lo entiendo .
gracias de antemano

Desconectado otix

  • PIC10
  • *
  • Mensajes: 4
Re: ds1307 y getc()
« Respuesta #3 en: 27 de Agosto de 2006, 15:28:05 »
Buenas .....pues ya encontre la solucion.
Lo primero es pedirles disculpas ya que este tema ya se habia tratado en el foro
!!!!!!!Tema: Problemas con #use i2c y #use rs232 !!!!!!!
el problema se da tan solo en la simulacion no en la realidad