Перевод DS1307 библиотеки в v1.0

Alex1503
Offline
Зарегистрирован: 16.06.2012

Всем здравствуйте!
Есть очень удобная и простая в использовании библиотека для часов DS1307.
Взято отсюда:arduino-info.wikispaces.com/RTC

DS1307.h:

DS1307.cpp:

Тестовый скетч:

Она прекрасно работает в 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

Помогите пожалуйста!
 

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

ИМХО. Зачем использовать дополнительные библиотеки когда стандартными можно обойтись. Зачем вам посредники!

 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

LEVV2006 пишет:

ИМХО. Зачем использовать дополнительные библиотеки когда стандартными можно обойтись. Зачем вам посредники!

Сохранил себе в "полезняшки" :) Спасибо.

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

AlexFisher пишет:

LEVV2006 пишет:

ИМХО. Зачем использовать дополнительные библиотеки когда стандартными можно обойтись. Зачем вам посредники!

 

Сохранил себе в "полезняшки" :) Спасибо.

 

Там код чтобы время изымать. А есть дополнение чтобы и дату знать.
А можешь поделиться полезняками)))) levvarr собака ya.ru
 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Увы, вынужден расстроить :( Идея собирания полезняшек пришла только что, и кроме Вашей там пока ничего нет. Но на будущее - буду иметь в виду. Поделюсь :)

leshak
Offline
Зарегистрирован: 29.09.2011

 Осталось только оформить эту полезняшку в виде библиотеки, для большего удобства повторного использованияи... "Зачем вам посредники!"

;)

Библиотека же, от "просто функции скопировать в скетч" отличается только "удобством использования". Что-бы не засорять собственный скетч вспомогательными функциями. Да и, если скетчей много, не приходилось, если затесалась ошибка, бегать потом по 10-ти местам и везде вносить поправку.

Вообщем библиотеки и возникли для реализации потребности "повторно использовать код". Так что "полезняшки" нужно хранить в виде библиотек :) Copy-paste - зло.

 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Согласен. Но библиотека подразумевает нечто большее, чем работающий кусок кода... Как минимум, хорошее описание, функциональный обхват... Будет время - сделаю библу, а пока пускай так полежит :)

Alex1503
Offline
Зарегистрирован: 16.06.2012

Вот ссылка на DS1307 для 1.0:
http://arduino.cc/forum/index.php?topic=93077.0
 

Bim_Sony
Bim_Sony аватар
Offline
Зарегистрирован: 03.10.2012

LEVV2006, а можно в вашем примере сделать функции чтения/записи даты и дня недели?

 

Еще объясниет мне, каким образом назначается адрес:

1#define DS1307_I2C_ADDRESS 0x68

 

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

 

Да можно. Надо посмотреть дома.

Про адрес: я этот код сам откуда то взял. Этот адрес по-моему стандартный для всех часов. По крайней мере я использовал этот код во всех часах и всё нормально работало. 

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

Вот!!! Часы + календарь

 

ustas
Offline
Зарегистрирован: 12.03.2012

LEVV2006, спасибо. А как Ваш код изменить для использования с мега? (SDA, SCL соответственно на 20, 21 пинах)?

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

 

У меня меги нет. Так что я не знаю как для неё нужно писать код. Возможно нужно подключить библиотеку Wire.h. для меги

Bim_Sony
Bim_Sony аватар
Offline
Зарегистрирован: 03.10.2012

LEVV2006, спасибо

ustas
Offline
Зарегистрирован: 12.03.2012

LEVV2006, похоже, ничего в коде менять не надо - компилятор и так все слопал. Но на выходе получаю вот такие значения:

 

45:165:85  165/165/165  Day_of_week:165
 
(к слову, остальные библиотеки для часиков дают аналогичные значения)
 
Еще заметил, что если убрать резервную батарейку значения становятся чуть осмысленнее:
 
7:3:45  4/17/8  Day_of_week:5
 
но все равно часы "стоят". 
 
(используется плата IPoard Pro - http://imall.iteadstudio.com/iboard-pro.html)
 
с отдельными модулями RTC проблем не было, а тут что-то запустить не могу :( 
Дайте направление мысли? Куда копать?

 

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

 

Быстрый поиск результатов. Не дал результата но у меня дома есть где то в закладках как работают эти часы.

Пока так

1)      вы должны проверить правильность подключения микросхемы по даташиту.

2)      Если на отдельном модуле работает нормально а на плате нет. То скорее всего немного неправильный код.

3)      Я точно помню что в часах есть управляющий бит отвечающий за пуск и остановку счётчика времени.

 

 

Зы. Я тоже получал такие значения при неправильном подключении кажется (не судите строга я с часами больше 8 месяцев назад имел дело и сейчас многих деталей не помню)

ps http://avrdevices.ru/chasi-realynogo-vremeni-ds1307/

ustas
Offline
Зарегистрирован: 12.03.2012

Так... вот что удалось выяснить.

1. модуль часов распаян на плате верно (заводская плата, но все равно проверил разводку и убедился, что все правильно)

2. когда батарейки резервной нет часы показывают установленное время и стоят (вполне ожидаемо)

3. когда резервная батарейка стоит, часы дают время-дату: 45:165:85  165/165/165 и часы тоже стоят.

вот интересно, с чем это может быть связано? Если кварц "мертвый" - возможна такая "работа"?

 

еще прочитал про бит "запрет осцилляции"  (7й бит по адресу 0x0h) - по умолчанию он стоит в 1 (часы будут стоять), нужно поставить в "0"

Как это сделать?

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011
1Wire.beginTransmission(DS1307_I2C_ADDRESS);
2Wire.write(0);
3Wire.write(0x0h);   
4Wire.write(0);
5Wire.endTransmission();

Может быть так? Надо спросить у профессионалов на форуме!!!

ustas
Offline
Зарегистрирован: 12.03.2012

этот кусок не компилируется даже. 

ошибка error: invalid suffix "h" on integer constant

ustas
Offline
Зарегистрирован: 12.03.2012

нашел, в чем причина

оказалось, "железячная". Разработчики платы развели плату таким образом, что 8 нога от DS1307 (Vcc) идет на 3.3В

Таким образом, этот модуль вообще на плате НИКОГДА работать не будет (модуль включается на нормальный режим работы, когда напряжение на Vcc больше, чем 1.25*Vbat). Батарейка используется 3В

error911
Offline
Зарегистрирован: 06.10.2012

у меня была та же проблема. пока я не нашел другую библиотеку и не подключил часы к i2c на мене меге 20 и 21 нога. и все заработало. если надо, могу скинуть библ.

ustas
Offline
Зарегистрирован: 12.03.2012

в данном случае проблема именно с питанием.

после того, как "оторвал" ножку 8 микросхемы DS1307 и не повесил ее на +5В (напомню, была на 3.3В разведена) - система не работала. 

Сейчас работает хорошо, но часы останавливаются, если отключить питание. Описание такой проблемы уже было и на этом форуме (предлагалось конденсатор по питанию этой микросхеме подключить - пробовал, не помогло.. еще предлагали посмотреть цепь сброса у микроконтроллера (подтяжка) - имеется, и все равно часы "встают").

Решение до конца не найдено, но часики тикают.

error911
Offline
Зарегистрирован: 06.10.2012

Можно вопрос почти в тему?...

Приобрел модуль RTC, на нем микросхема часов и еще одна. Как я понял это память чтоль еще? Зачем она вообще?

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

error911 пишет:

Приобрел модуль 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К памяти.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Питание: 5V (а не 3.3, как у китайцев на картинке нарисовано!), GND.

Подтягивающие резисторы уже есть на плате.

Пины для данных: (http://arduino.cc/en/Reference/Wire)

Board I2C / TWI pins
Uno, Ethernet A4 (SDA), A5 (SCL)
Mega2560 20 (SDA), 21 (SCL)
Leonardo 2 (SDA), 3 (SCL)
Due 20 (SDA), 21 (SCL), SDA1, SCL1

Сканируем программой 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.

saniks
Offline
Зарегистрирован: 09.04.2013

Можете поподробнее разъяснить как работет скетч от LEVV2006, а именно функция getDateDs1307

01void 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}
1getDateDs1307(&second, &minute, &hour);

Как я понял в нее передаются номера ячеек пямяти переменных second, minute, hour, затем считывается три байта из памяти ds1307 и  Wire.read записывает в соответствующие номерам переменные текущее время.

Я хочу запрашивать только минуты и часы (секунды не нужны), если убрать строки "byte *second" и "*second = bcdToDec(Wire.read());", то в hour записываются минуты, а в minute секунды.

Как можно запрашивать только второй и третий байт из ds1307?


 

 

maksim
Offline
Зарегистрирован: 12.02.2012

Да никак. Просто читаете первый байт впустую, а затем читаете минуты и часы

1Wire.read();
2*minute     = bcdToDec(Wire.read());
3*hour       = bcdToDec(Wire.read());

 

Peter
Peter аватар
Offline
Зарегистрирован: 25.02.2012

Добавил день, дату, месяц, год.  Может кому надо будет. 

001#include "Wire.h"
002#define DS1307_I2C_ADDRESS 0x68
003 
004 
005byte decToBcd(byte val)
006{
007  return ( (val/10*16) + (val%10) );
008}
009 
010 
011byte bcdToDec(byte val)
012{
013  return ( (val/16*10) + (val%16) );
014}
015 
016 
017void 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 
038void 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 
062void 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 
079void 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}

Автору исхода спасибо.

Marlen S
Offline
Зарегистрирован: 13.01.2015

LEVV2006 пишет:

Вот!!! Часы + календарь

 

 

Братка, Спасибо за код :) Ты как с неба подан :) Часы 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