Driver to interfacing the rtc ds1307 with pic

Status
Not open for further replies.

john_a

Newbie level 6
Joined
May 11, 2004
Messages
11
Helped
1
Reputation
2
Reaction score
1
Trophy points
1,283
Activity points
72
iam using ccs compiler iwant adriver to interfacing the rtc ds1307 with pic
 

rtc_set_datetime

You can use this code . It display with HyperTerminal.


1 #include <16F84A.h>
2 #fuses XT,NOWDT,NOPROTECT
3 #use delay(clock=4000000)
4 #use rs232(baud=9600, xmit=PIN_A1, rcv=PIN_A0)
5 #define DS1307_SDA PIN_B1
6 #define DS1307_SCL PIN_B0
7 #use i2c(master, sda=DS1307_SDA, scl=DS1307_SCL)
8
9 byte sec,min,hour,day,date,month,year;
10
11 //==========================
12 // initial DS1307
13 //==========================
14 void init_DS1307()
15 {
16 output_float(DS1307_SCL);
17 output_float(DS1307_SDA);
18 }
19 //==========================
20 // write data one byte to
21 // DS1307
22 //==========================
23 void write_DS1307(byte address, BYTE data)
24 {
25 short int status;
26 i2c_start();
27 i2c_write(0xd0);
28 i2c_write(address);
29 i2c_write(data);
30 i2c_stop();
31 i2c_start();
32 status=i2c_write(0xd0);
33 while(status==1)
34 {
35 i2c_start();
36 status=i2c_write(0xd0);
37 }
38 }
39 //==========================
40 // read data one byte from DS1307
41 //==========================
42 BYTE read_DS1307(byte address)
43 {
44 BYTE data;
45 i2c_start();
46 i2c_write(0xd0);
47 i2c_write(address);
48 i2c_start();
49 i2c_write(0xd1);
50 data=i2c_read(0);
51 i2c_stop();
52 return(data);
53 }
54 void show_date(byte day)
55 {
56 switch (day)
57 {
58 case 1rintf("SUN-");
59 break;
60 case 2rintf("MON-");
61 break;
62 case 3rintf("TUE-");
63 break;
64 case 4rintf("WED-");
65 break;
66 case 5rintf("THE-");
67 break;
68 case 6rintf("FRI-");
69 break;
70 case 7rintf("SAT-");
71 break;
72 }
73 }
74
75 //==== main program ============
76 void main()
77 {
78 init_ds1307();
79 write_ds1307(0,0x50); // set second to 00 and enable clock(bit7=0)
80 write_ds1307(1,0x59); // set minute
81 write_ds1307(2,0x23); // set hour
82 write_ds1307(3,0x04); // set day
83 write_ds1307(4,0x03); // set date
84 write_ds1307(5,0x03); // set month
85 write_ds1307(6,0x04); // year
86 //
87 while(true)
88 {
89 sec=read_ds1307(0);
90 min=read_ds1307(1);
91 hour=read_ds1307(2);
92 day=read_ds1307(3);
93 date=read_ds1307(4);
94 month=read_ds1307(5);
95 year=read_ds1307(6);
96 printf("\f");
97 printf("%2X:%2X:%2X\r\n",hour,min,sec);
98 show_date(day);
99 printf("%2X/%2X/20%2X",date,month,year);
100 delay_ms(250);
101 }
102 }
 

init_ds1307()

I have been use DS1307 and PIC. It's very stablish
 

rtc_write_nvr

My ds1307 driver.


#ifndef RTC_SCL

#define RTC
#define RTC_SDA PIN_C4
#define RTC_SCL PIN_C3

#endif

#define rtc_seconds 0
#define rtc_minutes 1
#define rtc_hours 2
#define rtc_day 3
#define rtc_date 4
#define rtc_month 5
#define rtc_year 6
#define rtc_control 7
#define rtc_rambase 8

#use i2c(master,sda=RTC_SDA, scl=RTC_SCL, SLOW)

void init_ds1307() {
output_float(rtc_scl);
output_float(rtc_sda);
}

void write_ds1307(byte address, byte data) {

i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_write(data);
i2c_stop();
// delay_ms(11);
}

byte read_ds1307(byte address) {
byte data;

i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_start();
i2c_write(0xd1);
// while(!i2c_poll()) ;
data=i2c_read(0);
i2c_stop();
return(data);
}


#separate int8 ToBCD(int8 in)
{
return((in/10)<<4 + in%10);
}

#separate int8 ToBin(int8 in)
{
return((in>>4)*10 + (in & 0x0F));
}

void rtc_set_datetime(byte date,byte mth,byte year,byte day,byte hr,byte min, byte secnd) {
write_ds1307(rtc_date,ToBCD(date));
write_ds1307(rtc_month,ToBCD(mth));
write_ds1307(rtc_year,ToBCD(year));
write_ds1307(rtc_day,day);
write_ds1307(rtc_hours,ToBCD(hr));
write_ds1307(rtc_minutes,ToBCD(min));
write_ds1307(rtc_seconds,ToBCD(secnd));
}

void rtc_get_date(byte & date,byte & mth,byte & year,byte & day) {
date = ToBin(read_ds1307(rtc_date));
mth = ToBin(read_ds1307(rtc_month));
year = ToBin(read_ds1307(rtc_year));
day = read_ds1307(rtc_day);
}

void rtc_init() {

write_ds1307(rtc_control,0x00);
rtc_set_datetime(0,0,0,1,0,0,0);
}

void rtc_get_time(byte & hr,byte & min,byte & sec) {
hr = ToBin(read_ds1307(rtc_hours));
min = ToBin(read_ds1307(rtc_minutes));
sec = ToBin(read_ds1307(rtc_seconds));
}

void rtc_write_nvr(byte address,byte data) {
write_ds1307(address + rtc_rambase,data);
}

byte rtc_read_nvr(byte address) {
return(read_ds1307(address +rtc_rambase));
}
 

Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…