Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

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 1:printf("SUN-");
59 break;
60 case 2:printf("MON-");
61 break;
62 case 3:printf("TUE-");
63 break;
64 case 4:printf("WED-");
65 break;
66 case 5:printf("THE-");
67 break;
68 case 6:printf("FRI-");
69 break;
70 case 7:printf("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

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top