+ Post New Thread
Page 1 of 2 1 2 LastLast
Results 1 to 20 of 26
  1. #1
    Junior Member level 2
    Points: 791, Level: 6

    Join Date
    Mar 2009
    Posts
    20
    Helped
    0 / 0
    Points
    791
    Level
    6

    How to read RTC register values on LCD using C

    Hi,everyone I am using RTC DS1307 and interfacing with PIC16F877A .I dont no how to read RTC register value i.e.,date and time information on LCD.Help me out.If anyone possible give the source code in C.
    I am using MPLAB IDE with hitech C.

    •   AltAdvertisement

        
       

  2. #2
    Full Member level 1
    Points: 2,654, Level: 12
    sajeev's Avatar
    Join Date
    Apr 2005
    Location
    Kerala-India
    Posts
    112
    Helped
    4 / 4
    Points
    2,654
    Level
    12

    how to read rtc

    Quote Originally Posted by joseph raj
    Hi,everyone I am using RTC DS1307 and interfacing with PIC16F877A .I dont no how to read RTC register value i.e.,date and time information on LCD.Help me out.If anyone possible give the source code in C.
    I am using MPLAB IDE with hitech C.

    You fist study and understand the datasheet of ds1307.Iterface the RTC with pic using i2c.If you understand the register structure of RTC then you will how to read from RTC.Do something from your side, we all are here to help...

    Regards

    Sajeev



  3. #3
    Full Member level 4
    Points: 2,681, Level: 12

    Join Date
    Jun 2007
    Posts
    221
    Helped
    10 / 10
    Points
    2,681
    Level
    12

    isis ds1307 simulation not working

    Hi,
    see the attached code.
    This i had done using atmel 89s8252.It's worked.
    you can use the RTC routines and use straight away in your code with littile modification.

    If u have any queries contact me on yviswanathbe@gmail.com.

    Bye.

    Regards,
    Viswanath.


    1 members found this post helpful.

  4. #4
    Full Member level 2
    Points: 2,648, Level: 11

    Join Date
    Jan 2004
    Location
    India, Kerala
    Posts
    128
    Helped
    0 / 0
    Points
    2,648
    Level
    11



  5. #5
    Junior Member level 2
    Points: 791, Level: 6

    Join Date
    Mar 2009
    Posts
    20
    Helped
    0 / 0
    Points
    791
    Level
    6

    displaying integers on character lcd

    Thanks ,i have gone through the RTC datasheets ,but still i am facing problem in understanding it.i tried manipulating many programs available in internet.but still i am not successful.please help



  6. #6
    Full Member level 1
    Points: 1,288, Level: 8

    Join Date
    Mar 2009
    Posts
    109
    Helped
    4 / 4
    Points
    1,288
    Level
    8

    displaying rtc data on lcd

    Firstly, do you understand what I2C means?, and secondly, do you understand what BCD means?



    •   AltAdvertisement

        
       

  7. #7
    Junior Member level 2
    Points: 791, Level: 6

    Join Date
    Mar 2009
    Posts
    20
    Helped
    0 / 0
    Points
    791
    Level
    6

    proteus and rtc

    ya i I2C is a serial bus used to communicate with peripherals.
    BCD is a binary coded decimal format.
    my problem how to address the register contents stored in RTC.
    please help

    Added after 1 hours 46 minutes:

    thanks for the code.
    but its giving an error which says expected ";" for the lines below

    unsigned char clock[] {0x00,0x40,0x17,0x01,0x18,0x12,0x06};
    unsigned char *s[] {"SUN","MON","TUE","WED","THU","FRI","SAT"};even though i have given the ; why is it giving that error.

    help me



  8. #8
    Full Member level 4
    Points: 2,681, Level: 12

    Join Date
    Jun 2007
    Posts
    221
    Helped
    10 / 10
    Points
    2,681
    Level
    12

    how to display rtc info on lcd

    Hi Joseph,

    i dint find the "=" in between the clock[] and content in the {data}.
    have u put the "=" and compiled?

    unsigned char clock[]={0x00,0x40,0x17,0x01,0x18,0x12,0x06};
    unsigned char *s[] ={"SUN","MON","TUE","WED","THU","FRI","SAT"};


    I am using the same code for my application and it's worked.
    Which compiler you r using?

    Regards,
    Viswanath.



  9. #9
    Junior Member level 2
    Points: 791, Level: 6

    Join Date
    Mar 2009
    Posts
    20
    Helped
    0 / 0
    Points
    791
    Level
    6

    working with rtc using i2c bus

    I am using Hitech C in MPlab IDE.



  10. #10
    Full Member level 1
    Points: 1,288, Level: 8

    Join Date
    Mar 2009
    Posts
    109
    Helped
    4 / 4
    Points
    1,288
    Level
    8

    _nop in pic controllers

    are you comfortable that your I2C protocol is functioning? Do you have other devices on that bus that are respondant? Do you have a scope?

    What is the device address for the DS1307?



    •   AltAdvertisement

        
       

  11. #11
    Junior Member level 2
    Points: 791, Level: 6

    Join Date
    Mar 2009
    Posts
    20
    Helped
    0 / 0
    Points
    791
    Level
    6

    rtc i2c in milliseconds

    I am not that sure about I2C protocol functioning.
    I have not used I2C bus i just directly connected sda and scl pin to microcontroller's sda and scl pin i.e.,RC4 and RC3
    the DS1307 device address i am not sure.if you are asking the slave address then it is D0 during read and D1 during write.

    my rtc clock is running as i can see it in proteus simulation but its not displaying its value on lcd.
    help me out its urgent

    Added after 1 hours 30 minutes:

    hi, the error which i posted is removed,but now its giving error for _nop .you have not included subruotine for generating 1 microsecond delay.
    help me out



  12. #12
    Junior Member level 2
    Points: 791, Level: 6

    Join Date
    Mar 2009
    Posts
    20
    Helped
    0 / 0
    Points
    791
    Level
    6

    hitech

    Hi I am using HitechC .and i am using PIC16F877A.
    I want to make a digital clock.
    this is the code given below.
    when compiled there is no error,but its not displaying time and date.
    #include
    void _nop_(void);
    #define delay_us _nop_(); //generates 1 microsecond

    #define LCD PORTD


    #define RS RA2 //connect p0.0 to rs pin of lcd
    #define EN RA0 //connect p0.1 to en pin of lcd
    #define RW RA1

    #define SCK RC3 //serial clock pin
    #define SDA RC4 //serial data pin

    #define SCKHIGH SCK=1
    #define SCKLOW SCK=0
    #define SDAHIGH SDA=1
    #define SDALOW SDA=0

    void integer_lcd(int);
    void init_lcd(void);
    void cmd_lcd(unsigned char);
    void write_lcd(unsigned char);
    void display_lcd(unsigned char *s);
    void delay_ms(unsigned int);

    void start(void);
    void stop(void);
    void send_byte(unsigned char);
    unsigned char receive_byte(unsigned char);
    void write_i2c(unsigned char,unsigned char,unsigned char);
    unsigned char read_i2c(unsigned char,unsigned char);

    //clock[]={seconds,minutes,hours,day_of_week,date,month,yea r}

    unsigned char clock[] = {0x00,0x40,0x17,0x01,0x18,0x12,0x06};
    const unsigned char *s[] = {"SUN","MON","TUE","WED","THU","FRI","SAT"};

    unsigned char slave_ack,add=0,c,k;
    unsigned int num;



    // Real Time Clock Mode
    void main(void)
    {
    const unsigned char *temp;
    ADCON1=0x06;
    init_lcd();
    cmd_lcd(0x01);
    //display_lcd("UTL");
    //delay_ms(1000);
    TRISA=0;
    TRISD=0;
    TRISC=0xFF;
    start();

    while(add<=6) //update real time clock
    {
    write_i2c(0xd0,add,clock[add]);
    add++;
    }
    stop();


    while(1)
    {

    c=read_i2c(0xD0,0x02);//read hours register and display on LCD
    write_lcd((c/16)+48);
    write_lcd((c%16)+48);
    write_lcd(':');

    c=read_i2c(0xD0,0x01);//read minutes register and display on LCD
    write_lcd((c/16)+48);
    write_lcd((c%16)+48);
    write_lcd(':');

    delay_ms(10);
    c=read_i2c(0xD0,0x00);//read seconds register and display on LCD
    write_lcd((c/16)+48);
    write_lcd((c%16)+48);
    write_lcd(' ');


    temp=s[read_i2c(0xD0,0x03)];
    display_lcd(temp);//read day register and display
    cmd_lcd(0xc0);
    c=read_i2c(0xD0,0x04);//read date register and display on LCD
    write_lcd((c/16)+48);
    write_lcd((c%16)+48);
    write_lcd('/');

    c=read_i2c(0xD0,0x05);//read month register and display on LCD
    write_lcd((c/16)+48);
    write_lcd((c%16)+48);
    write_lcd('/');

    write_lcd('2');
    write_lcd('0');
    c=read_i2c(0xD0,0x06);//read year register and display on LCD
    write_lcd((c/16)+48);
    write_lcd((c%16)+48);
    delay_ms(100);
    cmd_lcd(0x01);
    }
    }


    //starts i2c, if both SCK & SDA are idle
    void start(void)
    {
    if(SCK==0) //check SCK. if SCK busy, return else SCK idle
    return;
    if(SDA==0) //check SDA. if SDA busy, return else SDA idle
    return;
    SDALOW; //data low
    delay_us;
    SCKLOW; //clock low
    delay_us;
    return;
    }

    //stops i2c, releasing the bus
    void stop(void)
    {
    SDALOW; //data low
    SCKHIGH; //clock high
    delay_us;
    SDAHIGH; //data high
    delay_us;
    return;
    }

    /*void start(void)
    {
    SCK=0;
    SDA=1;
    delay_ms(1);
    SDA=0;
    return;
    }

    void stop(void)
    {

    delay_ms(1);
    SDA=0;
    SCK=1;
    delay_ms(1);
    SDA=1;
    delay_ms(1);
    SCK=0;
    return;
    }*/
    //transmits one byte of data to i2c bus
    void send_byte(unsigned char c)
    {
    unsigned mask=0x80;
    do //transmits 8 bits
    {
    if(c&mask) //set data line accordingly(0 or 1)
    SDAHIGH; //data high
    else
    SDALOW;//data low
    SCKHIGH; //clock high
    delay_us;
    SCKLOW; //clock low
    delay_us;
    mask/=2; //shift mask
    }while(mask>0);
    SDAHIGH; //release data line for acknowledge
    SCKHIGH ; //send clock for acknowledge
    delay_us;
    slave_ack=SDA; //read data pin for acknowledge
    SCKLOW ; //clock low
    delay_us;
    return;
    }

    //receives one byte of data from i2c bus
    unsigned char receive_byte(unsigned char master_ack)
    {
    unsigned char c=0,mask=0x80;
    do //receive 8 bits
    {
    SCKHIGH ;//clock high
    delay_us;
    if(SDA==1) //read data
    c|=mask; //store data
    SCKLOW ; //clock low
    delay_us ;
    mask/=2; //shift mask
    }
    while(mask>0);
    if(master_ack==1)
    SDAHIGH ;//don't acknowledge
    else
    SDALOW; //acknowledge
    SCKHIGH ;//clock high
    delay_us;
    SCKLOW; //clock low
    delay_us;
    SDAHIGH ;//data high
    return c;
    }



    //writes one byte of data(c) to slave device(device_id) at given address(location)
    void write_i2c(unsigned char device_id,unsigned char location,unsigned char c)
    {
    do
    {
    start(); //starts i2c bus
    send_byte(device_id); //select slave device
    if(slave_ack==1) //if acknowledge not received, stop i2c bus
    stop();
    }while(slave_ack==1); //loop until acknowledge is received
    send_byte(location); //send address location
    send_byte(c); //send data to i2c bus
    stop(); //stop i2c bus
    delay_ms(4);
    return;
    }

    //reads one byte of data(c) from slave device(device_id) at given address(location)
    unsigned char read_i2c(unsigned char device_id,unsigned char location)
    {
    unsigned char c;
    do
    {
    start(); //starts i2c bus
    send_byte(device_id); //select slave device
    if(slave_ack==1) //if acknowledge not received, stop i2c bus
    stop();
    }while(slave_ack==1); //loop until acknowledge is received
    send_byte(location); //send address location
    stop(); //stop i2c bus
    start(); //starts i2c bus
    send_byte(device_id+1); //select slave device in read mode
    c=receive_byte(1); //receive data from i2c bus
    stop(); //stop i2c bus
    return c;
    }

    /*display of 16bit(integers) values on LCD
    void integer_lcd(int n)
    {
    unsigned char c[6];
    unsigned int i=0;
    if(n<0)
    {
    write_lcd('-');
    n=-n;
    }
    if(n==0)
    write_lcd('0');
    while(n>0)//Split integer to 2 bytes and send on 8bit line.
    {
    c[i++]=(n%10)+48;
    n/=10;
    }
    while(i-->=1)
    write_lcd(c[i]);
    }*/

    //initialize lcd
    void init_lcd(void)
    {
    //delay_ms(10); //delay 10 milliseconds
    ADCON1=0x06;
    TRISA=0;
    TRISD=0;
    cmd_lcd(0x38); //8 bit initialize, 5x7 character font, 16x2 display
    cmd_lcd(0x0E); //lcd on, cursor on
    cmd_lcd(0x06); //right shift cursor automatically after each character is displayed
    cmd_lcd(0x01); //clear lcd
    return;
    }

    //transmit command or instruction to lcd
    void cmd_lcd(unsigned char c)
    {
    LCD=c;
    RS=0;
    RW=0;
    EN=1;
    delay_ms(20);
    EN=0;
    return;
    }

    //transmit a character to be displayed on lcd
    void write_lcd(unsigned char c)
    {
    LCD=c;
    RS=1;
    RW=0;
    EN=1;
    delay_ms(20);
    EN=0;
    return;
    }

    //transmit a string to be displayed on lcd
    void display_lcd(unsigned char *s)
    {
    while(*s)
    write_lcd(*s++);
    return;
    }

    //generates delay in milli seconds
    void delay_ms(unsigned int i)
    {
    unsigned int j;
    while(i-->0)
    {
    for(j=0;j<500;j++)
    {
    ;
    }
    }
    return;
    }

    void _nop_(void)
    {
    unsigned int i;
    for(i=0;i<10;i++)
    {
    ;
    }
    return;
    }


    the display which i get on lcd is 00:00:00 SUN 00/00/00
    anyone check this out and reply to me immediately.
    i think its only reading initial value, but not present value.
    help me out???



  13. #13
    Advanced Member level 5
    Points: 14,575, Level: 29
    blueroomelectronics's Avatar
    Join Date
    Sep 2006
    Location
    Toronto, Canada
    Posts
    1,686
    Helped
    184 / 184
    Points
    14,575
    Level
    29

    integer_lcd

    "immediately" wow what's the rush? Are you offering compensation?

    Please use code tags else your formatting is lost.



  14. #14
    Junior Member level 2
    Points: 791, Level: 6

    Join Date
    Mar 2009
    Posts
    20
    Helped
    0 / 0
    Points
    791
    Level
    6

    rtc display

    ya its urgent.Because i am doing project on it,Our last date is near by.
    help me????



  15. #15
    Full Member level 4
    Points: 2,681, Level: 12

    Join Date
    Jun 2007
    Posts
    221
    Helped
    10 / 10
    Points
    2,681
    Level
    12

    display rtc on lcd c code

    Hi Joseph,

    make sure that ur lcd is working fine.
    First check the lcd alone(biapass all other circuits like RTC etc) and send some characters continuously to the lcd.
    and u need to send data to the lcd character by character(Ascii equivalent will be given in the lcd datasheet.for example if u wanna print integer 2 u need to send 0x32 on the lcd data port).make sure u r doing the same.

    debug and see in which format u r getting the data from the RTC.based on that u manipulate to send data to lcd.

    hope u understand?
    reply me with ur feedbacks?

    Regards,
    Y.Viswanath

    Added after 4 minutes:

    upload ur schematic.


    1 members found this post helpful.

  16. #16
    Junior Member level 2
    Points: 791, Level: 6

    Join Date
    Mar 2009
    Posts
    20
    Helped
    0 / 0
    Points
    791
    Level
    6

    Re: RTC display problem

    Quote Originally Posted by yviswanathbe
    Hi Joseph,

    make sure that ur lcd is working fine.
    First check the lcd alone(biapass all other circuits like RTC etc) and send some characters continuously to the lcd.
    and u need to send data to the lcd character by character(Ascii equivalent will be given in the lcd datasheet.for example if u wanna print integer 2 u need to send 0x32 on the lcd data port).make sure u r doing the same.

    debug and see in which format u r getting the data from the RTC.based on that u manipulate to send data to lcd.

    hope u understand?
    reply me with ur feedbacks?

    Regards,
    Y.Viswanath

    Added after 4 minutes:

    thank u vishwanath for your utmost patience to go through the code.
    my lcd is working fine i had checked it.
    while displaying rtc values ,i can see changes on port connected to lcd,but the rs and en ,there is no change and nothing is diaplayed on lcd.
    is it because of delay?
    how to generate the i microsecond delay?
    reply
    upload ur schematic.



    •   AltAdvertisement

        
       

  17. #17
    Full Member level 4
    Points: 2,681, Level: 12

    Join Date
    Jun 2007
    Posts
    221
    Helped
    10 / 10
    Points
    2,681
    Level
    12

    Re: RTC display problem

    Hi joseph,

    generating 1 microsecond delay is easy and depends on your crystal frequency.
    for example if yu are using 12MHz crystal,in 8051 architecture the time it takes to execute 1 instruction is 1uSec(T=12/12MHz=1uSec;because 1 machine cycle is 12 clock cycles).
    Time Delay Calcualation:
    i am assuming 16-bit timer,so 2 power 16 is 65536(in Hex 0xFFFF)
    assume the values u need to load is some x;
    (FFFF-x)*1uSec(T calculated above)=1uSec(desired),after manipulating u will get
    x=0xFFFE
    load this value in the timer registers u will get 1uSec delay.

    Hope this help u.try implmenting the same with ur microcontroller.

    and regarding RTC,i am not able to guess what is ur actual problem.
    I have done it in 8051,not in PIC.i donno pic.
    anyway i will try to resolve ur problem.
    Take care
    bye



  18. #18
    Junior Member level 2
    Points: 791, Level: 6

    Join Date
    Mar 2009
    Posts
    20
    Helped
    0 / 0
    Points
    791
    Level
    6

    Re: RTC display problem

    Thanks a lot vishwanath for your reply.
    the solution you have given to generate i microsecond delay was really helpful.
    did your real time value displayed on lcd?
    the thing is even after disconnecting rtc i am getting the display as 00:00:00 SUN
    00/00/2000
    I dont think data transfer is going on between rtc and mc?
    why hav you used c/16+48?
    reply.???



  19. #19
    Full Member level 4
    Points: 2,681, Level: 12

    Join Date
    Jun 2007
    Posts
    221
    Helped
    10 / 10
    Points
    2,681
    Level
    12

    Re: RTC display problem

    Hi Joseph,

    why hav you used c/16+48?
    if yu want to send data to LCD(Suppose if u want to print 0 on lcd,u need to send 48(dec)->0x30(hex)->ascii equivalent is 0 on lcd data port).

    so i am adding 48 to the result and sending to the LCD.

    //clock[] ={seconds,minutes,hours,day_of_week,date,month,yea r}
    unsigned char clock[] = {0x00,0x40,0x17,0x01,0x18,0x12,0x06};

    here i am freezing some fixed time and date.please follow the above comments.After power on this time will be displayed on the lcd and will start updating.

    y dont u post ur schematic?
    i think ur controller operates with 3.3V power supply and RTC ,LCD with 5V.
    May be voltage level is not sufficient for the controller to drive the lcd.
    How the controller port pins are configured.Pushpull or Open Collector?
    connect Pull-up resistors or Buffer IC's(like 74hc541,74hc245) in between the Controller port and LCD port.
    check the voltage levels coming from Microcontroller using an oscilloscope.

    By the way where are yu from?

    Regards,
    Viswanath.



  20. #20
    Junior Member level 2
    Points: 791, Level: 6

    Join Date
    Mar 2009
    Posts
    20
    Helped
    0 / 0
    Points
    791
    Level
    6

    Re: RTC display problem

    Hi i am from Shimoga,doing my enggineering in bangalore.
    well reading of rtc register is still a question.
    because even after disconnecting rtc in ISIS simulation it still displays 00:00:00 SUN 00/00/2000
    please help?



--[[ ]]--