Помогите с запуском часов DS3231 + Atmega128
- Войдите на сайт для отправки комментариев
Прикупил модуль часов на 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.
Куда копато уже не знаю, прошу помощи!
попробовал другую плату (nano atmega 328), с этим же модулем и с темже самым скетчем, все работает без проблем.
Так не бывает, была ещё какая-то разница, которую Вы не заметили.
По делу. Выставьте бит EOSC в регистре 0Еh в ноль (стр. 13 даташита) и делайте это всякий раз при инициализации (где-нибудь в setup) и всё будет нормально. Ваша библиотека позволяет писать в этот регистр. Только сначала прочитайте его, исправьте один бит и запишите результат на место.
Попробовал программно задать SLA SCL, та же фигня происходит сброс, я читал документацию, но так и не понял как считать или переписать этот бит(
Да и бит переписывать как то странно, ведь я беру этот же модуль втыкаю в другую плату и все пашет
работайте без библиотеки
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) ); }А как эту функцию
readDS3231timeиспользовать?Serial.print( readDS3231time());
exit status 1
too few arguments to function 'void readDS3231time(byte*, byte*, byte*, byte*, byte*, byte*, byte*)'
Написал так чтобы хотя бы считать секунды
int readS() {
Wire.beginTransmission(0x68);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(0x68, 7);
return bcdToDec(Wire.read() & 0x7f);
}
все равно происходит сброс(
главное часы на DS1307 работают без проблем
Все равно идет сброс...
избавьтесь от упоминания библиотеки в скетче
Взял плату Arduino nano припаял к ней разьем программирования, один и тот же скетч откомпилировал для 328p и 128 меги, записал программу и туда и туда, 128 делает сброс а 328p нет, процессор так же пробовал менять все равно одно и тоже, запуск программной IС2 тоже результата не дает, склоняюсь к тому что проблема в данной фигне https://github.com/MCUdude/MegaCore/blob/master/README.md
только что там может быть не так???
у меня этот код сейчас работает на 128А уже второй год, ничего не сбрасывается
да и я использую MEGACORE
компилировал на одной и той же платформе 1.8.5
смотрите подключение, особено землю
говорю же все подключено несколько раз проверял, да и перепаиваю я один и тот же модуль на одну плату и на другую, при выключении питания проверял что на 14 лапу поступает 3.3 вольта
залейте этот скетч
#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) ); }Все равно идет сброс, вы бы не могли скинуть папку Arduino\hardware\arduino\avr, может в ней дело. 3d_killer@mail.ru
а как вы мегакоре установили? через ссылку или добавлением в папку хардваре
Просто папку старую переименовал, а новую залил
переустановите все с нуля, и добавляйте ссылку на мегакоре
щас попробую
Все равно идет сброс,
Так Вы сделали, что я сказал? Если нет, то ... удачи в переустановках.
Я не знаю как это сделать, почему на одной плате работает на другой нет один и тот же модуль и один и тот же код?
Переустановил, сначало Arduino потом по инструкции
https://mcudude.github.io/MegaCore/package_MCUdude_MegaCore_index.jsonоткомпилировал ваш код и загрузил, та же песня...
почему на одной плате работает на другой нет один и тот же модуль и один и тот же код?
Я уже говорил Вам, что в это я не верю.
А вот единичка в том бите - стандартное явление и уж не один десяток таких как Вы на этом форуме излечивались, прост обнулив этот бит.
Да, кктстати, Вы в курсе, что там нельзя ставить неперезаряжаемую батарейку - так аккумулятор нужен.
Я же говорю, не знаю как этот бит считать перезаписать, батарейка стоит обычная (удалена цепь заряда), если не сложно то напишите код как этот бит переписать.
Честно низнаю почему не верите.
Есть 2 платы одна на проце 328р, Другая 128а
Arduino версии 1.8.5
Компилирую один и тот же код только меняю в свойствах плату, записываю через параллельный программатор одну прошивку и другую на платы
Модуль именно припаиваю к плате! на одной он время сохраняет, перепаиваю на другую он сбрасывает, мне не за чем вам врать
Так я ж вроде всё сказал.
Лезете в библиотеку, ищете там строку "private:" и комментируете (или удаляете) её.
После этого где-нибудь ПОСЛЕ вставляете чтение регистра 0Eh
byte r0e = rtc.readControlByte(0);
обнуляете у него седьмой бит
bitClear(r0e, 7);
ну и записываете то, что получилось "взад"
rtc.writeControlByte(r0e, 0);
Всё, чего там делать-то?
Модуль именно припаиваю к плате! на одной он время сохраняет, перепаиваю на другую он сбрасывает, мне не за чем вам врать
Я и не говорю, что Вы врёте. Просто есть какая-то разница на этих платах.
Смысл в том, что он останавливает осциллятор, когда считает, что питается от батареи. А если считает, что питается от нормального источника, то работает.
Похоже на одной плате он понимает. что питается от батареи, а на другое - нет. В чем разница в платах, Вам виднее.
Сделайте как я сказал и всё будет нормально.
короче нашел причину, вот только не понятно как от нее избавиться, на той которой не сохранялось, стоит по питанию реле, а так же конденсаторы на 4000мкф, когда происходит отключение я так понимаю плата не успевает перейти на батарейку, или что то в этом духе, и как тут быть?
и как тут быть?
заканчивать тупить и сделать так, как вам посоветовали уже несколько раз.
и как тут быть?
Сколько раз Вам можно объяснять как тут быть? Ну я уже построчно всё за Вас написал, что Вам ещё-то нужно? Сделайте же, наконец и наслаждайтесь результатом.
щас пробую написать
Если не получится, сразу же выкладывайте текст, т.к. откуда мне знать что Вы там написали.
Это в библиотеке
/*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'
и там нет такого метода
только:
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);
Значит у Вас не та библиотека. Сразу надо было ссылку давать. Их с одинаковыми именами до чёрта.
Либо возьмите вот эту с тем же именем, но, похоже, другую. Либо давайте ссылку на Вашу, я посмотрю что можно сделать (только уже завтра).
ДОПОЛНЕНИЕ
Ага, вижу. у Вас там есть _readRegister и _writeRegister, похоже, они такие же, но чтобы убедиться - надо посмотреть.
а пример ее инициализации есть?
переписал под свою библиотеку, но результат тот же, как только отсоединяю реле и конденсаторы сразу начинает время сохраняться
Вобщем, при питании платы от программатора с компа, происходит сброс, если подключаю к сети через блок питания (Это самостоятельная плата имеющая блок питания), все сохраняется и работает без вопросов, честно странное поведение, есть у кого какие догадки?
При чем, если выпаять конденсаторы по питанию на 4000 мкф, то от программатора тоже сброса не происходит, мне кажется что при зарядке кондеров (это считай КЗ), а ток на USB порту маленький, происходят или сильные пульсации или еще что, что приводит к сбросу, очень хотелось бы чтобы при работе от сети такой ерунды не всплыло
Ну, не знаю, что Вы там написали. Покажете код и библиотеку - посмотрю, не покажете - живите так. Я же Вам писал, чтобы код выкладывали. Только делайте это правильно. И ссылку на библиотеку не забудьте.
То что вы писали я сделал, оно не помогло, сейчас в нормальном режиме от сети работает этот код
#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 мкф то происходит сброс времени, если кондер выпаять то проблем не возникает
В этом коде я не вижу того, что я Вас просил сделать, потому не могу убедиться, что Вы сделали правильно.
Но уже можно не выкладывать. Я Вас несколько раз просил сделать, потом дважды просил "если не получится - показать код". Поскольку, Вы этого не сделали, значит, Вам не нужно.
В этом коде я не вижу того, что я Вас просил сделать, потому не могу убедиться, что Вы сделали правильно.
Да он наверняка этого и не делал. Или делал тяп-ляп, чтоб отвязаться. Он только пишет, что его интересует работа часов, а на самом деле ему нужен только ответ на вопрос - "Почему же, пля, платы работают по разному?" - и все, что этого не касается. его не занимает...
Так называемая "ложная концентрация".
#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); }Просто заменил на методы из своей библиотеки, все компилируется без проблем, ссылку на библиотеку я кидал выше, но толку от этого нет
Что Вы писали? Строки 10-12 я вижу впервые, раньше Вы их не выкладывали.
О, уже поменялось. Уже строки 19-21. Писал он :)))
ну я переписал увидел что там не все в том посте
Просто заменил на методы из своей библиотеки, все компилируется без проблем,
Вы написали бред. Надо было не "просто заменять", а заменять правильно. В этой библиотеке эти функции устроены по-другому. Дали бы Вы мне код сразу - не было бы столь длинной переписки. Поймите, моё время тоже не безгранично, и я не могу постоянно умолять Вас сделать хоть что-то для решения Вашей же проблемы, а когда Вы упорно не делаете, умолять снова. Сказано "выкладывайте код", значит выкладывайте код, а не думайте, что Вы сделали "просто". Если бы для Вас это было просто, этой темы бы не было.
В общем так, я таки скажу Вам что делать, но если опять не получится и не будет кода - идите Вы лесом! Я понятно выразился?
Попробуйте так