6 Replies Latest reply on Aug 19, 2016 9:41 AM by user_242978793

    RTC DS13017 with Pioneer kit-042

    sanya.serdyuk

      Hey guys, I'm trying to interface RTC with pioneer kit cy8ckit-042 CY8C4245AXI-483. Tried this project https://www.element14.com/community/thread/25071/l/psoc-4-pioneer-kit-community-project035-uart-i2c-and-spi-joystick-example/
      and added Char LCD, but it doesn't update time, just prints somethings like 00:00:86 and doesn't changes. And I don't understand where I can set my current time?

         

      Here is my project

        • 1. Re: RTC DS13017 with Pioneer kit-042
          user_1377889

          I cannot see any initialization code for your RTC as setting time, start, 24/12hour format. Look into RTC's datasheet

             

          I always avoided mixing the basic byte-I2C routines and the buffered APIs.

             

           

             

          Bob

          • 2. Re: RTC DS13017 with Pioneer kit-042
            user_242978793

            Here is an Arduino code example to write to the DS1307 and set the time. You will need to convert it to PSOC Creator code.

               

            Copy and past this into the Arduino IDE and burn to the board. For this i am using an ACEDuino that has a ATMega 328P.
            To set the date and time is all done is the serial monitor, which is the easiest i have found. 

               

            ///////////////////////////////////////////
            // RTC data and time setter              //
            //                                       //
            // This sample program allows the user   //
            // to set the date and time of an RTC    //
            // using I2C.                            //
            //                                       //
            // Codes by:                             //
            // eGizmo Mechatronix Central            //
            // Taft, Manila, Philippines             //
            // http://www.egizmo.com                 //
            // April 15, 2013                        //
            ///////////////////////////////////////////

            #include <Wire.h>
            const int DS1307 = 0x68; // Address of DS1307 see data sheets
            const char* days[] =
            {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
            const char* months[] =
            {"January", "February", "March", "April", "May", "June", "July", "August","September", "October", "November", "December"};
             
            // Initializes all values: 
            byte second = 0;
            byte minute = 0;
            byte hour = 0;
            byte weekday = 0;
            byte monthday = 0;
            byte month = 0;
            byte year = 0;

            void setup() {
              Wire.begin();
              Serial.begin(9600);
              delay(2000); // This delay allows the MCU to read the current date and time.
             
              Serial.print("The current date and time is: ");
              printTime();
              Serial.println("Please change to newline ending the settings on the lower right of the Serial Monitor");
              Serial.println("Would you like to set the date and time now? Y/N");
             
              while (!Serial.available()) delay(10);
              if (Serial.read() == 'y' || Serial.read() == 'Y')
             
              // This set of functions allows the user to change the date and time
              {
                Serial.read();
                setTime();
                Serial.print("The current date and time is now: ");
                printTime();
              }
             
             
              Serial.println("Thank you.");
            }

            // Continuous function for converting bytes to decimals and vice versa
            void loop() {
            }
            byte decToBcd(byte val) {
              return ((val/10*16) + (val%10));
            }
            byte bcdToDec(byte val) {
              return ((val/16*10) + (val%16));
            }


            // This set of codes is allows input of data
            void setTime() {
              Serial.print("Please enter the current year, 00-99. - ");
              year = readByte();
              Serial.println(year);
              Serial.print("Please enter the current month, 1-12. - ");
              month = readByte();
              Serial.println(months[month-1]);
              Serial.print("Please enter the current day of the month, 1-31. - ");
              monthday = readByte();
              Serial.println(monthday);
              Serial.println("Please enter the current day of the week, 1-7.");
              Serial.print("1 Sun | 2 Mon | 3 Tues | 4 Weds | 5 Thu | 6 Fri | 7 Sat - ");
              weekday = readByte();
              Serial.println(days[weekday-1]);
              Serial.print("Please enter the current hour in 24hr format, 0-23. - ");
              hour = readByte();
              Serial.println(hour);
              Serial.print("Please enter the current minute, 0-59. - ");
              minute = readByte();
              Serial.println(minute);
              second = 0;
              Serial.println("The data has been entered.");
             
              // The following codes transmits the data to the RTC
              Wire.beginTransmission(DS1307);
              Wire.write(byte(0));
              Wire.write(decToBcd(second));
              Wire.write(decToBcd(minute));
              Wire.write(decToBcd(hour));
              Wire.write(decToBcd(weekday));
              Wire.write(decToBcd(monthday));
              Wire.write(decToBcd(month));
              Wire.write(decToBcd(year));
              Wire.write(byte(0));
              Wire.endTransmission();
              // Ends transmission of data
            }


            byte readByte() {
              while (!Serial.available()) delay(10);
              byte reading = 0;
              byte incomingByte = Serial.read();
              while (incomingByte != '\n') {
                if (incomingByte >= '0' && incomingByte <= '9')
                  reading = reading * 10 + (incomingByte - '0');
                else;
                incomingByte = Serial.read();
              }
              Serial.flush();
              return reading;
            }


            void printTime() {
              char buffer[3];
              const char* AMPM = 0;
              readTime();
              Serial.print(days[weekday-1]);
              Serial.print(" ");
              Serial.print(months[month-1]);
              Serial.print(" ");
              Serial.print(monthday);
              Serial.print(", 20");
              Serial.print(year);
              Serial.print(" ");
              if (hour > 12) {
                hour -= 12;
                AMPM = " PM";
              }
              else AMPM = " AM";
              Serial.print(hour);
              Serial.print(":");
              sprintf(buffer, "%02d", minute);
              Serial.print(buffer);
              Serial.println(AMPM);
            }


            void readTime() {
              Wire.beginTransmission(DS1307);
              Wire.write(byte(0));
              Wire.endTransmission();
              Wire.requestFrom(DS1307, 7);
              second = bcdToDec(Wire.read());
              minute = bcdToDec(Wire.read());
              hour = bcdToDec(Wire.read());
              weekday = bcdToDec(Wire.read());
              monthday = bcdToDec(Wire.read());
              month = bcdToDec(Wire.read());
              year = bcdToDec(Wire.read());
            }

            • 3. Re: RTC DS13017 with Pioneer kit-042
              user_242978793

              Here is some more code.

                 

               

                 

              To reset the time use this function. You will have to calibrate the value for each register manually before suing this function. This may not be the most optimized means to set the time again this is the most straight forward method. This is all BCD so there is not much calculation involved if you want the hours to be 12 then just pass 0x12 to that corresponding register.

                 

              void reset_time()
              {    
                  i2c_start();
                  i2c_write(SLAVE_DS1307|WRITE);
                  i2c_write(0x00);    // Address of the first register
                  i2c_write(0x00);    // Seconds register
                  i2c_write(0x00);    // Minutes register
                  i2c_write(0x01);    // Hours register
                  i2c_write(0x01);    // Days register
                  i2c_write(0x01);    // Date register
                  i2c_write(0x01);    // Month register
                  i2c_write(0x00);    // Year register
                  i2c_stop();
                  return;

              • 4. Re: RTC DS13017 with Pioneer kit-042
                martin.thuering_1536551

                Did someone ever translate from arduino to psoc?

                • 5. Re: RTC DS13017 with Pioneer kit-042
                  user_242978793

                  Yes I have see a Cypress Document on that issue.