Помогите с запуском часов DS3231 + Atmega128

3d_killer
Offline
Зарегистрирован: 13.06.2018

Прикупил модуль часов на DS3231, скачал библиотеку, все запустилось без проблем, но при отключении питания часы сбрасываются в 0 (батарейка стоит и все соединено правильно), пробовал менять библиотеку, толка от этого никакого постоянно идет сброс я так понимаю при инициализации шины именно на этой плате проходит код сброса... Это у меня появились такие мысли так как попробовал другую плату (nano atmega 328), с этим же модулем и с темже самым скетчем, все работает без проблем.

Вот сам скетч

#include <DS3231.h>             //Часы
DS3231  rtc(SDA, SCL);
#include <avr/wdt.h>            //Библиотека сторожевого таймера
#include <MsTimer2.h>           //Таймер
void INT_4()   
{
  wdt_reset();
}
void setup() {
  // put your setup code here, to run once:
  Serial.begin(19200);
  rtc.begin();
  rtc.setOutput(OUTPUT_SQW);
  rtc.setSQWRate(SQW_RATE_1);
  //attachInterrupt(4, INT_4, FALLING);
  wdt_enable(WDTO_2S);

  delay(1000);
  Serial.print("page top");
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
}

void loop() {
  // put your main code here, to run repeatedly:
wdt_reset();
delay(500);
  Serial.print("top.t0.txt=");
  Serial.print("\"");
  Serial.print(rtc.getTimeStr());
  Serial.print("\"");
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
}

Есть не большое отличие что скетч компилирован для mega128 в среде 1.8.5 (так как с другой выдаются ошибки для этого проца), а на 328 в среде 1.6.5 (так как в другой не видит программатор и выдает ошибку).

Мне нужно запустить эти часики в среде 1.8.5 и с Atmega128.

Куда копато уже не знаю, прошу помощи!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

3d_killer пишет:

попробовал другую плату (nano atmega 328), с этим же модулем и с темже самым скетчем, все работает без проблем.

Так не бывает, была ещё какая-то разница, которую Вы не заметили.

По делу. Выставьте бит EOSC в регистре 0Еh в ноль (стр. 13 даташита) и делайте это всякий раз при инициализации (где-нибудь в setup) и всё будет нормально. Ваша библиотека позволяет писать в этот регистр. Только сначала прочитайте его, исправьте один бит и запишите результат на место.

3d_killer
Offline
Зарегистрирован: 13.06.2018

Попробовал программно задать SLA SCL, та же фигня происходит сброс, я читал документацию, но так и не понял как считать или переписать этот бит(

3d_killer
Offline
Зарегистрирован: 13.06.2018

Да и бит переписывать как то странно, ведь я беру этот же модуль втыкаю в другую плату и все пашет

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

работайте без библиотеки

void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year) {
  Wire.beginTransmission(0x68);
  Wire.write(0);
  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  Wire.write(decToBcd(month)); // set month
  Wire.write(decToBcd(year)); // set year (0 to 99)
  Wire.endTransmission();
}

void readDS3231time(byte * second, byte * minute, byte * hour, byte * dayOfWeek, byte * dayOfMonth, byte * month, byte * year) {
  Wire.beginTransmission(0x68);
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(0x68, 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());
}

float readTemperature() {
  float tempr = 0;
  Wire.beginTransmission(0x68);
  Wire.write(0x11);
  Wire.endTransmission();
  Wire.requestFrom(0x68, 2);
  while (2 <= Wire.available()) {
    tempr = (((Wire.read() << 8) | Wire.read()) >> 6) * 0.25;
  }
  return tempr;
}

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

 

3d_killer
Offline
Зарегистрирован: 13.06.2018

А как эту функцию readDS3231time использовать?

3d_killer
Offline
Зарегистрирован: 13.06.2018

Serial.print( readDS3231time());

exit status 1
too few arguments to function 'void readDS3231time(byte*, byte*, byte*, byte*, byte*, byte*, byte*)'

3d_killer
Offline
Зарегистрирован: 13.06.2018

Написал так чтобы хотя бы считать секунды

int readS() {
  Wire.beginTransmission(0x68);
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(0x68, 7);
  return bcdToDec(Wire.read() & 0x7f);
}

все равно происходит сброс(

3d_killer
Offline
Зарегистрирован: 13.06.2018

главное часы на DS1307 работают без проблем

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

byte second, minute, hour, dayOfWeek, dayOfWeeks, dayOfMonth, month, year;

в loop

readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

 

3d_killer
Offline
Зарегистрирован: 13.06.2018

Все равно идет сброс...

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

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

3d_killer
Offline
Зарегистрирован: 13.06.2018

Взял плату Arduino nano припаял к ней разьем программирования, один и тот же скетч откомпилировал для 328p и 128 меги, записал программу и туда и туда, 128 делает сброс а 328p нет, процессор так же пробовал менять все равно одно и тоже, запуск программной IС2 тоже результата не дает, склоняюсь к тому что проблема в данной фигне https://github.com/MCUdude/MegaCore/blob/master/README.md

только что там может быть не так???

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

у меня этот код сейчас работает на 128А уже второй год, ничего не сбрасывается

да и я использую MEGACORE

3d_killer
Offline
Зарегистрирован: 13.06.2018

компилировал на одной и той же платформе 1.8.5

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

смотрите подключение, особено землю

3d_killer
Offline
Зарегистрирован: 13.06.2018

говорю же все подключено несколько раз проверял, да и перепаиваю я один и тот же модуль на одну плату и на другую, при выключении питания проверял что на 14 лапу поступает 3.3 вольта

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

залейте этот скетч

#include <Wire.h>

byte second, minute, hour, dayOfWeek, dayOfWeeks, dayOfMonth, month, year;

void setup() {
  Serial.begin(115200);
}

void loop() {
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
Serial.println(minute);
}

void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year) {
  Wire.beginTransmission(0x68);
  Wire.write(0);
  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  Wire.write(decToBcd(month)); // set month
  Wire.write(decToBcd(year)); // set year (0 to 99)
  Wire.endTransmission();
}

void readDS3231time(byte * second, byte * minute, byte * hour, byte * dayOfWeek, byte * dayOfMonth, byte * month, byte * year) {
  Wire.beginTransmission(0x68);
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(0x68, 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());
}

float readTemperature() {
  float tempr = 0;
  Wire.beginTransmission(0x68);
  Wire.write(0x11);
  Wire.endTransmission();
  Wire.requestFrom(0x68, 2);
  while (2 <= Wire.available()) {
    tempr = (((Wire.read() << 8) | Wire.read()) >> 6) * 0.25;
  }
  return tempr;
}

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

 

3d_killer
Offline
Зарегистрирован: 13.06.2018

Все равно идет сброс, вы бы не могли скинуть папку Arduino\hardware\arduino\avr, может в ней дело. 3d_killer@mail.ru

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

а как вы мегакоре установили? через ссылку или добавлением в папку хардваре

3d_killer
Offline
Зарегистрирован: 13.06.2018

Просто папку старую переименовал, а новую залил

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

переустановите все с нуля, и добавляйте ссылку на мегакоре

3d_killer
Offline
Зарегистрирован: 13.06.2018

щас попробую

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

3d_killer пишет:

Все равно идет сброс,

Так Вы сделали, что я сказал? Если нет, то ... удачи в переустановках.

3d_killer
Offline
Зарегистрирован: 13.06.2018

Я не знаю как это сделать, почему на одной плате работает на другой нет один и тот же модуль и один и тот же код?

3d_killer
Offline
Зарегистрирован: 13.06.2018

Переустановил, сначало Arduino потом по инструкции

  • Open the Arduino IDE.
  • Open the File > Preferences menu item.
  • Enter the following URL in Additional Boards Manager URLs: https://mcudude.github.io/MegaCore/package_MCUdude_MegaCore_index.json
  • Open the Tools > Board > Boards Manager... menu item.
  • Wait for the platform indexes to finish downloading.
  • Scroll down until you see the MegaCore entry and click on it.
  • Click Install.
  • After installation is complete close the Boards Manager window.

откомпилировал ваш код и загрузил, та же песня...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

3d_killer пишет:

 почему на одной плате работает на другой нет один и тот же модуль и один и тот же код?

Я уже говорил Вам, что в это я не верю.

А вот единичка в том бите - стандартное явление и уж не один десяток таких как Вы на этом форуме излечивались, прост обнулив этот бит.

Да, кктстати, Вы в курсе, что там нельзя ставить неперезаряжаемую батарейку - так аккумулятор нужен.

3d_killer
Offline
Зарегистрирован: 13.06.2018

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

3d_killer
Offline
Зарегистрирован: 13.06.2018

Честно низнаю почему не верите.

Есть 2 платы одна на проце 328р, Другая 128а

Arduino версии 1.8.5

Компилирую один и тот же код только меняю в свойствах плату, записываю через параллельный программатор одну прошивку и другую на платы

Модуль именно припаиваю к плате! на одной он время сохраняет, перепаиваю на другую он сбрасывает, мне не за чем вам врать

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так я ж вроде всё сказал.

Лезете в библиотеку, ищете там строку "private:" и комментируете (или удаляете) её.

После этого где-нибудь ПОСЛЕ вставляете чтение регистра 0Eh

byte r0e = rtc.readControlByte(0);

обнуляете у него седьмой бит

bitClear(r0e, 7);

ну и записываете то, что получилось "взад"

rtc.writeControlByte(r0e, 0);

Всё, чего там делать-то?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

3d_killer пишет:

Модуль именно припаиваю к плате! на одной он время сохраняет, перепаиваю на другую он сбрасывает, мне не за чем вам врать

Я и не говорю, что Вы врёте. Просто есть какая-то разница на этих платах.

Смысл в том, что он останавливает осциллятор, когда считает, что питается от батареи. А если считает, что питается от нормального источника, то работает. 

Похоже на одной плате он понимает. что питается от батареи, а на другое - нет. В чем разница в платах, Вам виднее.

Сделайте как я сказал и всё будет нормально.

3d_killer
Offline
Зарегистрирован: 13.06.2018

короче нашел причину, вот только не понятно как от нее избавиться, на той которой не сохранялось, стоит по питанию реле, а так же конденсаторы на 4000мкф, когда происходит отключение я так понимаю плата не успевает перейти на батарейку, или что то в этом духе, и как тут быть?

b707
Offline
Зарегистрирован: 26.05.2017

3d_killer пишет:

 и как тут быть?

заканчивать тупить и сделать так, как вам посоветовали уже несколько раз.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

3d_killer пишет:

 и как тут быть?

Сколько раз Вам можно объяснять как тут быть? Ну я уже построчно всё за Вас написал, что Вам ещё-то нужно? Сделайте же, наконец и наслаждайтесь результатом.

3d_killer
Offline
Зарегистрирован: 13.06.2018

щас пробую написать

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Если не получится, сразу же выкладывайте текст, т.к. откуда мне знать что Вы там написали.

3d_killer
Offline
Зарегистрирован: 13.06.2018

Это в библиотеке

/*private:*/
        uint8_t _scl_pin;
        uint8_t _sda_pin;
        uint8_t _burstArray[7];
        boolean    _use_hw;

Это в коде

void setup() {

 
  Serial.begin(19200);
  rtc.begin();
  rtc.setOutput(OUTPUT_SQW);
  rtc.setSQWRate(SQW_RATE_1);
  attachInterrupt(4, INT_4, FALLING);

byte r0e = rtc.readControlByte(0);
bitClear(r0e, 7);
rtc.writeControlByte(r0e, 0);
 
  wdt_enable(WDTO_2S);

  delay(1000);
  Serial.print("page top");
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
}

 

Это ошибка

sketch_jun07a:22: error: 'class DS3231' has no member named 'readControlByte'

 byte r0e = rtc.readControlByte(0);

                ^

sketch_jun07a:24: error: 'class DS3231' has no member named 'writeControlByte'

 rtc.writeControlByte(r0e, 0);

     ^

exit status 1
'class DS3231' has no member named 'readControlByte'

 

3d_killer
Offline
Зарегистрирован: 13.06.2018

и там нет такого метода

только:

        uint8_t _scl_pin;
        uint8_t _sda_pin;
        uint8_t _burstArray[7];
        boolean    _use_hw;

        void    _sendStart(byte addr);
        void    _sendStop();
        void    _sendAck();
        void    _sendNack();
        void    _waitForAck();
        uint8_t    _readByte();
        void    _writeByte(uint8_t value);
        void    _burstRead();
        uint8_t    _readRegister(uint8_t reg);
        void     _writeRegister(uint8_t reg, uint8_t value);
        uint8_t    _decode(uint8_t value);
        uint8_t    _decodeH(uint8_t value);
        uint8_t    _decodeY(uint8_t value);
        uint8_t    _encode(uint8_t vaule);

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Значит у Вас не та библиотека. Сразу надо было ссылку давать. Их с одинаковыми именами до чёрта.

Либо возьмите вот эту с тем же именем, но, похоже, другую. Либо давайте ссылку на Вашу, я посмотрю что можно сделать (только уже завтра).

ДОПОЛНЕНИЕ

Ага, вижу. у Вас там есть _readRegister и _writeRegister, похоже, они такие же, но чтобы убедиться - надо посмотреть.

3d_killer
Offline
Зарегистрирован: 13.06.2018

а пример ее инициализации есть?

3d_killer
Offline
Зарегистрирован: 13.06.2018

переписал под свою библиотеку, но результат тот же, как только отсоединяю реле и конденсаторы сразу начинает время сохраняться

3d_killer
Offline
Зарегистрирован: 13.06.2018

Вобщем, при питании платы от программатора с компа, происходит сброс, если подключаю к сети через блок питания (Это самостоятельная плата имеющая блок питания), все сохраняется и работает без вопросов, честно странное поведение, есть у кого какие догадки?

3d_killer
Offline
Зарегистрирован: 13.06.2018

При чем, если выпаять конденсаторы по питанию на 4000 мкф, то от программатора тоже сброса не происходит, мне кажется что при зарядке кондеров (это считай КЗ), а ток на USB порту маленький, происходят или сильные пульсации или еще что, что приводит к сбросу, очень хотелось бы чтобы при работе от сети такой ерунды не всплыло

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, не знаю, что Вы там написали. Покажете код и библиотеку - посмотрю, не покажете - живите так. Я же Вам писал, чтобы код выкладывали. Только делайте это правильно. И ссылку на библиотеку не забудьте.

3d_killer
Offline
Зарегистрирован: 13.06.2018

То что вы писали я сделал, оно не помогло, сейчас в нормальном режиме от сети работает этот код

#include <DS3231.h>             //Часы
DS3231  rtc(SDA, SCL);
#include <avr/wdt.h>            //Библиотека сторожевого таймера

void INT_4()   
{
  wdt_reset();
}

void setup() {
  
  // put your setup code here, to run once:
  Serial.begin(19200);
  rtc.begin();
  rtc.setOutput(OUTPUT_SQW);
  rtc.setSQWRate(SQW_RATE_1);
  attachInterrupt(4, INT_4, FALLING);
  wdt_enable(WDTO_2S);

  delay(1000);
  Serial.print("page top");
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
}
void loop() {
  // put your main code here, to run repeatedly:
  delay(500);
  Serial.print("top.t0.txt=");
  Serial.print("\"");
  Serial.print(rtc.getTimeStr());    
  Serial.print("\"");
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
}

Библиотека тут

http://rinkydinkelectronics.com/library.php?id=73

Естественно работает все без проблем пока не перехожу на питание с программатора, если по питанию стоит кондер на 4000 мкф то происходит сброс времени, если кондер выпаять то проблем не возникает

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

Но уже можно не выкладывать. Я Вас несколько раз просил сделать, потом дважды просил "если не получится - показать код". Поскольку, Вы этого не сделали, значит, Вам не нужно. 

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

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

Да он наверняка этого и не делал. Или делал тяп-ляп, чтоб отвязаться. Он только пишет, что его интересует работа часов, а на самом деле ему нужен только ответ на вопрос - "Почему же, пля, платы работают по разному?" - и все, что этого не касается. его не занимает...

Так называемая "ложная концентрация".

 

3d_killer
Offline
Зарегистрирован: 13.06.2018
#include <DS3231.h>             //Часы

DS3231  rtc(SDA, SCL);
#include <avr/wdt.h>            //Библиотека сторожевого таймера

void INT_4()   
{
  wdt_reset();
}

void setup() {
 
  // put your setup code here, to run once:
  Serial.begin(19200);
  rtc.begin();
  rtc.setOutput(OUTPUT_SQW);
  rtc.setSQWRate(SQW_RATE_1);

byte r0e = rtc._readRegister(0);
bitClear(r0e, 7);
rtc._writeRegister(r0e, 0);

  attachInterrupt(4, INT_4, FALLING);
  wdt_enable(WDTO_2S);

  delay(1000);
  Serial.print("page top");
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
}
void loop() {
  // put your main code here, to run repeatedly:
  delay(500);
  Serial.print("top.t0.txt=");
  Serial.print("\"");
  Serial.print(rtc.getTimeStr());    
  Serial.print("\"");
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
}

Просто заменил на методы из своей библиотеки, все компилируется без проблем, ссылку на библиотеку я кидал выше, но толку от этого нет

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Что Вы писали? Строки 10-12 я вижу впервые, раньше Вы их не выкладывали.

О, уже поменялось. Уже строки 19-21. Писал он :)))

3d_killer
Offline
Зарегистрирован: 13.06.2018

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

3d_killer пишет:

byte r0e = rtc._readRegister(0);
bitClear(r0e, 7);
rtc._writeRegister(r0e, 0);

Просто заменил на методы из своей библиотеки, все компилируется без проблем, 

Вы написали бред. Надо было не "просто заменять", а заменять правильно. В этой библиотеке эти функции устроены по-другому. Дали бы Вы мне код сразу - не было бы столь длинной переписки. Поймите, моё время тоже не безгранично, и я не могу постоянно умолять Вас сделать хоть что-то для решения Вашей же проблемы, а когда Вы упорно не делаете, умолять снова. Сказано "выкладывайте код", значит выкладывайте код, а не думайте, что Вы сделали "просто". Если бы для Вас это было просто, этой темы бы не было.

В общем так, я таки скажу Вам что делать, но если опять не получится и не будет кода - идите Вы лесом! Я понятно выразился?

Попробуйте так

byte r0e = rtc._readRegister(14);
bitClear(r0e, 7);
rtc._writeRegister(14, r0e);