TODOPIC
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?
03 de Septiembre de 2010, 05:16:45

Ingresar con nombre de usuario, contraseña y duración de la sesión
Buscar:     Búsqueda Avanzada
257111 Mensajes en 28437 Temas por 27916 Usuarios
Último usuario: zororyuzaki
* Inicio Ayuda Buscar Calendario Ingresar Registrarse
Buscar en TodoPIC
+  TODOPIC
|-+  Microcontroladores PIC
| |-+  * PROYECTOS * (Moderadores: J1M, jfh900, MGLSOFT, Modulay, Sasián, LABmouse)
| | |-+  Real Time Clock o el DS1307 desatado
0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] 2 3 4 5 6 7 8 Marcar como favorito Imprimir
Autor Tema: Real Time Clock o el DS1307 desatado  (Leído 22449 veces)
RedPic
Administrador
DsPIC33
*******
Desconectado Desconectado

Sexo: Masculino
Tibet Tibet

Mensajes: 4876



WWW
« : 05 de Agosto de 2006, 04:40:49 »

Circuito auxiliar de Reloj en Tiempo Real mediante un DS1307
 
Descripción:

Nuestros PIC's no saben en qué día y hora viven. Perdidos en el no-tiempo, la realidad analógica o digital es un continuo donde las fracciones de tiempo superior a algunos milisegundos son entes abstractos e inasibles. Anclados en patrones de frecuencia decimales que no son divisibles por sus primos binarios, esclavos del redondeo, siempre les sobran o les faltan unos microsegundos para dar el Segundo Perfecto. Como Reloj en Tiempo Real un PIC abandonado a su cuarzo y a sus divisores, preescalers y postescalers, simplemente no da la talla.
 
Y ahí es donde entran los amables señores de Dallas Maxim y su cucaracha octópoda clockeadora: el DS1307, intitulada por ellos mismos como un "64 x 8, Serial, I2C Real-Time Clock" O sea un corazón de reloj con alguna RAM adicional (no volátil ya que es asistida por una batería de Litio que la mantiene a flote mientras no le falte el fuelle de los voltios).
 
Este proyecto consiste esencialmente en poner en santa compaña a nuestro PIC con su Reloj colgando del BUS RRBOARD2 (compatible), aprovechando que ambos hablan en I2C, por lo que es de esperar que no tengamos grandes problemas para llevarlo a buen puerto.
 
Para este proyecto he tirado, además de la información pertinente ofrecida por los amables señores de Dallas Maxim de las siguientes fuentes de información:

El buscador del Foro Todopic poniendo DS1307 en la casilla de búsqueda oportuna. (Algunos cientos de referencias pacientemente leídas y digeridas).

El artículo Another DS1307 Driver publicado en el Foro oficial de CCS C, cuya paternidad corresponde a  un tal Phil, basado según dice él mismo en el trabajo de un tal Tullos.

El articulo DS1307 RTC and 24LC256 EEPROM on the same i2c bus problem publicado en el mismo foro que el anterior pero esta vez realizado por unos tales Birumher y Highwind en un mano a mano digno de un buen par de toreros.

Y por último el artículo DS1307 routines que para no ser menos también procede del Foro CCS C y de donde he sacado la idea de habilitar y/o deshabilitar las interrupciones.

Todo esto adobado por supuesto con San Google Bendito donde escribiendo PIC y DS1307 aparece mas información de la que estoy dispuesto a digerir.
 
Entre esta información y mi propio jugo de cerebro, destilado en estos últimos días, tengo el gusto de presentaros completo este pequeño ejercicio de integración temporal de un PIC y sus circunstancias.
 
Implementación:
 
La implementación consiste en posibilitar la comunicación I2C entre la RRBOARD2 y el DS1307 y explicar lo fundamental de este chip, mostrándoos a continuación qué podemos hacer con él y qué no (visto desde el punto de vista de dentro de un PIC claro está, ya que es de cajón y no pienso comentar por ejemplo que tragarse un DS1307 sin quitarle las puntiagudas patillas puede ser incompatible con la vida, tal y como la conocemos).
 
No pienso repetir palabra por palabra, como un vulgar loro de bar portuario, lo que ya dice de forma meridianamente clara el Datasheet del DS1307, así que tras poneros el Diagrama de Bloques del mismo (extraído de dicho datasheet) paso a comentar algunas circunstancias interesantes a tener en cuenta.
 

 
1º.- El cristal de cuarzo ha de ser de 32.768 Khz Arcano designio que tiene que ver con que 2^15 = 32.768 por lo que esa frecuencia es divisible de forma exacta binariamente para generar 1000, o sea nuestro segundo perfecto.
 
2º.- La alimentación es doble. Por un lado el VCC de nuestro circuito normal, el del PIC, y por otro una Batería de Litio que va a permitir que el reloj siga su normal funcionamiento aún cuando apaguemos el PIC. (Esta batería sirve también para mantener viva la NVRAM adicional de que disponemos) El mismo DS1307 se encarga de realizar la conmutación entre una y otra por lo que no tenemos que tener en cuenta esta circunstancia y podemos olvidarnos de ella (salvo la de cambiar la pila cuando se agote)
 

 
3º.- El DS1307 tiene un pin de salida que debidamente habilitado nos ofrece una onda cuadrada con las frecuencias que puedes ver en la tabla superior. Esta salida es a colector abierto por lo que es necesario, si la queremos utilizar para inyectarla en cualquier otro circuito, colocarle una resistencia pull-up de unos 10 Kohm a VCC.

Ten en cuenta que si nuestro DS1307 va a pasar grandes periodos de tiempo alimentándose solo de la batería el tener esta opción de salida habilitada consume cientos de veces mas intensidad que sin ella por lo que podemos dejar la batería tiesa en muy poco tiempo. Si no es necesario es preferible deshabilitar esta opción (mas adelante veremos cómo hacerlo).
 

 
4º.- En la tabla superior podéis ver la estructura de la NVRAM, donde se mezclan tanto los registros de configuración, como los de salvaguarda de la fecha y hora del dispositivo, como asimismo los bancos de RAM de libre disposición para el usuario.

En esta tabla tener en cuenta que el Bit 7 de la dirección 0x00 hay que colocarla a 0 para que todo funcione. Es el Enable general del dispositivo.
 

 
5º.- El byte alojado en la dirección 0x07 es el Control Register que nos permite configurar la función del pin de salida según los siguientes condicionantes:

El bit 4, SQWE, habilita o deshabilita la función de salida externa del pin Out.

El bit 7, OUT, establece el estado del pin de salida cuando SQWE está deshabilitado. Si OUT es 1 y SQWE es 0 entonces el pin de salida está en alto indefinidamente, si OUT es 0 y SQWE es 0 entonces el pin de salida está por el contrario en bajo indefinidamente.

Los bits 0 y 1 sirven para seleccionar la frecuencia de salida cuando SQWE está en alto según la tabla expuesta en 2º.

Esquema: 

Este el circuito propuesto por el fabricante como típico para su buen funcionamiento. Es el que vamos a implementar exactamente hasta el último detalle.
 

 
Del pinout nada que añadir:


 
Y este es el esquema definitivo que vamos a construir, en el que podemos destacar algunos detalles:
 
1º.- La comunicación con la RRBOARD2 la realizamos mediante nuestro buen amigo el conector CON-ML10 para cable plano de 10 hilos (alimentación y un puerto completo de 8 bits)
 
2º.- JP1-PB y JP3-PC permiten seleccionar la conexión de los SDA y SCL del I2C a los pines 0..1 ó 3..4 del puerto al que estén conectados (recordad de la RRBOARD2 está diseñada para las familias 18F4550 y 16F877 y el I2C lo implementa la primera en los pines RB0 y RB1 y la segunda en los RC3 y RC4) 
 
3º.- JP2-OUT Permite conectar o desconectar el pin Out del DS1307 al pin Rx3 del puerto de la RRBOARD2 (Muy útil para usarlo con la Interrupción Externa 2 del 18F4550)
 
4º.- Dependiendo de dónde conectemos nuestro circuito en la RRBOARD2 podemos necesitar o no las resistencias Pull-Up imprescindibles para el bus I2C. Si lo conectamos al PORTB tenemos disponibles la internas del PIC, en cualquier otro caso podemos hacer uso del jumper JP3-PU para conectar dichas resistencias Pull-Up a VCC.
 
5º.- Añadimos ademas el jumper OUT para poder utilizar externamente la señal de onda cuadrada del pin Out del DS1307.
 
 

Circuito impreso:
 


Fotografías:
 
Y aquí el muchacho en plenitud de facultades:
 
 



Funcionando con el software de Test:
 
 

Recursos:
 
Descargar Datasheet del

DS1307 (PDF 875 Kb)
 
Descargar Librería Driver para CCS C DS1307
 
Descargar Programa de Test rtc.c
 
Descargar Esquema y PCB para Eagle

 Mr. Green  rebotando  Mr. Green

« Última modificación: 31 de Marzo de 2009, 05:25:07 por RedPic » En línea

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania
RedPic
Administrador
DsPIC33
*******
Desconectado Desconectado

Sexo: Masculino
Tibet Tibet

Mensajes: 4876



WWW
« Respuesta #1 : 05 de Agosto de 2006, 04:41:16 »

Software:
 
Primero y antes que nada la librería Driver CCS C para el DS1307. Como comenté mas arriba esta librería es un gazpacho entre las varias que he encontrado por esos mundos de Dios fundamentalmente las expuestas en la primera parte de este post.
 
Las cosas que yo personalmente he introducido en este driver son:
 
Parámetros pasados a ds1307_init() para configurar en el inicio la función OUT del DS1307.
 
La funcionalidad disable_interrupts(global) / enable_interrupts(global) en cada una de las funciones definidas dependiendo del #define use_interrups en el programa principal.
 
Función ds1307_get_day_of_week() que me devuelve el string con el nombre del día de la semana en la fecha actual. (totalmente nueva y que no he encontrado por ahí).
 
He añadido las funciones necesarias para escribir y leer todos los registros del DS1307 ds1307_read_nvram_byte() y ds1307_write_nvram_byte()

Código
GeSHi (c):
  1. ///////////////////////////////////////////////////////////////////////////////////////
  2. ///                               DS1307.C                                           ///
  3. ///                     Driver for Real Time Clock                                   ///
  4. ///                     modified by Redpic 08/2006                                   ///
  5. ///                  http://picmania.garcia-cuervo.com                               ///
  6. ///                                                                                  ///
  7. /// void ds1307_init(val)                                                            ///
  8. ///                  - Enable oscillator without clearing the seconds register       ///
  9. ///                    used when PIC loses power and DS1307 run from 3V BAT          ///
  10. ///                  - Config Control Register with next parameters:                 ///
  11. ///                     DS1307_ALL_DISABLED          All disabled                    ///
  12. ///                     DS1307_OUT_ON_DISABLED_HIHG  Out to Hight on Disable Out     ///
  13. ///                     DS1307_OUT_ENABLED           Out Enabled                     ///
  14. ///                     DS1307_OUT_1_HZ              Freq. Out to 1 Hz               ///
  15. ///                     DS1307_OUT_4_KHZ             Freq. Out to 4.096 Khz          ///
  16. ///                     DS1307_OUT_8_KHZ             Freq. Out to 8.192 Khz          ///
  17. ///                     DS1307_OUT_32_KHZ            Freq. Out to 32.768 Khz         ///
  18. ///                                                                                  ///
  19. ///                     Example init:                                                ///
  20. ///                     ds1307_init(DS1307_ALL_DISABLED);                            ///
  21. ///                     ds1307_init(DS1307_OUT_ENABLED | DS1307_OUT_1_HZ);           ///
  22. ///                                                                                  ///
  23. /// void ds1307_set_date_time(day,mth,year,dow,hour,min,sec) - Set the date/time     ///
  24. ///                                                                                  ///
  25. /// void ds1307_get_date(day,mth,year,dow)                   - Get the date          ///
  26. ///                                                                                  ///
  27. /// void ds1307_get_time(hr,min,sec)                         - Get the time          ///
  28. ///                                                                                  ///
  29. /// char ds1307_read_nvram_byte(char addr)                   - Read byte in address  ///
  30. ///                                                                                  ///
  31. /// void ds1307_write_nvram_byte(char addr, char value)      - Write byte in address ///
  32. ///                                                                                  ///
  33. /// void ds1307_get_day_of_week(char* ptr)                   - Get string Day Of Week///
  34. ///                                                                                  ///
  35. /// If defined USE_INTERRUPTS all functions disable Global Interrupts on starts and  ///
  36. ///                           enable Global on ends else usar can do it hiself       ///
  37. ///                                                                                  ///
  38. ///////////////////////////////////////////////////////////////////////////////////////
  39.  
  40. #ifndef RTC_SDA
  41. #define RTC_SDA  PIN_B0
  42. #define RTC_SCL  PIN_B1
  43. #endif
  44.  
  45. #use i2c(master, sda=RTC_SDA, scl=RTC_SCL)
  46.  
  47. #define DS1307_ALL_DISABLED         0b00000000 // All disabled
  48. #define DS1307_OUT_ON_DISABLED_HIHG 0b10000000 // Out to Hight on Disable Out
  49. #define DS1307_OUT_ENABLED          0b00010000 // Out Enabled
  50. #define DS1307_OUT_1_HZ             0b00000000 // Freq. Out to 1 Hz
  51. #define DS1307_OUT_4_KHZ            0b00000001 // Freq. Out to 4.096 Khz
  52. #define DS1307_OUT_8_KHZ            0b00000010 // Freq. Out to 8.192 Khz
  53. #define DS1307_OUT_32_KHZ           0b00000011 // Freq. Out to 32.768 Khz
  54.  
  55. #define Start_user_address_nvram    0x08
  56. #define End_user_address_nvram      0x3f
  57.  
  58. char days_of_week[7][11]={"Lunes\0","Martes\0","Miércoles\0","Jueves\0","Viernes\0","Sábado\0","Domingo\0"};
  59.  
  60. byte ds1307_bin2bcd(byte binary_value);
  61. byte ds1307_bcd2bin(byte bcd_value);
  62.  
  63. void ds1307_init(int val){
  64.  
  65.   byte seconds = 0;
  66.  
  67. #ifndef USE_INTERRUPTS
  68.   disable_interrupts(global);
  69. #endif
  70.  
  71.   i2c_start();
  72.   i2c_write(0xD0);
  73.   i2c_write(0x00);
  74.   i2c_start();
  75.   i2c_write(0xD1);
  76.   seconds = ds1307_bcd2bin(i2c_read(0));
  77.   i2c_stop();
  78.   seconds &= 0x7F;
  79.  
  80.   delay_us(3);
  81.  
  82.   i2c_start();
  83.   i2c_write(0xD0);
  84.   i2c_write(0x00);
  85.   i2c_write(ds1307_bin2bcd(seconds));
  86.   i2c_start();
  87.   i2c_write(0xD0);
  88.   i2c_write(0x07);
  89.   i2c_write(val);
  90.   i2c_stop();
  91.  
  92. #ifndef USE_INTERRUPTS
  93.   enable_interrupts(global);
  94. #endif
  95.  
  96. }
  97.  
  98. void ds1307_set_date_time(byte day, byte mth, byte year, byte dow, byte hr, byte min, byte sec){
  99.  
  100. #ifndef USE_INTERRUPTS
  101.   disable_interrupts(global);
  102. #endif
  103.  
  104.  sec &= 0x7F;
  105.  hr &= 0x3F;
  106.  
  107.  i2c_start();
  108.  i2c_write(0xD0);
  109.  i2c_write(0x00);
  110.  i2c_write(ds1307_bin2bcd(sec));
  111.  i2c_write(ds1307_bin2bcd(min));
  112.  i2c_write(ds1307_bin2bcd(hr));
  113.  i2c_write(ds1307_bin2bcd(dow));
  114.  i2c_write(ds1307_bin2bcd(day));
  115.  i2c_write(ds1307_bin2bcd(mth));
  116.  i2c_write(ds1307_bin2bcd(year));
  117.  i2c_stop();
  118.  
  119. #ifndef USE_INTERRUPTS
  120.   enable_interrupts(global);
  121. #endif
  122.  
  123. }
  124.  
  125. void ds1307_get_date(byte &day, byte &mth, byte &year, byte &dow){
  126.  
  127. #ifndef USE_INTERRUPTS
  128.   disable_interrupts(global);
  129. #endif
  130.  
  131.  i2c_start();
  132.  i2c_write(0xD0);
  133.  i2c_write(0x03);
  134.  i2c_start();
  135.  i2c_write(0xD1);
  136.  dow  = ds1307_bcd2bin(i2c_read() & 0x7f);
  137.  day  = ds1307_bcd2bin(i2c_read() & 0x3f);
  138.  mth  = ds1307_bcd2bin(i2c_read() & 0x1f);
  139.  year = ds1307_bcd2bin(i2c_read(0));
  140.  i2c_stop();
  141.  
  142. #ifndef USE_INTERRUPTS
  143.   enable_interrupts(global);
  144. #endif
  145.  
  146. }
  147.  
  148. void ds1307_get_time(byte &hr, byte &min, byte &sec){
  149.  
  150. #ifndef USE_INTERRUPTS
  151.   disable_interrupts(global);
  152. #endif
  153.  
  154.  i2c_start();
  155.  i2c_write(0xD0);
  156.  i2c_write(0x00);
  157.  i2c_start();
  158.  i2c_write(0xD1);
  159.  sec = ds1307_bcd2bin(i2c_read() & 0x7f);
  160.  min = ds1307_bcd2bin(i2c_read() & 0x7f);
  161.  hr  = ds1307_bcd2bin(i2c_read(0) & 0x3f);
  162.  i2c_stop();
  163.  
  164. #ifndef USE_INTERRUPTS
  165.   enable_interrupts(global);
  166. #endif
  167.  
  168. }
  169.  
  170.  
  171. char ds1307_read_nvram_byte(char addr){
  172.  
  173.   char retval;
  174.  
  175. #ifndef USE_INTERRUPTS
  176.   disable_interrupts(global);
  177. #endif
  178.  
  179.   i2c_start();
  180.   i2c_write(0xD0);
  181.   i2c_write(addr);
  182.  
  183.   i2c_start();
  184.   i2c_write(0xD1);
  185.   retval = i2c_read(0);
  186.   i2c_stop();
  187.  
  188.   return(retval);
  189.  
  190. #ifndef USE_INTERRUPTS
  191.   enable_interrupts(global);
  192. #endif
  193.  
  194. }
  195.  
  196. void ds1307_write_nvram_byte(char addr, char value){
  197.  
  198. #ifndef USE_INTERRUPTS
  199.   disable_interrupts(global);
  200. #endif
  201.  
  202.   i2c_start();
  203.   i2c_write(0xD0);
  204.   i2c_write(addr);
  205.   i2c_write(value);
  206.   i2c_stop();
  207.  
  208. #ifndef USE_INTERRUPTS
  209.   enable_interrupts(global);
  210. #endif
  211.  
  212. }
  213.  
  214. void ds1307_get_day_of_week(char* ptr){
  215.  
  216.   byte lday;
  217.   byte lmonth;
  218.   byte lyr;
  219.   byte ldow;
  220.   ds1307_get_date(lday,lmonth,lyr,ldow);
  221.   sprintf(ptr,"%s",days_of_week[ldow]);
  222. }
  223.  
  224. ///////////////////////////////////////////////////////////////////////////////
  225.  
  226. byte ds1307_bin2bcd(byte binary_value){
  227.  
  228.  byte temp;
  229.  byte retval;
  230.  
  231.  temp = binary_value;
  232.  retval = 0;
  233.  while(1){
  234.    if(temp >= 10){
  235.      temp -= 10;
  236.      retval += 0x10;
  237.    }else{
  238.      retval += temp;
  239.      break;
  240.    }
  241.  }
  242.  return(retval);
  243. }
  244.  
  245. byte ds1307_bcd2bin(byte bcd_value){
  246.  
  247.  byte temp;
  248.  
  249.  temp = bcd_value;
  250.  temp >>= 1;
  251.  temp &= 0x78;
  252.  return(temp + (temp >> 2) + (bcd_value & 0x0f));
  253. }
  254.  
  255. ///////////////////////////////////////////////////////////////////////////////
  256.  

Y por último el programa de Test de todo esto.
 
Al inicio  podéis ver la inclusión y definición necesaria para el uso de la librería _ds1307.c.
 
He implementado la Interrupción Externa 2 del 18F4550 de la RRBOARD2 para que baile al son del OUT del DS1307, detectando los flancos alternativos de la onda cuadrada que me emite y encendiendo y apagando el LED conectado a PIN_RE0.
 
Antes de entrar en el bucle infinito While(true) del main() realiza un completo chequeo y muestreo de TODAS las funciones disponibles en el Driver.
 
He añadido también un mini-menú que permite activar o desactivar la monitorización de la fecha y la hora mediante el canal RS-232.
 
En el fuente siguiente hay una función inicial de puesta en hora del DS1307 que posteriormente he comentado, solo la uso una vez y después con el DS1307 perfectamente sincronizado no es necesario utilizarla más.
 
Código
GeSHi (c):
  1. // Real Time Clock & NVRAM
  2. // Hardware DS1307 of Dallas Maxim
  3. // With interface I2C
  4.  
  5. #include <18f4550.h>
  6. #fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN
  7. #use delay(clock=20000000)
  8. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
  9.  
  10. // Libreria DS1307.c //////////////////////////////////////////////////////////
  11.  
  12. #define RTC_SDA  PIN_B0
  13. #define RTC_SCL  PIN_B1
  14.  
  15. #define USE_INTERRUPTS 1
  16.  
  17. #include <_ds1307.c>
  18.  
  19. ///////////////////////////////////////////////////////////////////////////////
  20.  
  21. const char Version[]="1.0.D\0";
  22.  
  23. int1 flanco=0;
  24. int1 dump,kdump;
  25. int  n,i=0x00;
  26. char c=0x00;
  27. char rec=0x00;
  28.  
  29. byte sec;
  30. byte min;
  31. byte hrs;
  32. byte day;
  33. byte month;
  34. byte yr;
  35. byte dow;
  36. char sdow[11];
  37.  
  38. // INTERRUPCION por RECEPCION SERIE -------------------------------------------
  39.  
  40. #int_rda
  41. void serial_isr() {
  42.  
  43.   rec=0x00;
  44.   if(kbhit()){
  45.     rec=getc();
  46.     if(rec=='o'){ dump=1; }
  47.     if(rec=='f'){ dump=0; }
  48.     rec=0x00;
  49.   }
  50. }
  51.  
  52. // INTERRUPCION por EXT2 Clock Out --------------------------------------------
  53.  
  54. #int_ext2
  55. ext2_handler() {
  56.  
  57.   if(flanco==1){
  58.      ext_int_edge(2,H_TO_L);
  59.      output_high(PIN_E0);
  60.   }else{
  61.      ext_int_edge(2,L_TO_H);
  62.      output_low(PIN_E0);
  63.   }
  64.   ++flanco;
  65. }
  66.  
  67. //-----------------------------------------------------------------------------
  68.  
  69. void flash_porte(void){
  70.  
  71.   for(i=0;i<3;i++){
  72.      output_e(0x07);
  73.      delay_ms(75);
  74.      output_e(0x00);
  75.      delay_ms(75);
  76.   }
  77. }
  78.  
  79. void lee_y_transmite_date_and_time(void){
  80.  
  81.   ds1307_get_day_of_week((char*) sdow);
  82.   ds1307_get_date(day,month,yr,dow);
  83.   ds1307_get_time(hrs,min,sec);
  84.   printf("\f\%s \%02d/\%02d/\%02d ",sdow,day,month,yr);
  85.   printf("\%02d:\%02d:\%02d\r\n", hrs,min,sec);
  86. }
  87.  
  88. void main() {
  89.  
  90.   disable_interrupts(global);
  91.   disable_interrupts(int_timer1);
  92.   disable_interrupts(int_rda);
  93.   disable_interrupts(int_ext);
  94.   disable_interrupts(int_ext1);
  95.   disable_interrupts(int_ext2);
  96.   setup_adc_ports(NO_ANALOGS);
  97.   setup_adc(ADC_OFF);
  98.   setup_spi(FALSE);
  99.   setup_psp(PSP_DISABLED);
  100.   setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
  101.   setup_timer_0(RTCC_OFF);
  102.   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
  103.   setup_timer_2(T2_DISABLED,0,1);
  104.   setup_timer_3(T3_DISABLED);
  105.   setup_comparator(NC_NC_NC_NC);
  106.   setup_vref(FALSE);
  107.   port_b_pullups(FALSE);
  108.   set_tris_b(0b00000111);
  109.   set_tris_e(0b00010000);
  110.   output_e(0x00);
  111.   set_tris_c(0b10000000);
  112.  
  113.   delay_ms(500);
  114.   printf("\r\n");
  115.   printf("[RRBOARD2] Real Time Clock version %s\r\n",version);
  116.   printf("based on DS1307 Dallas Maxim Hardware\r\n\n");
  117.   printf("Available RS232 commands:\r\n");
  118.   printf("  [o] Dump Date & Time ON\r\n");
  119.   printf("  [f] Dump Date & Time OFF\r\n\n");
  120.   flash_porte();
  121.  
  122.   ext_int_edge(2,H_TO_L);
  123.   flanco=0;
  124.  
  125.   enable_interrupts(int_ext2);
  126.   enable_interrupts(int_rda);
  127.   enable_interrupts(global);
  128.  
  129.   // Inicializa DS1307
  130.   printf("Inicializando DS1307 ...\r\n\n");
  131.   ds1307_init(DS1307_OUT_ON_DISABLED_HIHG | DS1307_OUT_ENABLED | DS1307_OUT_1_HZ);
  132.  
  133.   // Set date for -> 5 Agosto 2006 Viernes
  134.   // Set time for -> 02:50:00
  135.   // printf("Set Date & Time to ...\r\n");
  136.   // ds1307_set_date_time(5,8,6,5,2,50,00);
  137.  
  138.   // Lee Fecha y Hora actual y transmite
  139.  
  140.   printf("Fecha y Hora actual en el DS1307\r\n\n");
  141.   lee_y_transmite_date_and_time();
  142.   printf("\r\n\n");
  143.  
  144.   // Test de RAM -> primero Write, segundo Read
  145.   printf("Test de la NVRAM interna (Write and read) ...\r\n\n");
  146.   for(i=Start_user_address_nvram;i<end_user_address_nvram+1;i++){
  147.      ds1307_write_nvram_byte(i,i);
  148.   }
  149.   n=0;
  150.   for(i=Start_user_address_nvram;i<end_user_address_nvram+1;i++){
  151.      c=ds1307_read_nvram_byte(i);
  152.      printf("%X ",c);
  153.      if(++n==0x0f){
  154.         n=0;
  155.         printf("\r\n");
  156.      }
  157.   }
  158.   printf("\r\n");
  159.  
  160.   dump = 0;
  161.   kdump= 1;
  162.  
  163.   do{
  164.  
  165.      if(dump==1){
  166.         if((dump!=kdump)&&dump==1){
  167.            printf("Set Dump ON\r\n\n");
  168.            kdump=dump;
  169.         }
  170.         delay_ms(1000);
  171.         lee_y_transmite_date_and_time();
  172.      }else{
  173.         if((dump!=kdump)&&dump==0){
  174.            printf("\r\nSet Dump OFF\r\n\n");
  175.            kdump=dump;
  176.         }
  177.      }
  178.   } while (TRUE);
  179. }
  180.  

« Última modificación: 05 de Agosto de 2006, 04:49:07 por RedPic » En línea

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania
BrunoF
Administrador
DsPIC30
*******
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 2849



WWW
« Respuesta #2 : 05 de Agosto de 2006, 04:51:51 »

Hola Diego. ¡Excelente trabajo!
Justamente ahora me iba a poner a darles una aplicacion a 2 HT1380 que tengo tirados. Veo que son muy similaresm, aunque los HT1380 no tienen ni para conectarles bateria de respaldo ni interrupciones.
Pero bueno...quise barato...y eso es lo que me dieron.
Voy a ver si tus rutinas sirven para el HT1380 ya que me vendrian bien, tengo ganas de hacer mi segundo programa en C.
Saludos.
En línea

Cálculo al azar

Sumergido con:
Software(ASM) del uP MOS 6502 del Ordenador con PIC
jfh900
Moderador Local
DsPIC30
*****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 3328



« Respuesta #3 : 05 de Agosto de 2006, 05:17:14 »

Diego una curiosidad, con que haces la rotulación de las fotos que te queda tan bien.

Un saludo
En línea

* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca

Desde España Jesús
RedPic
Administrador
DsPIC33
*******
Desconectado Desconectado

Sexo: Masculino
Tibet Tibet

Mensajes: 4876



WWW
« Respuesta #4 : 05 de Agosto de 2006, 05:28:14 »

Jesús:

Edito con una herramienta al alcance de todos: El MS Paint del Güindous

En línea

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania
jfh900
Moderador Local
DsPIC30
*****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 3328



« Respuesta #5 : 05 de Agosto de 2006, 06:21:00 »

Joer Diego, no dejas de sorprenderme  lol

Un saludo
En línea

* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca

Desde España Jesús
Nocturno
Administrador
DsPIC33
*******
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 12825



WWW
« Respuesta #6 : 06 de Agosto de 2006, 03:25:15 »

Te habrás quedado agusto después de semejante parto, eh.
Enhorabuena Diego. Adoptaré alguna cosilla para la Wiki-PIC con tu permiso  Razz
En línea

Un saludo desde Sevilla, España.
Visita MicroPIC                                                                                        ɔ!doɹɔ!ɯ ɐʇ!s!ʌ
LordLafebre
Giovanni Lafebre
Moderador Global
DsPIC30
*****
Desconectado Desconectado

Sexo: Masculino
Ecuador Ecuador

Mensajes: 3524


Micros y micros


WWW
« Respuesta #7 : 06 de Agosto de 2006, 03:32:45 »

Impecable, como siempre...  rebotando rebotando rebotando
En línea

   -  

Nuevo local de venta de dispositivos electrónicos, soporte profesional y estudiantil, visítanos en Juan Jaramillo 1-150 y Manuel Vega. Telf: 4036038 - Cel 084278683 (Cuenca - Ecuador)

http://www.freewebs.com/glafebre
http://micros.mforos.com/
BrunoF
Administrador
DsPIC30
*******
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 2849



WWW
« Respuesta #8 : 06 de Agosto de 2006, 02:58:47 »

Redpic:
Estoy haciendo un proyecto con un HT1380. Sus registros son bastantes parecidos(excepto el registro CONTROL).
¿Tenes idea de cómo hacer para modificar el selector de 12/24 horas sin modificar la hora? Por lo que leí en el datasheet es imposible, ya que al escribir el bit 7, hay que escribir los otros bits restantes, lo que afectaría la hora.
Por lo tanto, ¿la única opción que queda es leer la hora del STK, guardarla y volver a escribir la hora actual seteando el bit 12/24 a gusto recien ahí?

Saludos y gracias.
En línea

Cálculo al azar

Sumergido con:
Software(ASM) del uP MOS 6502 del Ordenador con PIC
RedPic
Administrador
DsPIC33
*******
Desconectado Desconectado

Sexo: Masculino
Tibet Tibet

Mensajes: 4876



WWW
« Respuesta #9 : 06 de Agosto de 2006, 03:17:41 »

Exacto Bruno.

Si te fijas al DS1307 le pasa lo mismo. El bit de control 12/24 horas está en el registro 02H que es el que guarda también la hora actual.

Asi que para cambiar el modo 12/24 habría que leer el registro completo, cambiar el bit y volver a escribir el byte del registro.

Como es el de la Hora completa no debe haber ningún problema salvo una única situación:

que el cambio se produzca algunos microsegundos antes de un cambio de hora, ya que entonces podría perder una hora completa. Leída la anterior, incrementada en el DS1307 al seguir computado el tiempo real, que se perdería al volver a poner la anterior por el cambio que hemos realizado entretanto.

Si colocamos a nuestro programa una salvaguarda para cambiar de modo como podría ser que esperase a que el segundo estuviese entre 0 y 58 para realizar el cambio sin interferir en ningún cambio de hora no habría ningún tipo de problema.

Un saludo.

 
En línea

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania
RedPic
Administrador
DsPIC33
*******
Desconectado Desconectado

Sexo: Masculino
Tibet Tibet

Mensajes: 4876



WWW
« Respuesta #10 : 06 de Agosto de 2006, 03:24:15 »

Te habrás quedado agusto después de semejante parto, eh.
Enhorabuena Diego. Adoptaré alguna cosilla para la Wiki-PIC con tu permiso  Razz

La verdad, Manolo, es que sí. Intento ponerlo todo tan claro, tan explicado, con tantos detalles, tan tan tan ... que termino exhausto y con ganas de terminar como sea, empiezo la novela con ganas, energía e ilusión y la completo totalmente derrotado y preguntandome si sirve para algo y no estoy simplemente haciendo el idiota ...  Mr. Green

(mi esposa lo tiene muy claro y me lo dice expresamente)

P.D. Adopta y adapta lo que te de la gana. Lo mio es tuyo.
 
En línea

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania
BrunoF
Administrador
DsPIC30
*******
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 2849



WWW
« Respuesta #11 : 06 de Agosto de 2006, 03:46:31 »

Ok Diego. ¡Gracias!
Es una lastima tener que incluir en el programa que contemple cuándo no y cuándo si cambiar el modo...
Pero no queda otra...la excepción que comentaste era mi mayor temor.
Entonces lo mismo pasará con el bendito CH...aunque en caso de ocurrir la excepción, no sería tan grave.
Saludos y gracias.
En línea

Cálculo al azar

Sumergido con:
Software(ASM) del uP MOS 6502 del Ordenador con PIC
Marioguillote
Moderadores
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 1664



WWW
« Respuesta #12 : 07 de Agosto de 2006, 12:51:21 »


 ........    y la completo totalmente derrotado y preguntandome si sirve para algo y no estoy simplemente haciendo el
idiota ... 


Ojalá muchos más tuviéramos la décima parte del don de "saber", "saber dar" y "saber dar sin mirar a quién".
Celebro ese "don" que tenés, amigo RedPic.

Gracias y Saludos a todos.

Mario
En línea

100% Oligarca - Actualmente con Amicus
RaDoN
Moderadores
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 1338



« Respuesta #13 : 07 de Agosto de 2006, 02:24:04 »

Que tio jeje!! Y toma... y dale !! No para, muy buen ... no se como llamerle (clase, articulo), ¡¡eres una máquina didactica!! Wink
En línea

Si juegas contra el mejor, pierdes como los demás.
Y@el
Colaborador
PIC18
*****
Desconectado Desconectado

Sexo: Masculino
Peru Peru

Mensajes: 413



« Respuesta #14 : 08 de Agosto de 2006, 12:11:26 »

Yo creo que clase seria mejor...

Y claro con semejante maestro.

Gracias por la paciencia para comentar cada dibujo....


Yoel
En línea
pikman
Moderadores
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 656


Systemas MicroInformaticos


« Respuesta #15 : 08 de Agosto de 2006, 02:47:53 »

Diego, vayan mis felicitaciones por tu trabajo, mas que didactico lo tuyo, impecable, hace años que utilizo el ds1307 es una exelente opcion, nunca CCS creo libreria para este chip, aunque si para el ds1302, bueno que mas puedo decir...........esta todo dicho.

saludos
ARIEL
En línea

saludos
PikMan
Mario
Colaborador
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Mexico Mexico

Mensajes: 781


Es tiempo de BREAK


« Respuesta #16 : 09 de Agosto de 2006, 04:43:51 »

Muy buen trabajo, bien estructurado y explicado.

Para mí que apenas está aprendiendo C, esto me va a ayudar bastante.

En línea

La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee
Kedutpic
Colaborador
PIC16
*****
Desconectado Desconectado

Sexo: Masculino
Peru Peru

Mensajes: 219



WWW
« Respuesta #17 : 15 de Agosto de 2006, 12:43:51 »

man ta chevre el tutorial pero sera posible que lo puedas hacer en .asm porque nu se nada de C para que lo pueda probar ok . gracias Y que viva el foro de microcontroladores  lol
En línea

Actel  -  VHDL un nuevo mundo por descubrir lol
Grupo de Microelectronica - CIDI - UTP
Visitanos en : http://ue.accesus.com
tithanae
PIC16
***
Desconectado Desconectado

Sexo: Masculino
Israel Israel

Mensajes: 106


« Respuesta #18 : 31 de Octubre de 2006, 01:56:45 »


 Estimados jovenes antes que nada paso a reconocer el trabamo hecho por cada uno de ustedes en lo que significa este RTC (DS1307) en especial a Redpic por su valioso aporte, y tambien a RaDoN por no haberse hecho vencer con el DS1307 y lo hizo funcionar..... 

despues de estas lineas de reconocimiento que nunca estan demas paso a contarles lo que me sucede

la libreria que nos brindo Redpic ya la utilize y creo que bien ya que pudeo escribir y leer bien en la RAM de este chip en cuanto a la hora la coloco y la leo PEROOO.... ahi biene el pero  cuenta leeennto  a razon de un segundo por cada 15 o 10 minutos de ahi dedusco que es el cristal que ocupo ustedes que piensan ....

ya cambie varios (3) cristales y lo mismo parece que en la unica tienda que encontre estos cristales me tomaron el pelo y me dieron de otro valor...................yo digo que es el cristal ya que cuando le puse un frecuencimetro para ver si el cristal me daba los 32.768  y comenzo a contar mas rapido osea que  debe ser el cristal que dicen ustedes .....leyendo por ahi esto le paso a otro colega nuestro y tambien le dijeron que era el cristal lamentablemente el amigo no comenta que solucion encontro les agradeceria mucho sus consejos ya que no quiero comprar cristales ya que como no hay aca en mi pais (bolivia) lo tendre que hacer en españa o argentina y esto me tomaria mucho y mi duda es si no es los cristales mucho tiempo perdido.....

 
un dato  los ds1307 los compre en españa y tarde mucho ya que mi hermana los compro y como no sabe nada de electronica le costo mucho y lamentablemente no tenian los cristales....

por si acaso ya he leido todos los post que pillo el buscador del foro al ingresar ds1307 en total son 4 paginas de resultados

En línea
jucemoar
PIC10
*
Desconectado Desconectado

Mensajes: 24


« Respuesta #19 : 06 de Noviembre de 2006, 11:55:31 »

solo una pregunta  sera  que se  puede  hacerlo pero  con display de  7 seg.  como yo lo  quiero no  con lcd  gracias  julio  ....  jucemoar@hotmail.com  respondanme  please
En línea
TODOPIC
   

 En línea
Páginas: [1] 2 3 4 5 6 7 8 Imprimir 
« anterior próximo »
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.11 | SMF © 2006-2008, Simple Machines LLC XHTML 1.0 válido! CSS válido!
Página creada en 0.314 segundos con 23 consultas.