DS1307 показывают странное время, которое стоит.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Dimatkz, в общем ОЗУ этого чипа не любит, когда его читают (и записыват) все 56 байт подряд. Если разделить хотя бы пополам, то всё ок.

Стиралка:

Wire.beginTransmission(0x68);
Wire.write(0x08); // 
for (byte n=0; n<28; n++){ Wire.write(0xFF); } // 
Wire.endTransmission();

Wire.beginTransmission(0x68);
Wire.write(0x24); // 
for (byte n=0; n<28; n++){ Wire.write(0xFF); } // 
Wire.endTransmission();

 

Читалка:

Wire.beginTransmission(0x68);
Wire.write(0x08);
Wire.endTransmission();
Wire.requestFrom(0x68,28);
if(Wire.available()) {
for (byte n=0; n<28; n++){
     Serial.println( Wire.read());     
     }       
  }

Wire.beginTransmission(0x68);
Wire.write(0x24);
Wire.endTransmission();
Wire.requestFrom(0x68,28);
if(Wire.available()) {
for (byte n=0; n<28; n++){
     Serial.println( Wire.read());     
     }       
  }

Только я не понял, зачем вам это? Ведь при отключении батарейки всё стирается. А при включении судя по всему заполняется хаотическими данными.

Dimatkz
Offline
Зарегистрирован: 29.12.2015

ещё раз спасибо, сейчас попробую ещё, хотя стереть получилось. На дисплее прибора год стал выводиться ??16, попробую сейчас прочитать. Насчёт батарейки- я питание прибора не отключаю, в нём встроенные часы, на питании вместо батарейки стоит, как мне сказали, ионистор, а также в приборе автономное питание 6 батареек.

FlyTortoise
Offline
Зарегистрирован: 13.03.2015

Так у чипа микропотребление и есть резервное питание

Al_Ninyo
Offline
Зарегистрирован: 09.11.2014

Привет, уважаемые!

Помогите идиоту :) Ковыряюсь с DS1307. Собираю для себя небольшую метеостанцию... Несколько часов назад проверял все элементы (BMP180, DS18B20, LCD Nokia 5110, DS1307, Arduino Nano): в почти готовую поделку заливал скетчи для каждого элемента отдельно. Всё работало нормально, в том числе и часы устанавливали и показывали время.

После этого чуток допилил код (вывод инфы на экран) и случилось странное: часы вывели на экран нули и 2000 год. Попытка снова установить на них время провалилась (библиотека DS1307RTC, пример SetTime): в монитор порта стало выводиться "Could not parse info from the compiler, Time=...". Переткнул проводочки, отключил всё, кроме часов, подключил ДРУГОЙ модуль к ДРУГОЙ ардуинке (пробовал и Nano, и Uno) - эффект тот же. Причём перепробовал 3 разных IDE: 1.0.6, 1.6.3 и 1.6.7.

Попробовал пример из библиотеки Time (пример TimeRTC). В мониторе порта получаю "Unable to sync with the RTC". При этом часы точно подключены (I2C-сканер видит 2 адреса при подключении часов).

Комп перезагружал, в бубен стучал. Что ещё надо сделать и что я делаю не так?

Al_Ninyo
Offline
Зарегистрирован: 09.11.2014

Сам себе, идиоту, отвечу. Вся проблема была из-за того, что в примере SetTime решил названия месяцев написать на русском :( Вернул как было - всё заработало.

anatoliyrnd
Offline
Зарегистрирован: 17.03.2016

кто подскажет в стнадртной либе DS1307 -b почему tm.Wday() всгда возвращает 0 , при том что время и дату возвращают все нормально?

asicorp2001
Offline
Зарегистрирован: 12.07.2016

Все перечитал, но пока не могу найти ответ. Ситуация такая - модуль на ds1307. Стоит батарейка. Убрал резисторы на 3 ногу и зарядку. Часы идут и при подключении питания на arduino uno, и при отключении. Но вот странно, при запросе времени , при подключенной батарейке, выдает пустую дату - тира 01-01-2001 и время 00-00. Но стоит отключить батарейку - время выдает нормальное. Никто не сталкивался с такой бедой? Библиотеки разные пробовал - все аналогично.

bwn
Offline
Зарегистрирован: 25.08.2014

asicorp2001 пишет:

Все перечитал, но пока не могу найти ответ. Ситуация такая - модуль на ds1307. Стоит батарейка. Убрал резисторы на 3 ногу и зарядку. Часы идут и при подключении питания на arduino uno, и при отключении. Но вот странно, при запросе времени , при подключенной батарейке, выдает пустую дату - тира 01-01-2001 и время 00-00. Но стоит отключить батарейку - время выдает нормальное. Никто не сталкивался с такой бедой? Библиотеки разные пробовал - все аналогично.

Какая то хня у вас. При отключенной батарее, 1307 работать вроде не должна.

asicorp2001
Offline
Зарегистрирован: 12.07.2016

Батарейка установлена. Подключаю к компу, заливаю программу, в порт пишет 01-01-2001 и время 00-00.

Прямо на ходу , вытаскиваю батарейку, начинает писать в порт нормальные данные. Причем , если отключу от компа с установленной батарейкой, то время продолжает идти. Получается установленная батарейка приводит к некорректному отображению информации. Хрень какая-то.....

DS1307 с буквой Z, может в этом проблема... Может надо принудительно что-то заслать в микросхему?

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

asicorp2001, какое напряжение на батарейке, и на питании модуля когда всё подключено?

FlyTortoise
Offline
Зарегистрирован: 13.03.2015

Какое напряжение на 3-й ноге 1307 (при наличии батарейки) без подключения к USB и с подключением?

asicorp2001
Offline
Зарегистрирован: 12.07.2016

На 8 ноге 5в, на 3 ноге 3в. Вроде нет криминала.

asicorp2001
Offline
Зарегистрирован: 12.07.2016

Сегодня укоротил провода от модуля до ардуино. Не помогло (но я и не думал, что поможет).

Но при тестировании программы, при передергивании батарейки выскочило The DS1307 is stopped.
Это сработало условие RTC.chipPresent().  Может при установленной батарейке - блокируется вывод данных ?  Повторюсь - часы продолжают идти, когда стоит батарейка, но убираю питание 5В.

RTC.chipPresent () — возвращает TRUE, если модуль подключен

#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>

void setup() {
  Serial.begin(9600);
  while (!Serial) ; // wait for serial
  delay(200);
  Serial.println("DS1307RTC Read Test");
  Serial.println("-------------------");
}

void loop() {
  tmElements_t tm;

  if (RTC.read(tm)) {
    Serial.print("Ok, Time = ");
    print2digits(tm.Hour);
    Serial.write(':');
    print2digits(tm.Minute);
    Serial.write(':');
    print2digits(tm.Second);
    Serial.print(", Date (D/M/Y) = ");
    Serial.print(tm.Day);
    Serial.write('/');
    Serial.print(tm.Month);
    Serial.write('/');
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.println();
  } else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
    delay(9000);
  }
  delay(1000);
}

void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}

asicorp2001
Offline
Зарегистрирован: 12.07.2016

Попробовал порты сканировать , но с батарейкой зависает. Батарейку отключаю - все ок.

I2C Scanner
Scanning...
I2C device found at address 0x50  !
I2C device found at address 0x68  !
done

msng
Offline
Зарегистрирован: 07.06.2012

присоеденюсь к предыдущим ответам.

думаю дело в напряжении питания или в батарейке.

Чудес не бывает..

Вы меряли напряжения на третьей и восьмой ноге? при поданом питании и установленной батарейке.

сколько напряжения на 3 ноге без батарейки?

чем меряете напряжение?

 

forfrends
Offline
Зарегистрирован: 24.02.2015

Добрый день! Хочу написать небольшую программу и зашить ее в Attiny2313. Столснулся с проблемой: по всем инструкциям (что нашел) модуль DS1307 нужно подключать к аналоговым пинам 4 и 5. Но я не нашел на Attiny2313 есть ли там аналоговые пины. Вопрос в чем: как прописать в скетче настройки для подключения модуля DS1307 к Attiny2313. Распиновку брал здесь: https://github.com/SpenceKonde/ATTinyCore

Пробовал в скетче прописывать так:

#include <iarduino_RTC.h>

DS1307 rtc(6, 7);

но выдает ошибку: 'DS1307' does not name a type
 
Там указаны аналоговые пины. Как их указать в скетче?
Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Не нужны тут аналоговые пины. На пинах A4 и A5 находится шина I2C (SDA, SCL). У Attiny2313 шина I2C также есть, но SDA и SCL на пинах PB5, PB7 (D14, D16).

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

forfrends пишет:

Пробовал в скетче прописывать так:

#include <iarduino_RTC.h>

DS1307 rtc(6, 7);

но выдает ошибку: 'DS1307' does not name a type
 
 
Саму библиотеку iarduino_RTC установили?
forfrends
Offline
Зарегистрирован: 24.02.2015

Уф.. замучился. Перепробовал разные библиотеки - все на ардуино работают, но для Attiny2313 не компилируются. Стандартная библиотека RTClib (и некоторые другие) выдает такую ошибку:

TWBR = ((F_CPU / frequency) - 16) / 2;

Пробовал сделать как в статье: https://forums.adafruit.com/viewtopic.php?f=45&t=83876 

заменил #include <Wire.h> на:

#include <TinyWireM.h>

#include <USI_TWI_Master.h>

но это не дало результата, выскакивет та же ошибка

Все другие библиотеки пытаются програмно задействовать SPI и там тьма ошибок...

Emeljanowich
Emeljanowich аватар
Offline
Зарегистрирован: 30.04.2015

Здравствуйте! Помогите пожалуйста справиться с такой задачкой. Есть у меня плата на ней мк 128 и модуль часов подключенный как на картинке. Это все дело работало и было оно реле защиты ЭД. Я хочу под свои нужды его перешить. На скетче, который я использую, понятное дело, часы не работают. Нужно программно настроить эти два порта как SDA, SDL. Помогите, кто вкурсе как. Код и картинка прилагаются. Еще пожалуйста, объясните мне эту строку: "#define DS1307_I2C_ADDRESS 0x68" - кому присваивается этот адрес?

#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68

byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}

void setDateDs1307(byte second,        // 0-59
                   byte minute,        // 0-59
                   byte hour,          // 1-23
                   byte dayOfWeek,     // 1-7
                   byte dayOfMonth,    // 1-28/29/30/31
                   byte month,         // 1-12
                   byte year)          // 0-99
{
   Wire.beginTransmission(DS1307_I2C_ADDRESS);
   Wire.write(0);
   Wire.write(decToBcd(second));    
   Wire.write(decToBcd(minute));
   Wire.write(decToBcd(hour));     
   Wire.write(decToBcd(dayOfWeek));
   Wire.write(decToBcd(dayOfMonth));
   Wire.write(decToBcd(month));
   Wire.write(decToBcd(year));
   Wire.endTransmission();
}

void getDateDs1307(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfWeek,
          byte *dayOfMonth,
          byte *month,
          byte *year)
{

  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

  *second     = bcdToDec(Wire.read() & 0x7f);
  *minute     = bcdToDec(Wire.read());
  *hour       = bcdToDec(Wire.read() & 0x3f); 
  *dayOfWeek  = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month      = bcdToDec(Wire.read());
  *year       = bcdToDec(Wire.read());
}

void setup()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  Wire.begin();
  Serial.begin(9600);

  second = 5;
  minute = 4;
  hour = 19;
  dayOfWeek = 7;
  dayOfMonth = 9;
  month = 10;
  year = 16;
  setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
}

void loop()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  Serial.print(hour, DEC);
  Serial.print(":");
  Serial.print(minute, DEC);
  Serial.print(":");
  Serial.print(second, DEC);
  Serial.print("  ");
  Serial.print(dayOfMonth, DEC);
  Serial.print("/");
  Serial.print(month, DEC);
  Serial.print("/");
  Serial.print(year, DEC);
  Serial.print("  Day_of_week:");
  Serial.println(dayOfWeek, DEC);

  delay(1000);
}