Перевод DS1307 библиотеки в v1.0
- Войдите на сайт для отправки комментариев
Всем здравствуйте!
Есть очень удобная и простая в использовании библиотека для часов DS1307.
Взято отсюда:arduino-info.wikispaces.com/RTC
DS1307.h:
01 | /* |
02 | DS1307.h - library for DS1307 rtc |
03 | */ |
04 |
05 | // ensure this library description is only included once |
06 | #ifndef DS1307_h |
07 | #define DS1307_h |
08 |
09 | // include types & constants of Wiring core API |
10 | #include <WConstants.h> |
11 |
12 | // include types & constants of Wire ic2 lib |
13 | #include <../Wire/Wire.h> |
14 |
15 | #define DS1307_SEC 0 |
16 | #define DS1307_MIN 1 |
17 | #define DS1307_HR 2 |
18 | #define DS1307_DOW 3 |
19 | #define DS1307_DATE 4 |
20 | #define DS1307_MTH 5 |
21 | #define DS1307_YR 6 |
22 |
23 | #define DS1307_BASE_YR 2000 |
24 |
25 | #define DS1307_CTRL_ID B1101000 //DS1307 |
26 |
27 | // Define register bit masks |
28 | #define DS1307_CLOCKHALT B10000000 |
29 |
30 | #define DS1307_LO_BCD B00001111 |
31 | #define DS1307_HI_BCD B11110000 |
32 |
33 | #define DS1307_HI_SEC B01110000 |
34 | #define DS1307_HI_MIN B01110000 |
35 | #define DS1307_HI_HR B00110000 |
36 | #define DS1307_LO_DOW B00000111 |
37 | #define DS1307_HI_DATE B00110000 |
38 | #define DS1307_HI_MTH B00110000 |
39 | #define DS1307_HI_YR B11110000 |
40 |
41 | // library interface description |
42 | class DS1307 |
43 | { |
44 | // user-accessible "public" interface |
45 | public : |
46 | DS1307(); |
47 | void get ( int *, boolean); |
48 | int get ( int , boolean); |
49 | void set ( int , int ); |
50 | void start( void ); |
51 | void stop( void ); |
52 |
53 | // library-accessible "private" interface |
54 | private : |
55 | byte rtc_bcd[7]; // used prior to read/set ds1307 registers; |
56 | void read( void ); |
57 | void save( void ); |
58 | }; |
59 |
60 | extern DS1307 RTC; |
61 |
62 | #endif |
DS1307.cpp:
001 | extern "C" { |
002 | #include <../Wire/Wire.h> |
003 | } |
004 | #include "DS1307.h" |
005 |
006 | DS1307::DS1307() |
007 | { |
008 | Wire.begin(); |
009 | } |
010 |
011 | DS1307 RTC=DS1307(); |
012 |
013 | // PRIVATE FUNCTIONS |
014 |
015 | // Aquire data from the RTC chip in BCD format |
016 | // refresh the buffer |
017 | void DS1307::read( void ) |
018 | { |
019 | // use the Wire lib to connect to tho rtc |
020 | // reset the resgiter pointer to zero |
021 | Wire.beginTransmission(DS1307_CTRL_ID); |
022 | Wire.send(0x00); |
023 | Wire.endTransmission(); |
024 |
025 | // request the 7 bytes of data (secs, min, hr, dow, date. mth, yr) |
026 | Wire.requestFrom(DS1307_CTRL_ID, 7); |
027 | for ( int i=0; i<7; i++) |
028 | { |
029 | // store data in raw bcd format |
030 | rtc_bcd[i]=Wire.receive(); |
031 | } |
032 | } |
033 |
034 | // update the data on the IC from the bcd formatted data in the buffer |
035 | void DS1307::save( void ) |
036 | { |
037 | Wire.beginTransmission(DS1307_CTRL_ID); |
038 | Wire.send(0x00); // reset register pointer |
039 | for ( int i=0; i<7; i++) |
040 | { |
041 | Wire.send(rtc_bcd[i]); |
042 | } |
043 | Wire.endTransmission(); |
044 | } |
045 |
046 |
047 | // PUBLIC FUNCTIONS |
048 | void DS1307:: get ( int *rtc, boolean refresh) // Aquire data from buffer and convert to int, refresh buffer if required |
049 | { |
050 | if (refresh) read(); |
051 | for ( int i=0;i<7;i++) // cycle through each component, create array of data |
052 | { |
053 | rtc[i]= get (i, 0); |
054 | } |
055 | } |
056 |
057 | int DS1307:: get ( int c, boolean refresh) // aquire individual RTC item from buffer, return as int, refresh buffer if required |
058 | { |
059 | if (refresh) read(); |
060 | int v=-1; |
061 | switch (c) |
062 | { |
063 | case DS1307_SEC: |
064 | v=(10*((rtc_bcd[DS1307_SEC] & DS1307_HI_SEC)>>4))+(rtc_bcd[DS1307_SEC] & DS1307_LO_BCD); |
065 | break ; |
066 | case DS1307_MIN: |
067 | v=(10*((rtc_bcd[DS1307_MIN] & DS1307_HI_MIN)>>4))+(rtc_bcd[DS1307_MIN] & DS1307_LO_BCD); |
068 | break ; |
069 | case DS1307_HR: |
070 | v=(10*((rtc_bcd[DS1307_HR] & DS1307_HI_HR)>>4))+(rtc_bcd[DS1307_HR] & DS1307_LO_BCD); |
071 | break ; |
072 | case DS1307_DOW: |
073 | v=rtc_bcd[DS1307_DOW] & DS1307_LO_DOW; |
074 | break ; |
075 | case DS1307_DATE: |
076 |
077 | |
078 | v=rtc_bcd[DS1307_DATE]/16 * 10 + rtc_bcd[DS1307_DATE] % 16; |
079 | |
080 | break ; |
081 | case DS1307_MTH: |
082 | v=(10*((rtc_bcd[DS1307_MTH] & DS1307_HI_MTH)>>4))+(rtc_bcd[DS1307_MTH] & DS1307_LO_BCD); |
083 | break ; |
084 | case DS1307_YR: |
085 |
086 | |
087 | v=2000 + rtc_bcd[DS1307_YR]/16 * 10 + rtc_bcd[DS1307_YR] % 16; |
088 | |
089 | break ; |
090 |
091 | } // end switch |
092 | return v; |
093 | } |
094 |
095 | void DS1307:: set ( int c, int v) // Update buffer, then update the chip |
096 | { |
097 | switch (c) |
098 | { |
099 | case DS1307_SEC: |
100 | if (v<60 && v>-1) |
101 | { |
102 | //preserve existing clock state (running/stopped) |
103 | int state=rtc_bcd[DS1307_SEC] & DS1307_CLOCKHALT; |
104 | rtc_bcd[DS1307_SEC]=state | ((v / 10)<<4) + (v % 10); |
105 | } |
106 | break ; |
107 | case DS1307_MIN: |
108 | if (v<60 && v>-1) |
109 | { |
110 | rtc_bcd[DS1307_MIN]=((v / 10)<<4) + (v % 10); |
111 | } |
112 | break ; |
113 | case DS1307_HR: |
114 | // TODO : AM/PM 12HR/24HR |
115 | if (v<24 && v>-1) |
116 | { |
117 | rtc_bcd[DS1307_HR]=((v / 10)<<4) + (v % 10); |
118 | } |
119 | break ; |
120 | case DS1307_DOW: |
121 | if (v<8 && v>-1) |
122 | { |
123 | rtc_bcd[DS1307_DOW]=v; |
124 | } |
125 | break ; |
126 | case DS1307_DATE: |
127 | if (v<32 && v>-1) |
128 | { |
129 | rtc_bcd[DS1307_DATE]=((v / 10)<<4) + (v % 10); |
130 | } |
131 | break ; |
132 | case DS1307_MTH: |
133 | if (v<13 && v>-1) |
134 | { |
135 | rtc_bcd[DS1307_MTH]=((v / 10)<<4) + (v % 10); |
136 | } |
137 | break ; |
138 | case DS1307_YR: |
139 | if (v<50 && v>-1) |
140 | { |
141 | rtc_bcd[DS1307_YR]=((v / 10)<<4) + (v % 10); |
142 | } |
143 | break ; |
144 | } // end switch |
145 | save(); |
146 | } |
147 |
148 | void DS1307::stop( void ) |
149 | { |
150 | // set the ClockHalt bit high to stop the rtc |
151 | // this bit is part of the seconds byte |
152 | rtc_bcd[DS1307_SEC]=rtc_bcd[DS1307_SEC] | DS1307_CLOCKHALT; |
153 | save(); |
154 | } |
155 |
156 | void DS1307::start( void ) |
157 | { |
158 | // unset the ClockHalt bit to start the rtc |
159 | // TODO : preserve existing seconds |
160 | rtc_bcd[DS1307_SEC]=0; |
161 | save(); |
162 | } |
Тестовый скетч:
01 | /*Reads the value from a Real Time Clock (RTC) DS1307 and displays it in the serial monitor |
02 | * |
03 | *Created by D. Sjunnesson 1scale1.com d.sjunnesson (at) 1scale1.com |
04 | * |
05 | *Created with combined information from |
06 | *<a data-cke-saved-href="<a href="http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1180908809" rel="nofollow">http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1180908809</a>" href="<a href="http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1180908809" rel="nofollow">http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1180908809</a>" rel="nofollow"><a href="http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1180908809" rel="nofollow">http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1180908809</a></a> |
07 | *<a data-cke-saved-href="<a href="http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1191209057" rel="nofollow">http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1191209057</a>" href="<a href="http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1191209057" rel="nofollow">http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1191209057</a>" rel="nofollow"><a href="http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1191209057" rel="nofollow">http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1191209057</a></a> |
08 | * |
09 | * |
10 | *Big credit to mattt (please contact me for a more correct name...) from the Arduino forum |
11 | *which has written the main part of the library which I have modified |
12 | * |
13 | */ |
14 |
15 | #include <WProgram.h> |
16 | #include <Wire.h> |
17 | #include <DS1307.h> // written by mattt on the Arduino forum and modified by D. Sjunnesson |
18 |
19 | void setup() |
20 | { |
21 | Serial.begin(9600); |
22 |
23 | RTC.stop(); |
24 | RTC. set (DS1307_SEC,1); //set the seconds |
25 | RTC. set (DS1307_MIN,23); //set the minutes |
26 | RTC. set (DS1307_HR,12); //set the hours |
27 | RTC. set (DS1307_DOW,4); //set the day of the week |
28 | RTC. set (DS1307_DATE,5); //set the date |
29 | RTC. set (DS1307_MTH,3); //set the month |
30 | RTC. set (DS1307_YR,9); //set the year |
31 | RTC.start(); |
32 |
33 | } |
34 |
35 | void loop() |
36 | { |
37 |
38 | Serial.print(RTC. get (DS1307_HR, true )); //read the hour and also update all the values by pushing in true |
39 | Serial.print( ":" ); |
40 | Serial.print(RTC. get (DS1307_MIN, false )); //read minutes without update (false) |
41 | Serial.print( ":" ); |
42 | Serial.print(RTC. get (DS1307_SEC, false )); //read seconds |
43 | Serial.print( " " ); // some space for a more happy life |
44 | Serial.print(RTC. get (DS1307_DATE, false )); //read date |
45 | Serial.print( "/" ); |
46 | Serial.print(RTC. get (DS1307_MTH, false )); //read month |
47 | Serial.print( "/" ); |
48 | Serial.print(RTC. get (DS1307_YR, false )); //read year |
49 | Serial.println(); |
50 |
51 | delay(1000); |
52 |
53 | } |
Она прекрасно работает в Arduino v0023, но мне очень надо перевести ее в v1.0.
Я обращался за помощью на англоязычный форум Arduino.cc, но все, что мне рекомендовали
было в DS1307.h заменить #include WProgram.h и WConstants.h на Arduino.h и как стандартный
вариант использовать :
1 | #if defined(ARDUINO) && ARDUINO >= 100 |
2 | #include "Arduino.h" |
3 |
4 | #else |
5 | #include "WProgram.h" |
6 | #include "WConstants.h" |
7 | #endif |
А так же где есть wire.send/wire.receive заменить на wire.write/wire.read.
Пробовал я все это проделать, но в силу моей неопытности ничего у меня не вышло.
Была рекомендация взять какую либо другую библиотеку уже работающую в v1.0, но
дело в том, что у меня с этой библиотекой уже написан большой скетч ( не мной ), который мне надо будет дополнить элементом, работающим исключительно в v1.0.
В интернете я нашел сайт, где уже была частично удавшаяся попытка это сделать:
http://arduino.cc/forum/index.php?topic=87912.0
Помогите пожалуйста!
ИМХО. Зачем использовать дополнительные библиотеки когда стандартными можно обойтись. Зачем вам посредники!
01
#include "Wire.h"
02
#define DS1307_I2C_ADDRESS 0x68
03
04
05
byte
decToBcd(
byte
val)
06
{
07
return
( (val/10*16) + (val%10) );
08
}
09
10
11
byte
bcdToDec(
byte
val)
12
{
13
return
( (val/16*10) + (val%16) );
14
}
15
16
void
setDateDs1307(
byte
second,
// 0-59
17
byte
minute,
// 0-59
18
byte
hour)
// 0-99
19
{
20
Wire.beginTransmission(DS1307_I2C_ADDRESS);
21
Wire.write(0);
22
Wire.write(decToBcd(second));
23
Wire.write(decToBcd(minute));
24
Wire.write(decToBcd(hour));
25
Wire.endTransmission();
26
}
27
28
29
void
getDateDs1307(
byte
*second,
30
byte
*minute,
31
byte
*hour)
32
{
33
34
Wire.beginTransmission(DS1307_I2C_ADDRESS);
35
Wire.write(0);
36
Wire.endTransmission();
37
38
Wire.requestFrom(DS1307_I2C_ADDRESS, 3);
39
40
*second = bcdToDec(Wire.read());
41
*minute = bcdToDec(Wire.read());
42
*hour = bcdToDec(Wire.read());
43
}
44
45
void
setup()
46
{
47
byte
second, minute, hour;
48
Wire.begin();
49
Serial.begin(9600);
50
51
second = 45;
52
minute = 3;
53
hour = 7;
54
55
setDateDs1307(second, minute, hour);
56
}
57
58
void
loop()
59
{
60
byte
second, minute, hour;
61
62
getDateDs1307(&second, &minute, &hour);
63
Serial.print(hour, DEC);
64
Serial.print(
":"
);
65
Serial.print(minute, DEC);
66
Serial.print(
":"
);
67
Serial.println(second, DEC);
68
69
70
delay(1000);
71
}
ИМХО. Зачем использовать дополнительные библиотеки когда стандартными можно обойтись. Зачем вам посредники!
Сохранил себе в "полезняшки" :) Спасибо.
ИМХО. Зачем использовать дополнительные библиотеки когда стандартными можно обойтись. Зачем вам посредники!
Сохранил себе в "полезняшки" :) Спасибо.
Там код чтобы время изымать. А есть дополнение чтобы и дату знать.
А можешь поделиться полезняками)))) levvarr собака ya.ru
Увы, вынужден расстроить :( Идея собирания полезняшек пришла только что, и кроме Вашей там пока ничего нет. Но на будущее - буду иметь в виду. Поделюсь :)
Осталось только оформить эту полезняшку в виде библиотеки, для большего удобства повторного использованияи... "Зачем вам посредники!"
;)
Библиотека же, от "просто функции скопировать в скетч" отличается только "удобством использования". Что-бы не засорять собственный скетч вспомогательными функциями. Да и, если скетчей много, не приходилось, если затесалась ошибка, бегать потом по 10-ти местам и везде вносить поправку.
Вообщем библиотеки и возникли для реализации потребности "повторно использовать код". Так что "полезняшки" нужно хранить в виде библиотек :) Copy-paste - зло.
Согласен. Но библиотека подразумевает нечто большее, чем работающий кусок кода... Как минимум, хорошее описание, функциональный обхват... Будет время - сделаю библу, а пока пускай так полежит :)
Вот ссылка на DS1307 для 1.0:
http://arduino.cc/forum/index.php?topic=93077.0
LEVV2006, а можно в вашем примере сделать функции чтения/записи даты и дня недели?
Еще объясниет мне, каким образом назначается адрес:
1
#define DS1307_I2C_ADDRESS 0x68
Да можно. Надо посмотреть дома.
Про адрес: я этот код сам откуда то взял. Этот адрес по-моему стандартный для всех часов. По крайней мере я использовал этот код во всех часах и всё нормально работало.
Вот!!! Часы + календарь
01
#include "Wire.h"
02
#define DS1307_I2C_ADDRESS 0x68
03
04
byte
decToBcd(
byte
val)
05
{
06
return
( (val/10*16) + (val%10) );
07
}
08
09
byte
bcdToDec(
byte
val)
10
{
11
return
( (val/16*10) + (val%16) );
12
}
13
14
void
setDateDs1307(
byte
second,
// 0-59
15
byte
minute,
// 0-59
16
byte
hour,
// 1-23
17
byte
dayOfWeek,
// 1-7
18
byte
dayOfMonth,
// 1-28/29/30/31
19
byte
month,
// 1-12
20
byte
year)
// 0-99
21
{
22
Wire.beginTransmission(DS1307_I2C_ADDRESS);
23
Wire.write(0);
24
Wire.write(decToBcd(second));
25
Wire.write(decToBcd(minute));
26
Wire.write(decToBcd(hour));
27
Wire.write(decToBcd(dayOfWeek));
28
Wire.write(decToBcd(dayOfMonth));
29
Wire.write(decToBcd(month));
30
Wire.write(decToBcd(year));
31
Wire.endTransmission();
32
}
33
34
void
getDateDs1307(
byte
*second,
35
byte
*minute,
36
byte
*hour,
37
byte
*dayOfWeek,
38
byte
*dayOfMonth,
39
byte
*month,
40
byte
*year)
41
{
42
43
Wire.beginTransmission(DS1307_I2C_ADDRESS);
44
Wire.write(0);
45
Wire.endTransmission();
46
47
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
48
49
*second = bcdToDec(Wire.read() & 0x7f);
50
*minute = bcdToDec(Wire.read());
51
*hour = bcdToDec(Wire.read() & 0x3f);
52
*dayOfWeek = bcdToDec(Wire.read());
53
*dayOfMonth = bcdToDec(Wire.read());
54
*month = bcdToDec(Wire.read());
55
*year = bcdToDec(Wire.read());
56
}
57
58
void
setup
()
59
{
60
byte
second, minute, hour, dayOfWeek, dayOfMonth, month, year;
61
Wire.begin();
62
Serial
.begin(9600);
63
64
second = 45;
65
minute = 3;
66
hour = 7;
67
dayOfWeek = 5;
68
dayOfMonth = 17;
69
month = 4;
70
year = 8;
71
setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
72
}
73
74
void
loop
()
75
{
76
byte
second, minute, hour, dayOfWeek, dayOfMonth, month, year;
77
78
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
79
Serial
.print(hour, DEC);
80
Serial
.print(
":"
);
81
Serial
.print(minute, DEC);
82
Serial
.print(
":"
);
83
Serial
.print(second, DEC);
84
Serial
.print(
" "
);
85
Serial
.print(month, DEC);
86
Serial
.print(
"/"
);
87
Serial
.print(dayOfMonth, DEC);
88
Serial
.print(
"/"
);
89
Serial
.print(year, DEC);
90
Serial
.print(
" Day_of_week:"
);
91
Serial
.println(dayOfWeek, DEC);
92
93
delay(1000);
94
}
LEVV2006, спасибо. А как Ваш код изменить для использования с мега? (SDA, SCL соответственно на 20, 21 пинах)?
У меня меги нет. Так что я не знаю как для неё нужно писать код. Возможно нужно подключить библиотеку Wire.h. для меги
LEVV2006, спасибо
LEVV2006, похоже, ничего в коде менять не надо - компилятор и так все слопал. Но на выходе получаю вот такие значения:
Быстрый поиск результатов. Не дал результата но у меня дома есть где то в закладках как работают эти часы.
Пока так
1) вы должны проверить правильность подключения микросхемы по даташиту.
2) Если на отдельном модуле работает нормально а на плате нет. То скорее всего немного неправильный код.
3) Я точно помню что в часах есть управляющий бит отвечающий за пуск и остановку счётчика времени.
Зы. Я тоже получал такие значения при неправильном подключении кажется (не судите строга я с часами больше 8 месяцев назад имел дело и сейчас многих деталей не помню)
ps http://avrdevices.ru/chasi-realynogo-vremeni-ds1307/
Так... вот что удалось выяснить.
1. модуль часов распаян на плате верно (заводская плата, но все равно проверил разводку и убедился, что все правильно)
2. когда батарейки резервной нет часы показывают установленное время и стоят (вполне ожидаемо)
3. когда резервная батарейка стоит, часы дают время-дату: 45:165:85 165/165/165 и часы тоже стоят.
вот интересно, с чем это может быть связано? Если кварц "мертвый" - возможна такая "работа"?
еще прочитал про бит "запрет осцилляции" (7й бит по адресу 0x0h) - по умолчанию он стоит в 1 (часы будут стоять), нужно поставить в "0"
Как это сделать?
1
Wire.beginTransmission(DS1307_I2C_ADDRESS);
2
Wire.write(0);
3
Wire.write(0x0h);
4
Wire.write(0);
5
Wire.endTransmission();
Может быть так? Надо спросить у профессионалов на форуме!!!
этот кусок не компилируется даже.
ошибка error: invalid suffix "h" on integer constant
нашел, в чем причина
оказалось, "железячная". Разработчики платы развели плату таким образом, что 8 нога от DS1307 (Vcc) идет на 3.3В
Таким образом, этот модуль вообще на плате НИКОГДА работать не будет (модуль включается на нормальный режим работы, когда напряжение на Vcc больше, чем 1.25*Vbat). Батарейка используется 3В
у меня была та же проблема. пока я не нашел другую библиотеку и не подключил часы к i2c на мене меге 20 и 21 нога. и все заработало. если надо, могу скинуть библ.
в данном случае проблема именно с питанием.
после того, как "оторвал" ножку 8 микросхемы DS1307 и не повесил ее на +5В (напомню, была на 3.3В разведена) - система не работала.
Сейчас работает хорошо, но часы останавливаются, если отключить питание. Описание такой проблемы уже было и на этом форуме (предлагалось конденсатор по питанию этой микросхеме подключить - пробовал, не помогло.. еще предлагали посмотреть цепь сброса у микроконтроллера (подтяжка) - имеется, и все равно часы "встают").
Решение до конца не найдено, но часики тикают.
Можно вопрос почти в тему?...
Приобрел модуль RTC, на нем микросхема часов и еще одна. Как я понял это память чтоль еще? Зачем она вообще?
Приобрел модуль RTC, на нем микросхема часов и еще одна. Как я понял это память чтоль еще? Зачем она вообще?
Как пишут китайцы: "56 байт слаболетучей памяти имеющеся к потребителю". Использовать - можно вместо eeprom для сохранения данных между перезагрузками, или при отключении питания ардуины. Мне сейчас тоже приехали две таких платы - буду изучать возможности... Про сам чип AT24C32AN-10SU-2.7 пишут, что он 32 килобайта (4096х8), и рассчитан на 1 миллион циклов записи и 100 лет хранения (сравним с встроенным eeprom и порадуемся).
Более вдумчивое чтение
http://robozone.su/info/10-ds1307-chasy-realnogo-vremeni-s.html
и
http://www.henningkarlsen.com/electronics/library.php?id=34
подсказывает, что 56 байт остается свободными в самой микросхеме DS1307, а вторая микруха - это чистые 32К памяти.
Питание: 5V (а не 3.3, как у китайцев на картинке нарисовано!), GND.
Подтягивающие резисторы уже есть на плате.
Пины для данных: (http://arduino.cc/en/Reference/Wire)
Сканируем программой i2c_scanner http://playground.arduino.cc//Main/I2cScanner
Scanning...
I2C device found at address 0x50 !
I2C device found at address 0x68 !
done
Это одна плата с двумя устройствами: часы и микросхема памяти...
С eeprom работает скетч: http://playground.arduino.cc/Code/I2CEEPROM.
Можете поподробнее разъяснить как работет скетч от LEVV2006, а именно функция getDateDs1307
01
void
getDateDs1307(
byte
*second,
02
byte
*minute,
03
byte
*hour)
04
{
05
06
Wire.beginTransmission(DS1307_I2C_ADDRESS);
07
Wire.write(0);
08
Wire.endTransmission();
09
10
Wire.requestFrom(DS1307_I2C_ADDRESS, 3);
11
12
*second = bcdToDec(Wire.read());
13
*minute = bcdToDec(Wire.read());
14
*hour = bcdToDec(Wire.read());
15
}
1
getDateDs1307(&second, &minute, &hour);
Как я понял в нее передаются номера ячеек пямяти переменных second, minute, hour, затем считывается три байта из памяти ds1307 и Wire.read записывает в соответствующие номерам переменные текущее время.
Я хочу запрашивать только минуты и часы (секунды не нужны), если убрать строки "byte *second" и "*second = bcdToDec(Wire.read());", то в hour записываются минуты, а в minute секунды.
Как можно запрашивать только второй и третий байт из ds1307?
Да никак. Просто читаете первый байт впустую, а затем читаете минуты и часы
1
Wire.read();
2
*minute = bcdToDec(Wire.read());
3
*hour = bcdToDec(Wire.read());
Добавил день, дату, месяц, год. Может кому надо будет.
001
#include "Wire.h"
002
#define DS1307_I2C_ADDRESS 0x68
003
004
005
byte
decToBcd(
byte
val)
006
{
007
return
( (val/10*16) + (val%10) );
008
}
009
010
011
byte
bcdToDec(
byte
val)
012
{
013
return
( (val/16*10) + (val%16) );
014
}
015
016
017
void
setDateDs1307(
byte
second,
// 0-59
018
byte
minute,
// 0-59
019
byte
hour,
020
byte
day,
021
byte
date,
022
byte
month,
023
byte
year)
// 0-99
024
{
025
Wire.beginTransmission(DS1307_I2C_ADDRESS);
026
Wire.write(0);
027
Wire.write(decToBcd(second));
028
Wire.write(decToBcd(minute));
029
Wire.write(decToBcd(hour));
030
Wire.write(decToBcd(day));
031
Wire.write(decToBcd(date));
032
Wire.write(decToBcd(month));
033
Wire.write(decToBcd(year));
034
Wire.endTransmission();
035
}
036
037
038
void
getDateDs1307(
byte
*second,
039
byte
*minute,
040
byte
*hour,
041
byte
*day,
042
byte
*date,
043
byte
*month,
044
byte
*year)
045
{
046
047
Wire.beginTransmission(DS1307_I2C_ADDRESS);
048
Wire.write(0);
049
Wire.endTransmission();
050
051
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
052
053
*second = bcdToDec(Wire.read());
054
*minute = bcdToDec(Wire.read());
055
*hour = bcdToDec(Wire.read());
056
*day = bcdToDec(Wire.read());
057
*date = bcdToDec(Wire.read());
058
*month = bcdToDec(Wire.read());
059
*year = bcdToDec(Wire.read());
060
}
061
062
void
setup
()
063
{
064
byte
second, minute, hour, day, date, month, year;
065
Wire.begin();
066
Serial
.begin(9600);
067
068
second = 00;
069
minute = 26;
070
hour = 17;
071
day = 3;
072
date = 29;
073
month = 1;
074
year = 14;
075
076
setDateDs1307(second, minute, hour, day, date, month, year);
077
}
078
079
void
loop
()
080
{
081
byte
second, minute, hour, day, date, month, year;
082
083
getDateDs1307(&second, &minute, &hour, &day, &date, &month, &year);
084
Serial
.print(hour, DEC);
085
Serial
.print(
":"
);
086
Serial
.print(minute, DEC);
087
Serial
.print(
":"
);
088
Serial
.println(second, DEC);
089
090
Serial
.print(day, DEC);
091
Serial
.print(
"/"
);
092
Serial
.print(date, DEC);
093
Serial
.print(
"."
);
094
Serial
.print(month, DEC);
095
Serial
.print(
"."
);
096
Serial
.println(year, DEC);
097
098
099
100
delay(1000);
101
}
Автору исхода спасибо.
Вот!!! Часы + календарь
01
#include "Wire.h"
02
#define DS1307_I2C_ADDRESS 0x68
03
04
byte
decToBcd(
byte
val)
05
{
06
return
( (val/10*16) + (val%10) );
07
}
08
09
byte
bcdToDec(
byte
val)
10
{
11
return
( (val/16*10) + (val%16) );
12
}
13
14
void
setDateDs1307(
byte
second,
// 0-59
15
byte
minute,
// 0-59
16
byte
hour,
// 1-23
17
byte
dayOfWeek,
// 1-7
18
byte
dayOfMonth,
// 1-28/29/30/31
19
byte
month,
// 1-12
20
byte
year)
// 0-99
21
{
22
Wire.beginTransmission(DS1307_I2C_ADDRESS);
23
Wire.write(0);
24
Wire.write(decToBcd(second));
25
Wire.write(decToBcd(minute));
26
Wire.write(decToBcd(hour));
27
Wire.write(decToBcd(dayOfWeek));
28
Wire.write(decToBcd(dayOfMonth));
29
Wire.write(decToBcd(month));
30
Wire.write(decToBcd(year));
31
Wire.endTransmission();
32
}
33
34
void
getDateDs1307(
byte
*second,
35
byte
*minute,
36
byte
*hour,
37
byte
*dayOfWeek,
38
byte
*dayOfMonth,
39
byte
*month,
40
byte
*year)
41
{
42
43
Wire.beginTransmission(DS1307_I2C_ADDRESS);
44
Wire.write(0);
45
Wire.endTransmission();
46
47
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
48
49
*second = bcdToDec(Wire.read() & 0x7f);
50
*minute = bcdToDec(Wire.read());
51
*hour = bcdToDec(Wire.read() & 0x3f);
52
*dayOfWeek = bcdToDec(Wire.read());
53
*dayOfMonth = bcdToDec(Wire.read());
54
*month = bcdToDec(Wire.read());
55
*year = bcdToDec(Wire.read());
56
}
57
58
void
setup
()
59
{
60
byte
second, minute, hour, dayOfWeek, dayOfMonth, month, year;
61
Wire.begin();
62
Serial
.begin(9600);
63
64
second = 45;
65
minute = 3;
66
hour = 7;
67
dayOfWeek = 5;
68
dayOfMonth = 17;
69
month = 4;
70
year = 8;
71
setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
72
}
73
74
void
loop
()
75
{
76
byte
second, minute, hour, dayOfWeek, dayOfMonth, month, year;
77
78
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
79
Serial
.print(hour, DEC);
80
Serial
.print(
":"
);
81
Serial
.print(minute, DEC);
82
Serial
.print(
":"
);
83
Serial
.print(second, DEC);
84
Serial
.print(
" "
);
85
Serial
.print(month, DEC);
86
Serial
.print(
"/"
);
87
Serial
.print(dayOfMonth, DEC);
88
Serial
.print(
"/"
);
89
Serial
.print(year, DEC);
90
Serial
.print(
" Day_of_week:"
);
91
Serial
.println(dayOfWeek, DEC);
92
93
delay(1000);
94
}
Братка, Спасибо за код :) Ты как с неба подан :) Часы DS1307 с Китая работают на ура, так же и DS1302 http://ru.aliexpress.com/item/1pc-hot-sale-DS3231-AT24C32-IIC-Precision-RTC-Real-Time-Clock-Memory-Module-Free-Shipping/1997483734.html?recommendVersion=1