Autor Tema: Real Time Clock o el DS1307 desatado  (Leído 230443 veces)

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

Desconectado ZAZA

  • PIC10
  • *
  • Mensajes: 7
Re: Real Time Clock o el DS1307 desatado
« Respuesta #165 en: 02 de Mayo de 2011, 00:55:43 »
Hola soy nuevo en esto de los foros pero acudo con ustedes por que necesito su ayuda, estoy tratando de hacer la comunicacion I2C entre un pic 18f4550 y un ds1307 e hice este codigo

#include <p18f4550.h>
#include <i2c.h>
#define RTC_SDA  PIN_B0
#define RTC_SCL  PIN_B1

#pragma config PLLDIV = 1         // No prescale (4 MHz oscillator input drives PLL directly)
#pragma config CPUDIV = OSC1_PLL2   // [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
#pragma config USBDIV = 1         // USB clock source comes directly from the primary oscillator block with no postscale
#pragma config FOSC = XT_XT         // HS oscillator, HS used by USB
#pragma config FCMEN = OFF         // Fail-Safe Clock Monitor disabled
#pragma config IESO = OFF         // Oscillator Switchover mode disabled
#pragma config PWRT = OFF         // PWRT disabled
#pragma config BOR = OFF         // Brown-out Reset disabled in hardware and software
#pragma config VREGEN = OFF         // USB voltage regulator disabled
#pragma config WDT = OFF         // HW Disabled - SW Controlled
#pragma config MCLRE = ON         // MCLR pin enabled; RE3 input pin disabled
#pragma config LPT1OSC = OFF      // Timer1 configured for higher power operation
#pragma config PBADEN = OFF         // PORTB<4:0> pins are configured as digital I/O on Reset
#pragma config CCP2MX = ON         // CCP2 input/output is multiplexed with RC1
#pragma config STVREN = ON         // Stack full/underflow will cause Reset
#pragma config LVP = OFF         // Single-Supply ICSP disabled
#pragma config ICPRT = OFF         // ICPORT disabled
#pragma config XINST = OFF         // Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
#pragma config DEBUG = OFF         // Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
   // Data and code memory without protection

unsigned char SEG,MIN,HRS,DAY,DIA,MES,ANO,SEGUNDOS;
int BAN=1;


void main(void)
{
   //CONFIGURAR SSPCON1
   SSPCON1 = 0X00;
   SSPCON1bits.SSPEN = 1;
   
   
   // CONFIGURAR BRG A velocidad de 100 KHZ con un cristal de 4MHZ
    SPBRG = 0x027;

   //CONFIGURACION ADCON1 TODOS SALIDAS DIGITALES
   ADCON1=0x0f;
   
   //CONFIGURACION TRISB
   TRISB= 0x03;
    TRISD=0x00;
    PORTD=0B00000000;
   SEG=0b00000000;
   
      StartI2C();
      WriteI2C(0B11010000);// DIRECCION DEL DS1307 EN ESCLAVO
      AckI2C();
      WriteI2C(0B00000000);//INDICA QUE POSICION SE VERA CAMBIADA, EN ESTE CASO LOS SEGUNDOS
      AckI2C();
      WriteI2C(SEG);// iNDICA EL SEG. ACTUAL
      AckI2C();
      StopI2C();//DEJA DE MANDAR INSTRUCCIONES
       
      //pROCESO DE lECTURA
       StartI2C();
      WriteI2C(0B11010001);// LEE DEL DS1307
      AckI2C();
      SEGUNDOS = ReadI2C();
      NotAckI2C();
      StopI2C();

      
    do
    {
      //pROCESO DE lECTURA
       StartI2C();
      WriteI2C(0B11010001);// LEE DEL DS1307
      AckI2C();
      SEGUNDOS = ReadI2C();
      NotAckI2C();
      StopI2C();
    }while(BAN==0);
   

y pues no funciona, me base en la hoja de datos y en el manual del pic para hacerlo, espero que me puedan ayudar, de antemano gracias

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Real Time Clock o el DS1307 desatado
« Respuesta #166 en: 02 de Mayo de 2011, 01:48:35 »
Hola ZAZA: Que es lo que no funciona. Que síntoma te hace?
                 Saludos.
                    Juknich
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado ZAZA

  • PIC10
  • *
  • Mensajes: 7
Re: Real Time Clock o el DS1307 desatado
« Respuesta #167 en: 02 de Mayo de 2011, 10:33:58 »
Hola ZAZA: Que es lo que no funciona. Que síntoma te hace?
                 Saludos.
                    Juknich
Hola ZAZA: Que es lo que no funciona. Que síntoma te hace?
                 Saludos.
                    Juknich

Hola gracias por responder! pues basicamente no hace nada! y pues ya he probado el pic pensando que era el pic el que no funcionaba pero si funciona! espero me puedan ayudar, saludos!

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Real Time Clock o el DS1307 desatado
« Respuesta #168 en: 02 de Mayo de 2011, 10:45:15 »
Te contenté en el otro mensaje que creaste...  :? No había visto que publicaste la misma pregunta aquí  :x
No contesto mensajes privados, las consultas en el foro

Desconectado ZAZA

  • PIC10
  • *
  • Mensajes: 7
Re: Real Time Clock o el DS1307 desatado
« Respuesta #169 en: 02 de Mayo de 2011, 11:30:17 »
Hola te pido una disculpa! pero no queria responderte sin antes investigar un poco acerca del IdleI2C() que mencionas! gracias! :oops:

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Real Time Clock o el DS1307 desatado
« Respuesta #170 en: 02 de Mayo de 2011, 11:43:16 »
ZAZA:
        Te transcribo a continuación una librería de inicialización de un rtc similar para que veas lo de idlei2c. El ds1337c. No está del todo lista, ya que falta optimizarla. Pero al menos logré que funcione.
        La hice con ayuda del tutorial de suky y su librería del rtcds1307, info de la página de Redpic  y lo que fui recolectando del foro, más un tutorial sobre i2c de microchip.
        Prestale mucha atención al datasheet del 1307 a la rutina de comunicación via i2c. Sobre todo a las ¨preguntas¨ y ¨respuestas¨ que se hacen entre dispositivos maestro y esclavo.
        En el hilo del cursillo de c18 está la librería que hizo Suky.
            Saludos.
                    Jukinch
               



Código: C
  1. // libreria para uso de rtc
  2.  
  3.  
  4.  
  5.  
  6. unsigned short int bcd2bin(unsigned short int PackedBCDbyte);
  7. unsigned short int bcd2ascii(unsigned short int cadenabcd);
  8. unsigned short int bin2bcd(unsigned short int binaryByte);
  9. unsigned short int bcd2int(unsigned short int PackedBCDbyte);
  10.  
  11. void initRtcDs1337(unsigned int hour,
  12.                                    unsigned int min,
  13.                                    unsigned int sec,
  14.                                    unsigned int dayOfWeek,
  15.                                    unsigned int date,
  16.                                    unsigned int month,
  17.                                    unsigned int year);
  18.  
  19. void setSecRtcDs1337(unsigned int setSec);
  20. void setMinRtcDs1337(unsigned int setMin);
  21. void setHourRtcDs1337(unsigned int setHour);
  22.  
  23. void setDayOfWeekRtcDs1337(unsigned int setDayOfWeek);
  24. void setDateRtcDs1337(unsigned int setDate);
  25. void setMonthRtcDs1337(unsigned int setMonth);
  26. void setYearRtcDs1337(unsigned int setYear);
  27.  
  28. void setAlarm1RtcDs1337(unsigned int setHour,
  29.                                             unsigned int setMin,
  30.                                                 unsigned int setSec,
  31.                                                 unsigned int setDate);
  32.  
  33.  
  34. void resetAlarm1RtcDs1337(void);
  35. void resetAlarm2RtcDs1337(void);
  36.  
  37.  
  38.  
  39. void setAlarm2RtcDs1337(unsigned int setHour,
  40.                                             unsigned int setMin,
  41.                                                 unsigned int setDate);
  42.  
  43. void setSquareWaveRtcDs1337(unsigned int setEnable,
  44.                                                 unsigned int setRate);
  45.  
  46.  
  47.  
  48. void readRtcDs1337(void);
  49.  
  50.  
  51.  
  52. /*declaración de variables*/
  53.  
  54.        struct{
  55.                          // variables para hora
  56.                          unsigned short int unidadesSec;
  57.                          unsigned short int decenasSec;
  58.                          unsigned short int unidadesMin;
  59.                          unsigned short int decenasMin;
  60.                          unsigned short int unidadesHour;
  61.                          unsigned short int decenasHour;
  62.                          unsigned formatoAmPm:1;
  63.                          unsigned formato12_24:1;
  64.                          // variables para fecha
  65.                          unsigned short int dayWeek;
  66.                          unsigned short int unidadesDate;
  67.                          unsigned short int decenasDate;
  68.                          unsigned short int unidadesMonth;
  69.                          unsigned short int decenasMonth;
  70.                          unsigned centuryOverflow:1;
  71.                          unsigned short int unidadesYear;
  72.                          unsigned short int decenasYear;
  73.  
  74.                          // variables para alarma1
  75.                          unsigned short int unidadesSecAlarm1;
  76.                          unsigned short int decenasSecAlarm1;
  77.                          unsigned short int unidadesMinAlarm1;
  78.                          unsigned short int decenasMinAlarm1;
  79.                          unsigned short int unidadesHourAlarm1;
  80.                          unsigned short int decenasHourAlarm1;
  81.                          unsigned formatoAmPmAlarm1:1;
  82.                          unsigned formato12_24Alarm1:1;
  83.                          unsigned short int unidadesDayAlarm1;
  84.                          unsigned short int unidadesDateAlarm1;
  85.                          unsigned short int decenasDateAlarm1;
  86.                          unsigned DayOrDateSelectAlarm1:1;
  87.                          unsigned alarm1Mask1:1;
  88.              unsigned alarm1Mask2:1;
  89.                          unsigned alarm1Mask3:1;
  90.                          unsigned alarm1Mask4:1;
  91.                          // variables para alarma2
  92.                          unsigned short int unidadesMinAlarm2;
  93.                          unsigned short int decenasMinAlarm2;
  94.                          unsigned short int unidadesHourAlarm2;
  95.                          unsigned short int decenasHourAlarm2;
  96.                          unsigned formatoAmPmAlarm2:1;
  97.                          unsigned formato12_24Alarm2:1;
  98.                          unsigned short int unidadesDayAlarm2;
  99.                          unsigned short int unidadesDateAlarm2;
  100.                          unsigned short int decenasDateAlarm2;
  101.                          unsigned DayOrDateSelectAlarm2:1;
  102.                          unsigned alarm2Mask1:1;
  103.              unsigned alarm2Mask2:1;
  104.                          unsigned alarm2Mask3:1;
  105.                          unsigned alarm2Mask4:1;
  106.                  }RTC;
  107.  
  108.  
  109. unsigned short int sec;
  110. unsigned short int min;
  111. unsigned short int hour;
  112. unsigned short int dayWeek;
  113. unsigned short int date;
  114. unsigned short int month;
  115. unsigned short int year;
  116.  
  117. unsigned short int alarm1sec;
  118. unsigned short int alarm1min;
  119. unsigned short int alarm1hour;
  120. unsigned short int alarm1date;
  121. unsigned short int alarm2min;
  122. unsigned short int alarm2hour;
  123. unsigned short int alarm2date;
  124.  
  125.  
  126.  
  127. /***** rutina de inicialización de rtc ***************************************/
  128. void initRtcDs1337(unsigned int hour,
  129.                                    unsigned int min,
  130.                                    unsigned int sec,
  131.                                    unsigned int dayOfWeek,
  132.                                    unsigned int date,
  133.                                    unsigned int month,
  134.                                    unsigned int year)
  135. {
  136. OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  137.  
  138. SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  139.                 /* When the MSSP is configured in Master mode, the lower seven
  140.                 bits of SSPADD act as the Baud Rate Generator reload value.*/
  141.  
  142.                                                 /*ejemplo usando cristal de 20mhz
  143.                                                 ((Fosc/4) / BiteRate )-1
  144.                                                 (Fosc/4) =20mhz/4 =5mhz
  145.                                                 Entonces nos da:
  146.                                                 SSPADD = ( 5MHz / 100KHz ) - 1
  147.                                                 SSPADD = ( 50 ) - 1
  148.                                                 SSPADD = 49. o su equivalente en hexadecimal = 0x31
  149.                                                 */
  150.  
  151.  
  152. IdleI2C();
  153. StartI2C(); // Envia condición de start al bus i2c
  154. IdleI2C();
  155.  
  156.  
  157. WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  158.                       //  y le dice que se va a escribir con el bit0 en 0
  159. IdleI2C();
  160. /*
  161. (Write Mode):
  162. The slave address byte is the first byte received after the master generates the START condition.
  163. The slave address byte contains the 7-bit DS1337 address, which is 1101000, followed by the direction bit (R/W),
  164. which, for a write, is 0.
  165. */
  166.  
  167.  
  168. WriteI2C(0b00000000); //        pone el puntero del rtc en dirección 00h enviando la dirección del registro 0
  169. IdleI2C();
  170. /*
  171. After the DS1337 acknowledges the slave address + write bit, the master transmits a register address
  172. to the DS1337. This sets the register pointer on the DS1337.
  173. The master may then transmit zero or more bytes of data, with the DS1337 acknowledging each byte received.
  174. The address pointer will increment after each data byte is transferred.
  175.  The master generates a STOP condition to terminate the data write.
  176. */
  177.  
  178. WriteI2C (bin2bcd(sec));                                //      (0b00000000); //        'REGISTER 0 =00H - SECONDS              0
  179. IdleI2C();
  180. WriteI2C(bin2bcd(min));                                 //      (0b01000011); //        'REGISTER 1 =01H - MINUTES      43
  181. IdleI2C();
  182. WriteI2C(bin2bcd(hour));                                //      (0b00100000); //        'REGISTER 2 =02H - HOURS        20
  183. IdleI2C();
  184. WriteI2C(bin2bcd(dayOfWeek));                   //      (0b00000000); //        'REGISTER 3 =03H - DAY          0
  185. IdleI2C();
  186. WriteI2C(bin2bcd(date));                                //      (0b00011001); //        'REGISTER 4 =04H - DATE         19
  187. IdleI2C();
  188. WriteI2C(bin2bcd(month));                               //      (0b00000010); //        'REGISTER 5 =05H - MONTH                02
  189. IdleI2C();
  190. WriteI2C(bin2bcd(year));                                //      (0b00010001); //        'REGISTER 6 =06H - YEAR         11
  191. IdleI2C();
  192. WriteI2C(bin2bcd(0));                                   // (0b00000000); //     'REGISTER 7 =07H -ALARM1   SECONDS                              0
  193. IdleI2C();
  194. WriteI2C(bin2bcd(0));                                   // (0b00000000); //     'REGISTER 8 =08H -ALARM1   MINUTES                              0
  195. IdleI2C();
  196. WriteI2C(bin2bcd(0));                                   // (0b00000000); //     'REGISTER 9 =09H -ALARM1   HOURS                                0
  197. IdleI2C();
  198. WriteI2C(bin2bcd(1));// (0b00000001); //        'REGISTER 10 =0AH - ALARM1 DAY=NO/DATE=SI       DATE    1
  199. IdleI2C();
  200. WriteI2C(bin2bcd(0));// (0b00000010); //        'REGISTER 11 =0BH -ALARM2  MIUNUTES                             2
  201. IdleI2C();
  202. WriteI2C(bin2bcd(0));// (0b00000000); //        'REGISTER 12 =0CH -ALARMA2 HOURS                                0
  203. IdleI2C();
  204. WriteI2C(bin2bcd(0));// (0b00011001); //        'REGISTER 13 =0DH -ALARMA2 DAY/DATE                             19
  205. IdleI2C();
  206. WriteI2C(bin2bcd(0b00000111));// (0b00000000); //       'REGISTER 14 =0EH -CONTROL                      bit7=0 Enable Oscilator
  207.                                           //                                                                            bit4=0 Rate select 2
  208.                                           //                                                                            bit3=0 Rate select 1
  209.                                       //                                                                                bit2=0 interrupt control
  210.                                           //                                                                            bit1=0 alarm 2 interrupt
  211.                                       //                                                                                bit0=0 alarm 1 interrupt                           
  212. IdleI2C();
  213. WriteI2C(0b00000000); //        'REGISTER 15 =0FH - STATUS                      bit7=0 pone a cero el oscilator stop flag
  214.                                           //                                                                            bit1=0 pone a cero el flag de alarm 2
  215.                                           //                                                                            bit0=0 pone a cero el flag de alarm 1
  216. IdleI2C();
  217. StopI2C();
  218. }
  219. /***** fin de rutina de inicialización de rtc ***************************************/
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228. /***** rutina de seteo de segundos del rtc ***************************************/
  229. void setSecRtcDs1337(unsigned int setSec)
  230. {
  231.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  232.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  233.                 /* When the MSSP is configured in Master mode, the lower seven
  234.                 bits of SSPADD act as the Baud Rate Generator reload value.*/
  235.  
  236.                                                 /*ejemplo usando cristal de 20mhz
  237.                                                 ((Fosc/4) / BiteRate )-1
  238.                                                 (Fosc/4) =20mhz/4 =5mhz
  239.                                                 Entonces nos da:
  240.                                                 SSPADD = ( 5MHz / 100KHz ) - 1
  241.                                                 SSPADD = ( 50 ) - 1
  242.                                                 SSPADD = 49. o su equivalente en hexadecimal = 0x31
  243.                                                 */
  244.         IdleI2C();
  245.         StartI2C(); // Envia condición de start al bus i2c
  246.         IdleI2C();
  247.         /*
  248.         (Write Mode):
  249.         The slave address byte is the first byte received after the master generates the START condition.
  250.         The slave address byte contains the 7-bit DS1337 address, which is 1101000, followed by the direction bit (R/W),
  251.         which, for a write, is 0.
  252.         */
  253.  
  254.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  255.                           //  y le dice que se va a escribir con el bit0 en 0
  256.         IdleI2C();
  257.  
  258.         WriteI2C(0b00000000); //        pone el puntero del rtc en la dirección 00h correspondiente a los segundos
  259.         IdleI2C();
  260.         /*
  261.         After the DS1337 acknowledges the slave address + write bit, the master transmits a register address
  262.         to the DS1337. This sets the register pointer on the DS1337.
  263.         The master may then transmit zero or more bytes of data, with the DS1337 acknowledging each byte received.
  264.         The address pointer will increment after each data byte is transferred.
  265.          The master generates a STOP condition to terminate the data write.
  266.         */
  267.         WriteI2C (bin2bcd(setSec));
  268.         IdleI2C();
  269.         StopI2C();
  270. }
  271. /***** fin de rutina de seteo de segundos del rtc ***************************************/
  272.  
  273.  
  274. /***** rutina de seteo de minutos del rtc ***************************************/
  275. void setMinRtcDs1337(unsigned int setMin)
  276. {
  277.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  278.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  279.                 /* When the MSSP is configured in Master mode, the lower seven
  280.                 bits of SSPADD act as the Baud Rate Generator reload value.*/
  281.  
  282.                                                 /*ejemplo usando cristal de 20mhz
  283.                                                 ((Fosc/4) / BiteRate )-1
  284.                                                 (Fosc/4) =20mhz/4 =5mhz
  285.                                                 Entonces nos da:
  286.                                                 SSPADD = ( 5MHz / 100KHz ) - 1
  287.                                                 SSPADD = ( 50 ) - 1
  288.                                                 SSPADD = 49. o su equivalente en hexadecimal = 0x31
  289.                                                 */
  290.         IdleI2C();
  291.         StartI2C(); // Envia condición de start al bus i2c
  292.         IdleI2C();
  293.         /*
  294.         (Write Mode):
  295.         The slave address byte is the first byte received after the master generates the START condition.
  296.         The slave address byte contains the 7-bit DS1337 address, which is 1101000, followed by the direction bit (R/W),
  297.         which, for a write, is 0.
  298.         */
  299.  
  300.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  301.                           //  y le dice que se va a escribir con el bit0 en 0
  302.         IdleI2C();
  303.  
  304.         WriteI2C(0b00000001); //        pone el puntero del rtc en la dirección 01h correspondiente a los minutos
  305.         IdleI2C();
  306.         /*
  307.         After the DS1337 acknowledges the slave address + write bit, the master transmits a register address
  308.         to the DS1337. This sets the register pointer on the DS1337.
  309.         The master may then transmit zero or more bytes of data, with the DS1337 acknowledging each byte received.
  310.         The address pointer will increment after each data byte is transferred.
  311.          The master generates a STOP condition to terminate the data write.
  312.         */
  313.         WriteI2C (bin2bcd(setMin));
  314.         IdleI2C();
  315.         StopI2C();
  316. }
  317. /***** fin de rutina de seteo de minutos del rtc ***************************************/
  318.  
  319.  
  320. /***** rutina de seteo de hora del rtc ***************************************/
  321. void setHourRtcDs1337(unsigned int setHour)
  322. {
  323.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  324.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  325.                 /* When the MSSP is configured in Master mode, the lower seven
  326.                 bits of SSPADD act as the Baud Rate Generator reload value.*/
  327.  
  328.                                                 /*ejemplo usando cristal de 20mhz
  329.                                                 ((Fosc/4) / BiteRate )-1
  330.                                                 (Fosc/4) =20mhz/4 =5mhz
  331.                                                 Entonces nos da:
  332.                                                 SSPADD = ( 5MHz / 100KHz ) - 1
  333.                                                 SSPADD = ( 50 ) - 1
  334.                                                 SSPADD = 49. o su equivalente en hexadecimal = 0x31
  335.                                                 */
  336.         IdleI2C();
  337.         StartI2C(); // Envia condición de start al bus i2c
  338.         IdleI2C();
  339.         /*
  340.         (Write Mode):
  341.         The slave address byte is the first byte received after the master generates the START condition.
  342.         The slave address byte contains the 7-bit DS1337 address, which is 1101000, followed by the direction bit (R/W),
  343.         which, for a write, is 0.
  344.         */
  345.  
  346.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  347.                           //  y le dice que se va a escribir con el bit0 en 0
  348.         IdleI2C();
  349.  
  350.         WriteI2C(0b00000010); //        pone el puntero del rtc en la dirección 02h correspondiente a la hora
  351.         IdleI2C();
  352.         /*
  353.         After the DS1337 acknowledges the slave address + write bit, the master transmits a register address
  354.         to the DS1337. This sets the register pointer on the DS1337.
  355.         The master may then transmit zero or more bytes of data, with the DS1337 acknowledging each byte received.
  356.         The address pointer will increment after each data byte is transferred.
  357.          The master generates a STOP condition to terminate the data write.
  358.         */
  359.         WriteI2C (bin2bcd(setHour));
  360.         IdleI2C();
  361.         StopI2C();
  362. }
  363. /***** fin de rutina de seteo de hora del rtc ***************************************/
  364.  
  365.  
  366.  
  367.  
  368.  
  369. /***** rutina de seteo de dia de la semana del rtc ***************************************/
  370.  
  371. void setDayOfWeekRtcDs1337(unsigned int setDayOfWeek)
  372. {
  373.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  374.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  375.                 /* When the MSSP is configured in Master mode, the lower seven
  376.                 bits of SSPADD act as the Baud Rate Generator reload value.*/
  377.  
  378.                                                 /*ejemplo usando cristal de 20mhz
  379.                                                 ((Fosc/4) / BiteRate )-1
  380.                                                 (Fosc/4) =20mhz/4 =5mhz
  381.                                                 Entonces nos da:
  382.                                                 SSPADD = ( 5MHz / 100KHz ) - 1
  383.                                                 SSPADD = ( 50 ) - 1
  384.                                                 SSPADD = 49. o su equivalente en hexadecimal = 0x31
  385.                                                 */
  386.         IdleI2C();
  387.         StartI2C(); // Envia condición de start al bus i2c
  388.         IdleI2C();
  389.         /*
  390.         (Write Mode):
  391.         The slave address byte is the first byte received after the master generates the START condition.
  392.         The slave address byte contains the 7-bit DS1337 address, which is 1101000, followed by the direction bit (R/W),
  393.         which, for a write, is 0.
  394.         */
  395.  
  396.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  397.                           //  y le dice que se va a escribir con el bit0 en 0
  398.         IdleI2C();
  399.  
  400.         WriteI2C(0b00000011); //        pone el puntero del rtc en la dirección 03h correspondiente a DayOfWeek
  401.         IdleI2C();
  402.         /*
  403.         After the DS1337 acknowledges the slave address + write bit, the master transmits a register address
  404.         to the DS1337. This sets the register pointer on the DS1337.
  405.         The master may then transmit zero or more bytes of data, with the DS1337 acknowledging each byte received.
  406.         The address pointer will increment after each data byte is transferred.
  407.          The master generates a STOP condition to terminate the data write.
  408.         */
  409.         WriteI2C (bin2bcd(setDayOfWeek));
  410.         IdleI2C();
  411.         StopI2C();
  412. }
  413. /***** fin de rutina de seteo de dia de la semana del rtc ***************************************/
  414.  
  415.  
  416. /***** rutina de seteo de dia del mes del rtc ***************************************/
  417. void setDateRtcDs1337(unsigned int setDate)
  418. {
  419.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  420.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  421.                 /* When the MSSP is configured in Master mode, the lower seven
  422.                 bits of SSPADD act as the Baud Rate Generator reload value.*/
  423.  
  424.                                                 /*ejemplo usando cristal de 20mhz
  425.                                                 ((Fosc/4) / BiteRate )-1
  426.                                                 (Fosc/4) =20mhz/4 =5mhz
  427.                                                 Entonces nos da:
  428.                                                 SSPADD = ( 5MHz / 100KHz ) - 1
  429.                                                 SSPADD = ( 50 ) - 1
  430.                                                 SSPADD = 49. o su equivalente en hexadecimal = 0x31
  431.                                                 */
  432.         IdleI2C();
  433.         StartI2C(); // Envia condición de start al bus i2c
  434.         IdleI2C();
  435.         /*
  436.         (Write Mode):
  437.         The slave address byte is the first byte received after the master generates the START condition.
  438.         The slave address byte contains the 7-bit DS1337 address, which is 1101000, followed by the direction bit (R/W),
  439.         which, for a write, is 0.
  440.         */
  441.  
  442.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  443.                           //  y le dice que se va a escribir con el bit0 en 0
  444.         IdleI2C();
  445.  
  446.         WriteI2C(0b00000100); //        pone el puntero del rtc en la dirección 04h correspondiente a día de la semana
  447.         IdleI2C();
  448.         /*
  449.         After the DS1337 acknowledges the slave address + write bit, the master transmits a register address
  450.         to the DS1337. This sets the register pointer on the DS1337.
  451.         The master may then transmit zero or more bytes of data, with the DS1337 acknowledging each byte received.
  452.         The address pointer will increment after each data byte is transferred.
  453.          The master generates a STOP condition to terminate the data write.
  454.         */
  455.         WriteI2C (bin2bcd(setDate));
  456.         IdleI2C();
  457.         StopI2C();
  458. }
  459. /***** fin de rutina de seteo de dia del mes del rtc ***************************************/
  460.  
  461.  
  462. /***** rutina de seteo del mes del rtc ***************************************/
  463. void setMonthRtcDs1337(unsigned int setMonth)
  464. {
  465.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  466.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  467.                 /* When the MSSP is configured in Master mode, the lower seven
  468.                 bits of SSPADD act as the Baud Rate Generator reload value.*/
  469.  
  470.                                                 /*ejemplo usando cristal de 20mhz
  471.                                                 ((Fosc/4) / BiteRate )-1
  472.                                                 (Fosc/4) =20mhz/4 =5mhz
  473.                                                 Entonces nos da:
  474.                                                 SSPADD = ( 5MHz / 100KHz ) - 1
  475.                                                 SSPADD = ( 50 ) - 1
  476.                                                 SSPADD = 49. o su equivalente en hexadecimal = 0x31
  477.                                                 */
  478.         IdleI2C();
  479.         StartI2C(); // Envia condición de start al bus i2c
  480.         IdleI2C();
  481.         /*
  482.         (Write Mode):
  483.         The slave address byte is the first byte received after the master generates the START condition.
  484.         The slave address byte contains the 7-bit DS1337 address, which is 1101000, followed by the direction bit (R/W),
  485.         which, for a write, is 0.
  486.         */
  487.  
  488.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  489.                           //  y le dice que se va a escribir con el bit0 en 0
  490.         IdleI2C();
  491.  
  492.         WriteI2C(0b00000101); //        pone el puntero del rtc en la dirección 05h correspondiente al mes
  493.         IdleI2C();
  494.         /*
  495.         After the DS1337 acknowledges the slave address + write bit, the master transmits a register address
  496.         to the DS1337. This sets the register pointer on the DS1337.
  497.         The master may then transmit zero or more bytes of data, with the DS1337 acknowledging each byte received.
  498.         The address pointer will increment after each data byte is transferred.
  499.          The master generates a STOP condition to terminate the data write.
  500.         */
  501.         WriteI2C (bin2bcd(setMonth));
  502.         IdleI2C();
  503.         StopI2C();
  504. }
  505. /***** fin de rutina de seteo del mes del rtc ***************************************/
  506.  
  507.  
  508. // ***** rutina de seteo del año del rtc **************************************
  509. void setYearRtcDs1337(unsigned int setYear)
  510. {
  511.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  512.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  513.         IdleI2C();
  514.         StartI2C(); // Envia condición de start al bus i2c
  515.         IdleI2C();
  516.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  517.                           //  y le dice que se va a escribir con el bit0 en 0
  518.         IdleI2C();
  519.  
  520.         WriteI2C(0b00000110); //        pone el puntero del rtc en la dirección 06h correspondiente al año
  521.         IdleI2C();
  522.         WriteI2C (bin2bcd(setYear));
  523.         IdleI2C();
  524.         StopI2C();
  525. }
  526. // ***** fin de rutina de seteo del año del rtc ***************************************
  527.  
  528.  
  529.  
  530. // ***** rutina de seteo de alarma1 del rtc ***************************************
  531. // NOTA: falta implementar la máscara de los registros 07h a 0ah de los bit7 para setear el alarm Rate.
  532. // La función setea la alarma con la opción por defecto todos los bits 7 en cero. (se activa la alarma
  533. // cuando se igualan los segundos, minutos, horas, y dia del mes.
  534.  
  535. void setAlarm1RtcDs1337(unsigned int setHour,
  536.                                                 unsigned int setMin,
  537.                                                 unsigned int setSec,
  538.                                                 unsigned int setDate)
  539. {
  540.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  541.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  542.         IdleI2C();
  543.         StartI2C(); // Envia condición de start al bus i2c
  544.         IdleI2C();
  545.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  546.                           //  y le dice que se va a escribir con el bit0 en 0
  547.         IdleI2C();
  548.         WriteI2C(0b00000111); //        pone el puntero del rtc en la dirección 07h correspondiente a los segundos alarma1
  549.         IdleI2C();
  550.  
  551.         WriteI2C (bin2bcd(setSec));                            
  552.         IdleI2C();
  553.         WriteI2C(bin2bcd(setMin));                                     
  554.         IdleI2C();
  555.         WriteI2C(bin2bcd(setHour));                            
  556.         IdleI2C();
  557.         WriteI2C(bin2bcd(setDate));                    
  558.         IdleI2C();
  559.         StopI2C();
  560. }
  561. /***** fin de rutina de seteo de alarma1 del rtc ********************************/
  562.  
  563. // ****** rutina de seteo de alarma2 del rtc ***************************************
  564. // NOTA: falta implementar la máscara de los registros 0bh a 0dh de los bit7 para setear el alarm Rate.
  565. // La función setea la alarma con la opción por defecto todos los bits 7 en cero. (se activa la alarma
  566. // cuando se igualan los minutos, horas, y dia del mes.
  567. void setAlarm2RtcDs1337(unsigned int setHour,
  568.                                             unsigned int setMin,
  569.                                                 unsigned int setDate)
  570. {
  571.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  572.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  573.                                        
  574.         IdleI2C();
  575.         StartI2C(); // Envia condición de start al bus i2c
  576.         IdleI2C();
  577.  
  578.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  579.                           //  y le dice que se va a escribir con el bit0 en 0
  580.         IdleI2C();
  581.  
  582.         WriteI2C(0b00001011); //        pone el puntero del rtc en la dirección 0bh correspondiente a los minutos alarma2
  583.         IdleI2C();
  584.         WriteI2C(bin2bcd(setMin));                                     
  585.         IdleI2C();
  586.         WriteI2C(bin2bcd(setHour));                            
  587.         IdleI2C();
  588.         WriteI2C(bin2bcd(setDate));                    
  589.         IdleI2C();
  590.         StopI2C();
  591. }
  592. // ***** fin de rutina de seteo de alarma2 del rtc ********************************
  593.  
  594.  
  595.  
  596.  
  597.  
  598.  
  599.  
  600.  
  601.  
  602.  
  603.  
  604.  
  605.  
  606.  
  607.  
  608.  
  609.  
  610.  
  611.  
  612. // ****** rutina de reseteo de alarma1 del rtc ***************************************
  613.  
  614.  
  615. void resetAlarm1RtcDs1337(void)
  616. {
  617.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  618.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  619.                                        
  620.         IdleI2C();
  621.         StartI2C(); // Envia condición de start al bus i2c
  622.         IdleI2C();
  623.  
  624.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  625.                           //  y le dice que se va a escribir con el bit0 en 0
  626.         IdleI2C();
  627.  
  628.         WriteI2C(0b00001111); //        pone el puntero del rtc en la dirección 0fh correspondiente a los flags de alarmas
  629.         IdleI2C();
  630.         WriteI2C(0b00000010);                                  
  631.         IdleI2C();
  632.         StopI2C();
  633.  
  634. }
  635. // ****** final de rutina de reseteo de alarma1 del rtc ***************************************
  636.  
  637.  
  638.  
  639.  
  640.  
  641. // ****** rutina de reseteo de alarma2 del rtc ***************************************
  642.  
  643. void resetAlarm2RtcDs1337(void)
  644. {
  645.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  646.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  647.                                        
  648.         IdleI2C();
  649.         StartI2C(); // Envia condición de start al bus i2c
  650.         IdleI2C();
  651.  
  652.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  653.                           //  y le dice que se va a escribir con el bit0 en 0
  654.         IdleI2C();
  655.  
  656.         WriteI2C(0b00001111); //        pone el puntero del rtc en la dirección 0fh correspondiente a los flags de alarmas
  657.         IdleI2C();
  658.         WriteI2C(0b00000001);                                  
  659.         IdleI2C();
  660.         StopI2C();
  661.  
  662. }
  663.  
  664. // ****** final de rutina de reseteo de alarma2 del rtc ***************************************
  665.  
  666.  
  667.  
  668.  
  669.  
  670.  
  671.  
  672.  
  673.  
  674.  
  675.  
  676.  
  677.  
  678.  
  679.  
  680.  
  681.  
  682. /***** rutina de seteo de salida de onda cuadrada del rtc ***************************************/
  683. void setSquareWaveRtcDs1337(unsigned int setEnable,
  684.                                                 unsigned int setRate)
  685. {
  686.         OpenI2C(MASTER,SLEW_OFF); // inicializo el i2c en modo maestro y 100khz
  687.         SSPADD = 49; // SSPADD = ( (Fosc/4) / BiteRate )-1
  688.         IdleI2C();
  689.         StartI2C(); // Envia condición de start al bus i2c
  690.         IdleI2C();
  691.  
  692.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  693.                           //  y le dice que se va a escribir con el bit0 en 0
  694.         IdleI2C();
  695.  
  696.         WriteI2C(0b00001110); //        pone el puntero del rtc en la dirección 0eh correspondiente al registro de control
  697.         IdleI2C();
  698.         if (setEnable == 1)
  699.                 {
  700.       // ACA FALTA IMPLEMENTAR UN SWITCH CASE para seleccionar los diferentes rates
  701.                                         WriteI2C(0b00000000);                                  
  702.                                         IdleI2C();
  703.                                         StopI2C();
  704.         }  
  705.         else
  706.                 {
  707.                 WriteI2C(0b00000100);                                  
  708.                 IdleI2C();
  709.                 StopI2C();
  710.         }  
  711. }
  712. /***** fin de rutina de seteo de salida de onda cuadrada del rtc ********************************/
  713.  
  714.  
  715.  
  716.  
  717.  
  718.  
  719.  
  720.  
  721.  
  722.  
  723.  
  724.  
  725.  
  726.  
  727.  
  728.  
  729.  
  730.  
  731.  
  732.  
  733.  
  734.  
  735.  
  736.  
  737.  
  738.  
  739.  
  740.  
  741.  
  742.  
  743.  
  744.  
  745.  
  746.  
  747.  
  748.  
  749.  
  750.  
  751.  
  752.  
  753. /***** rutina de lectura de datos de rtc ***************************************/
  754.  
  755.  
  756. void readRtcDs1337(void)
  757. {
  758. /* Para leer los datos del rtc primero debemos enviar la posición del puntero de registro
  759.  Para ello se siguen los siguientes pasos:
  760.  
  761. * verificar que el bus i2c esté desocupado con idleI2C()
  762. * se envía una condición de start con StartI2C()
  763. * verificar que el bus i2c esté desocupado con idleI2C()
  764. * se envía la dirección del rtc (1101000) más el bit 0 para informar que vamos a escribir =0b11010000
  765. * se escribe la dirección del puntero de registro a la que queremos apuntar. pej al registro 0=0b00000000
  766. * luego enviamos nuevamente la condición de start
  767. * se envía la dirección del rtc (1101000) más el bit 1 para informar que vamos a leer =0b11010001
  768.  
  769. * se lee el registro apuntado con ReadI2C()
  770. * se le dice al slave AckI2C() para informar que se leyó el valor
  771. * verificar que el bus i2c esté desocupado con idleI2C()
  772. * para leer el registro siguiente lo hacemos nuevamente con ReadI2C()
  773. * se le dice al slave AckI2C() para informar que se leyó el valor
  774. * verificar que el bus i2c esté desocupado con idleI2C()
  775. * una vez que no querémos seguir leyendo más registros debemos informar al slave tal circunstancia
  776. terminando la lectura con NotAckI2C()
  777. * verificar que el bus i2c esté desocupado con idleI2C()
  778. * Dejampos libre el bus i2c con StopI2C()
  779. */
  780.  
  781. // prepara lo necesario para hacer la lectura
  782.         IdleI2C();
  783.         StartI2C(); // Envia condición de start al bus i2c
  784.         IdleI2C();
  785.        
  786.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  787.                               //  y le dice que se va a escribir con el bit0 en 0
  788.         IdleI2C();
  789.        
  790.         WriteI2C(0b00000000); // pone el puntero del rtc en dirección 00h enviando la dirección del registro 0
  791.         IdleI2C();
  792.        
  793.         RestartI2C(); // Envia condición de restart al bus i2c
  794.         IdleI2C();
  795.         WriteI2C(0b11010001); // escribe la dirección del rtc (0b1101000) y último bit en 1  = hex D1=0b11010001)
  796.                               //  con este último bit0 en 1 se le dice al rtc que se va a leer
  797.         IdleI2C();
  798.        
  799. // COMIENZA LECTURA
  800.  
  801. // lee registro 00H **** LECTURA DE SEGUNDOS ****************************************
  802.         sec = ReadI2C()& 0x7f; // enmascara el octavo bit que no se usa.
  803.         AckI2C();
  804.         IdleI2C();
  805.        
  806.         RTC.unidadesSec = sec &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  807.        
  808.         RTC.decenasSec =( sec  &0b01110000);// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  809.         RTC.decenasSec = RTC.decenasSec >>4;
  810.  
  811.  
  812. // lee registro 01H **** LECTURA DE MINUTOS ****************************************
  813.         min = ReadI2C()& 0x7f; // enmascara el octavo bit que no se usa.
  814.         AckI2C();
  815.         IdleI2C();
  816.        
  817.         RTC.unidadesMin = min &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  818.        
  819.         RTC.decenasMin = min  &0b01110000;// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  820.         RTC.decenasMin = RTC.decenasMin >>4;
  821.        
  822.        
  823. // lee registro 02H **** LECTURA DE HORAS ******************************************
  824.         hour = ReadI2C()& 0x7f; // enmascara el octavo bit que no se usa.
  825.         AckI2C();
  826.         IdleI2C();
  827.        
  828.         RTC.unidadesHour = hour &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  829.         RTC.decenasHour = hour  &0b01110000;// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  830.         RTC.decenasHour = RTC.decenasHour >>4;
  831.  
  832. // lee registro 03H **** LECTURA DEL DIA DE LA SEMANA ******************************************
  833.         dayWeek = ReadI2C()& 0b00000111; // enmascara el nibble alto.
  834.         AckI2C();
  835.         IdleI2C();
  836.        
  837.         RTC.dayWeek = dayWeek; // copio el valor leido
  838.        
  839. // lee registro 04H **** LECTURA DE DIA DEL MES ******************************************
  840.         date = ReadI2C()& 0b00111111; // enmascara el octavo y séptimo bit que no se usan.
  841.         AckI2C();
  842.         IdleI2C();
  843.        
  844.         RTC.unidadesDate = date &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  845.         RTC.decenasDate = date  &0b00110000;// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  846.         RTC.decenasDate = RTC.decenasDate >>4;
  847.        
  848. // lee registro 05H **** LECTURA DE MES ******************************************
  849.         month = ReadI2C()& 0b00011111; // enmascara el octavo, séptimo, y sexto bit que no se usan.
  850.         AckI2C();
  851.         IdleI2C();
  852.        
  853.         RTC.unidadesMonth = month &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  854.        
  855.         RTC.decenasMonth = month &0b00010000;// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  856.         RTC.decenasMonth = RTC.decenasMonth >>4;
  857.        
  858. // lee registro 06H **** LECTURA DE AÑO ******************************************
  859.         year = ReadI2C();
  860. // Como es la última lectura que en este caso se le pide al bus i2c se finaliza con NotAckI2C() y StopI2C()      
  861.         NotAckI2C();
  862.         IdleI2C();
  863.         StopI2C();
  864.  
  865.         RTC.unidadesYear = year &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  866.         RTC.decenasYear = year &0b11110000;// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  867.         RTC.decenasYear = RTC.decenasYear >>4;
  868.  
  869. // *********** Convierte los balores leidos en formato bcd a formato binario ********************
  870.         sec=bcd2bin(sec);
  871.         min=bcd2bin(min);
  872.         hour=bcd2bin(hour);
  873.         date=bcd2bin(date);
  874.         month=bcd2bin(month);
  875.         year=bcd2bin(year);
  876. }
  877. /***** final de rutina de lectura de datos de rtc ***************************************/
  878.  
  879.  
  880.  
  881.  
  882.  
  883.  
  884.  
  885.  
  886.  
  887.  
  888.  
  889.  
  890.  
  891.  
  892.  
  893. /***** rutina de lectura de datos de las alarmas del rtc ***************************************/
  894.  
  895. void readAlarmsRtcDs1337(void)
  896. {
  897. // prepara lo necesario para hacer la lectura
  898.         IdleI2C();
  899.         StartI2C(); // Envia condición de start al bus i2c
  900.         IdleI2C();
  901.        
  902.         WriteI2C(0b11010000); // escribe la dirección del rtc (11010000= hex D0)
  903.                               //  y le dice que se va a escribir con el bit0 en 0
  904.         IdleI2C();
  905.        
  906.         WriteI2C(0b00000111); // pone el puntero del rtc en dirección 07H enviando la dirección del registro 7
  907.         IdleI2C();
  908.        
  909.         RestartI2C(); // Envia condición de restart al bus i2c
  910.         IdleI2C();
  911.         WriteI2C(0b11010001); // escribe la dirección del rtc (0b1101000) y último bit en 1  = hex D1=0b11010001)
  912.                               //  con este último bit0 en 1 se le dice al rtc que se va a leer
  913.         IdleI2C();
  914.        
  915. // COMIENZA LECTURA
  916.  
  917. // lee registro 07H **** LECTURA DE SEGUNDOS alarm1 ****************************************
  918.         alarm1sec = ReadI2C()& 0x7f; // enmascara el octavo bit que no se usa.
  919.         AckI2C();
  920.         IdleI2C();
  921.        
  922.         RTC.unidadesSecAlarm1 = alarm1sec &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  923.        
  924.         RTC.decenasSecAlarm1 =( alarm1sec  &0b01110000);// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  925.         RTC.decenasSecAlarm1 = RTC.decenasSecAlarm1 >>4;
  926.  
  927.  
  928. // lee registro 08H **** LECTURA DE MINUTOS alarm1 ****************************************
  929.         alarm1min = ReadI2C()& 0x7f; // enmascara el octavo bit que no se usa.
  930.         AckI2C();
  931.         IdleI2C();
  932.        
  933.         RTC.unidadesMinAlarm1 = alarm1min &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  934.        
  935.         RTC.decenasMinAlarm1 = alarm1min  &0b01110000;// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  936.         RTC.decenasMinAlarm1 = RTC.decenasMinAlarm1 >>4;
  937.        
  938.        
  939. // lee registro 09H **** LECTURA DE HORAS alarm1 ******************************************
  940.         alarm1hour = ReadI2C()& 0x7f; // enmascara el octavo bit que no se usa.
  941.         AckI2C();
  942.         IdleI2C();
  943.        
  944.         RTC.unidadesHourAlarm1 = alarm1hour &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  945.         RTC.decenasHourAlarm1 = alarm1hour  &0b01110000;// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  946.         RTC.decenasHourAlarm1 = RTC.decenasHourAlarm1 >>4;
  947.  
  948.  
  949.  
  950. // lee registro 10H **** LECTURA DEL DIA DEL MES alarm1 ******************************************
  951.         alarm1date = ReadI2C()& 0b00111111; // enmascara el octavo y séptimo bit que no se usan.
  952.         AckI2C();
  953.         IdleI2C();
  954.        
  955.         RTC.unidadesDateAlarm1 = alarm1date &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  956.         RTC.decenasDateAlarm1 = alarm1date  &0b00110000;// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  957.         RTC.decenasDateAlarm1 = RTC.decenasDateAlarm1 >>4;
  958.        
  959.  
  960. // lee registro 11H **** LECTURA DE MINUTOS alarm2 ****************************************
  961.         alarm2min = ReadI2C()& 0x7f; // enmascara el octavo bit que no se usa.
  962.         AckI2C();
  963.         IdleI2C();
  964.        
  965.         RTC.unidadesMinAlarm2 = alarm2min &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  966.        
  967.         RTC.decenasMinAlarm2 = alarm2min  &0b01110000;// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  968.         RTC.decenasMinAlarm2 = RTC.decenasMinAlarm2 >>4;
  969.        
  970.        
  971. // lee registro 12H **** LECTURA DE HORAS alarm 2 ******************************************
  972.         alarm2hour = ReadI2C()& 0x7f; // enmascara el octavo bit que no se usa.
  973.         AckI2C();
  974.         IdleI2C();
  975.        
  976.         RTC.unidadesHourAlarm2 = alarm2hour &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  977.         RTC.decenasHourAlarm2 = alarm2hour  &0b01110000;// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  978.         RTC.decenasHourAlarm2 = RTC.decenasHourAlarm2 >>4;
  979.  
  980.  
  981.  
  982. // lee registro 13H **** LECTURA UNIDADES DE DIA DEL MES ALARM2 ******************************************
  983.         alarm2date = ReadI2C()& 0b00111111; // enmascara el octavo y séptimo bit que no se usan.
  984.  
  985. // Como es la última lectura que en este caso se le pide al bus i2c se finaliza con NotAckI2C() y StopI2C()      
  986.         NotAckI2C();
  987.         IdleI2C();
  988.         StopI2C();
  989.        
  990.         RTC.unidadesDateAlarm2 = alarm2date &0b00001111;// enmascara el nible alto del valor leido para pasar las unidades a la variable
  991.         RTC.decenasDateAlarm2 = alarm2date  &0b00110000;// enmascara el nible bajo del valor leido para pasar las decenas a la variable
  992.         RTC.decenasDateAlarm2 = RTC.decenasDateAlarm2 >>4;
  993.        
  994.        
  995.  
  996. // *********** Convierte los balores leidos en formato bcd a formato binario ********************
  997.         alarm1sec=bcd2bin(alarm1sec);
  998.         alarm1min=bcd2bin(alarm1min);
  999.         alarm1hour=bcd2bin(alarm1hour);
  1000.         alarm1date=bcd2bin(alarm1date);
  1001.         alarm2min=bcd2bin(alarm2min);
  1002.         alarm2hour=bcd2bin(alarm2hour);
  1003.         alarm2date=bcd2bin(alarm2date);
  1004.  
  1005. }
  1006.  
  1007.  
  1008.  
  1009.  
  1010.  
  1011.  
  1012.  
  1013.  
  1014.  
  1015.  
  1016.  
  1017.  
  1018. /***** fin de rutina de lectura de datos de las alarmas del rtc ***************************************/
  1019.  
  1020.  
  1021.  
  1022.  
  1023.  
  1024.  
  1025.  
  1026.  
  1027.  
  1028.  
  1029.  
  1030.  
  1031.  
  1032.  
  1033.  
  1034.  
  1035.  
  1036.  
  1037.  
  1038.  
  1039. /****************** función para convertir digito binario a bcd *********************************************/
  1040. /* primero compruebo si el número binario es mayor o igual que el número 10.
  1041. Si es menor que el 10 directamente asigno a l_digit el valor del número pasado como parámetro --->    l_digit=valor;
  1042.  
  1043. Si el número pasado como parámetro es mayor o igual que 10 le voy restando 10 unidades hasta que dicho valor
  1044. sea menor que 10 y en cada iteración voy incrementando en una unidad a h_digit.
  1045. Una vez que el valor es menor que 10 asigno el valor a l_digit
  1046. */
  1047.  
  1048. unsigned short int bin2bcd(unsigned short int binaryByte)
  1049. {
  1050.           unsigned short int temp=0;
  1051.           unsigned short int l_digit, h_digit;
  1052.           h_digit=0;
  1053.           l_digit=0;
  1054.           temp=binaryByte;
  1055.           if (temp>=10){
  1056.             do{
  1057.               temp-=10;
  1058.               h_digit++;
  1059.             }while (temp>=10);
  1060.           }
  1061.           l_digit=temp;
  1062.      h_digit = h_digit <<4; // muevo las decenas al nible alto
  1063.      
  1064.         return (h_digit | l_digit); // combina nibblealto y nibblebajo  para hacer packed bcd
  1065. }
  1066. /****************** final función para convertir digito binario a bcd ***************************************/
  1067.  
  1068.  
  1069.  
  1070. // ******función para pasar de bcd a valor entero ***************************************************
  1071.  
  1072. unsigned short int bcd2bin(unsigned short int PackedBCDbyte)
  1073. {
  1074.         unsigned short int temp;
  1075.         temp = PackedBCDbyte;
  1076.         temp >>= 1; // saco el bit 8 que no se usa
  1077.         temp &= 0x78; // hago una máscara con 0b01111000 para dejar pasar sólo los bits 7 a 3
  1078.      
  1079.         return(temp + //    sumo las centenas // 40decimal
  1080.                   (temp >> 2) + // sumo  las decenas      // 10 decimal
  1081.                   (PackedBCDbyte & 0x0f));// paso las unidades // 9decimal
  1082. }
  1083.  
  1084. /*
  1085.  ejemplo  de uso:
  1086.  
  1087.            dato pasado como parámetro a la función: 0b01011001  
  1088.  
  1089.             0101=5 1001=9 BCD = decimal 89 = binario 01011001
  1090.  
  1091.        temp=0b01011001
  1092.  >>1   temp=0b00101100
  1093.  &=0x78     0b01111000 aplica máscara desde el bit7 a bit3
  1094.        temp=0b00101000  = 40decimal
  1095.  
  1096.  >>2   temp=0b00001010  = 10 decimal
  1097.  
  1098.  PackedBCDbyte 0b01011001  
  1099.                   & 0x0f 0b00001111
  1100.             ------------------
  1101.               =0b00001001 = 9 decimal
  1102.  return (40decimal +(10decimal) + 9decimal = 59 decimal = 0x3b = 0011 1011
  1103.  
  1104. */
  1105.  
  1106. // ******final función para pasar de bcd a valor entero ***************************************************
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado ZAZA

  • PIC10
  • *
  • Mensajes: 7
Re: Real Time Clock o el DS1307 desatado
« Respuesta #171 en: 02 de Mayo de 2011, 12:42:54 »
Código: [Seleccionar]
#include <p18f4550.h>
#include <i2c.h>
#define RTC_SDA  PIN_B0
#define RTC_SCL  PIN_B1

#pragma config PLLDIV = 1 // No prescale (4 MHz oscillator input drives PLL directly)
#pragma config CPUDIV = OSC1_PLL2 // [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
#pragma config USBDIV = 1 // USB clock source comes directly from the primary oscillator block with no postscale
#pragma config FOSC = XT_XT // HS oscillator, HS used by USB
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor disabled
#pragma config IESO = OFF // Oscillator Switchover mode disabled
#pragma config PWRT = OFF // PWRT disabled
#pragma config BOR = OFF // Brown-out Reset disabled in hardware and software
#pragma config VREGEN = OFF // USB voltage regulator disabled
#pragma config WDT = OFF // HW Disabled - SW Controlled
#pragma config MCLRE = ON // MCLR pin enabled; RE3 input pin disabled
#pragma config LPT1OSC = OFF // Timer1 configured for higher power operation
#pragma config PBADEN = OFF // PORTB<4:0> pins are configured as digital I/O on Reset
#pragma config CCP2MX = ON // CCP2 input/output is multiplexed with RC1
#pragma config STVREN = ON // Stack full/underflow will cause Reset
#pragma config LVP = OFF // Single-Supply ICSP disabled
#pragma config ICPRT = OFF // ICPORT disabled
#pragma config XINST = OFF // Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
#pragma config DEBUG = OFF // Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
// Data and code memory without protection

unsigned char SEG,MIN,HRS,DAY,DIA,MES,ANO,SEGUNDOS;
int BAN=1;


void main(void)
{
//CONFIGURAR SSPCON1
SSPCON1 = 0X00;
SSPCON1bits.SSPEN = 1;


// CONFIGURAR BRG A velocidad de 100 KHZ con un cristal de 4MHZ
    SPBRG = 0x027;

//CONFIGURACION ADCON1 TODOS SALIDAS DIGITALES
ADCON1=0x0f;

//CONFIGURACION TRISB
TRISB= 0x03;
    TRISD=0x00;
    PORTD=0B00000000;
SEG=0b00000000;

IdleI2C();
StartI2C();
IdleI2C();
WriteI2C(0B11010000);// DIRECCION DEL DS1307 EN ESCLAVO
IdleI2C();
WriteI2C(0B00000000);//INDICA QUE POSICION SE VERA CAMBIADA, EN ESTE CASO LOS SEGUNDOS
IdleI2C();
WriteI2C(SEG);// iNDICA EL SEG. ACTUAL
IdleI2C();
StopI2C();//DEJA DE MANDAR INSTRUCCIONES



do
{

//pROCESO DE lECTURA
IdleI2C();
StartI2C();
IdleI2C();
WriteI2C(0b11010000); // INDICA LA DIRECCION DEL ESCLAVO CON EL BIT 0=0 PARA ESCRIBIR EL APUNTADOR
IdleI2C();
WriteI2C(0b00000000); // PONE EL PUNTERO EN EL REGISTRO 0(SEGUNDOS)
IdleI2C();
RestartI2C(); // REINICIA I2C
IdleI2C();
WriteI2C(0b11010001); // SE COLOCA LA DIRECCION DEL ESCLAVO CON EL BIT 0=1 PARA INDICAR LECTURA
IdleI2C();

SEGUNDOS = ReadI2C(); // GUARDA LA LECTURA DE LOS SEGUNDOS
AckI2C();
IdleI2C();
NotAckI2C();
IdleI2C();
StopI2C();

PORTD=SEGUNDOS;//SE MANDA LA VARIABLE DE SEGUNDOS AL PUERTO D

}while(BAN==0);
   

}

este es el programa con la adaptacion del idleI2C(); basandome en el codigo de jukinch y pues sigo sin ver el cambio en los leds que coloque en el puerto D, que mas puedo estar haciendo mal?! GRACIAS! :)

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Real Time Clock o el DS1307 desatado
« Respuesta #172 en: 02 de Mayo de 2011, 15:32:45 »
Pusiste las resistencias de pullups para el i2c?
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado ZAZA

  • PIC10
  • *
  • Mensajes: 7
Re: Real Time Clock o el DS1307 desatado
« Respuesta #173 en: 02 de Mayo de 2011, 15:47:23 »
Hola jukinch!
si, las resistencias que puse son de 47kohms y van a las lineas de comunicacion scl y sda...verdad?! o son otras?! :S

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Real Time Clock o el DS1307 desatado
« Respuesta #174 en: 03 de Mayo de 2011, 10:52:32 »
yo uso resistencias de 4k7 no de 47k.
Y como vos decís, las pongo de la línea de scl y sda a 5v.
         
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Real Time Clock o el DS1307 desatado
« Respuesta #175 en: 03 de Mayo de 2011, 11:45:05 »
Podrías mostrar un esquemático de como has conectado el ds1307?
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado Wirry85

  • PIC10
  • *
  • Mensajes: 11
Re: Real Time Clock o el DS1307 desatado
« Respuesta #176 en: 26 de Septiembre de 2011, 16:00:09 »
Hola chicos,

Os explico mi problema estoy haciendo un reloj nixie con el DS1307 y el PIC16F1518 (es bastante nuevo).

No se programar mucho con I2C me gustaría que me ayudaran con mi problema.

El problema es el siguiente:

No se como comunicar el DS1307 con el PIC por I2C, como se explica en el primer post hay que poner a 0 ó 1 unos bits para que te de un pulso de 1 seg y poder leer los datos de la memoria del DS1307 pero no lo consigo. No se como funciona.

Me podría hacer alguien una breve explicación de la programación con I2C.

El código:

Código: [Seleccionar]
#include <16F1518.h>
#fuses XT,NOWDT,NOPROTECT
#use delay (clock=8000000)
#use i2c (Master, sda=PIN_C4, scl=PIN_C3)
#use standard_io(C)
#BYTE TRISC = 0x87
#BYTE PORTC = 0x07
//#USE fast_io (A)
//#USE fast_io (B)
                 
                   
int ano,mes,dia,dia_set,hor,hor_2,min,min_2,sec,sec_2;
                 
/******************************************************************************
                              DS1307
******************************************************************************/


void tiempo (byte &ano, byte &mes, byte &dia, byte &dia_set, byte &hor, byte &hor_2, byte &min, byte &min_2, byte &sec, byte &sec_2)
{
   i2c_start();                //Escritura
   i2c_write(0xD0);            //Código de escritura
   i2c_write(0x00);            //Puntero a la primera dirección
   i2c_start();                //Lectura
   i2c_write(0xD1);            //Código de lectura
   
   sec = (i2c_read()&0x7f);     //Lectura de los 4 bits de los segundos
   sec_2 = sec>>4;
   min = (i2c_read()&0x7f);    //Lectura de los 7 bits de los minutos
   min_2 = min>>4;
   hor = (i2c_read()&0x3f);    //Lectura de los 6 bits de los horas
   hor_2 = hor>>4;
   dia_set=(i2c_read()&0x7);   //Lectura de los 3 bits de los dias de la setmana
   dia = (i2c_read()&0x7f);    //Lectura de los 6 bits de los dias
   mes = (i2c_read()&0x1f);    //Lectura de los 5 bits de los meses
   ano = (i2c_read(0)&0xff);   //Lectura de los 8 bits de los años
   i2c_stop();
}
/******************************************************************************
                              PROGRAMA PRINCIPAL
******************************************************************************/
   void main()
   {
                   
    while(1)
    {
      tiempo(ano,mes,dia,dia_set,hor,hor_2,min,min_2,sec,sec_2);     //Lee tiempo del DS1307
     
      output_A(hor_2);
      output_B(hor); 
      output_high(PIN_C0);
      output_high(PIN_C1);
      delay_ms(400);
      output_low(PIN_C0);
      output_low(PIN_C1);   

      output_A(min_2);
      output_B(min);
      output_high(PIN_C2);
      output_high(PIN_C5);
      delay_ms(400);
      output_low(PIN_C2);
      output_low(PIN_C5);

      output_A(sec_2);
      output_B(sec);
      output_high(PIN_C6);
      output_high(PIN_C7);
      delay_ms(400);
      output_low(PIN_C6);
      output_low(PIN_C7);

     }
    }

Muchas gracias.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Real Time Clock o el DS1307 desatado
« Respuesta #177 en: 26 de Septiembre de 2011, 16:02:23 »
Probaste en usar la librería de Red_pic ? Si quieres re-inventar la rueda, por lo menos úsala como base  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Wirry85

  • PIC10
  • *
  • Mensajes: 11
Re: Real Time Clock o el DS1307 desatado
« Respuesta #178 en: 26 de Septiembre de 2011, 16:10:06 »
Probaste en usar la librería de Red_pic ? Si quieres re-inventar la rueda, por lo menos úsala como base  ;-)


Saludos!

Me gustaría pero claro si no se programar en I2C no puedo hacerlo,

Me podéis dar unas nociones básicas por favor.

Gracias.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Real Time Clock o el DS1307 desatado
« Respuesta #179 en: 26 de Septiembre de 2011, 16:21:26 »
Para sacar adelante un proyecto del estilo te recomiendo las siguientes fuentes de información:

Comunicación: Bus I2C

Datasheet del PIC16F1518

Datasheet ds1307

+ Help del compilador que estés utilizando, como para entender como utilizar las funciones que trabajan con el módulo MSSP del microcontrolador.


En la libreria de Red_PIC revisa en detalle la función DS1307Init que configura el registro para obtener el pulso que mencionas.


Saludos!
No contesto mensajes privados, las consultas en el foro