Часы DS1307 останавливаются.

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

Я уже всё попробовал но не могу пенять что нужно сделать чтобы часы не останавливались. С этой микрой я уже работал. Делал бинарные часы и там всё в порядке.
Сейчас делаю часы на газоразрядных индикаторах. Суть проблемы в том что при выключении блока питания часы (не каждый раз. Как попадётся) перестают идти. То есть я включаю блок питания часы показывают время но не идут. Батарейку проверил. Нормальная. В чём может быть проблема и как её решить?!!
Мои наработки.
Код №1 стоит на бинарных часах (работает) на газо (через раз).

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

// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}

// Stops the DS1307, but it has the side effect of setting seconds to 0
// Probably only want to use this for testing
/*void stopDs1307()
{
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.send(0);
  Wire.send(0x80);
  Wire.endTransmission();
}*/

// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock
// Assumes you're passing in valid numbers
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.send(0);
   Wire.send(decToBcd(second));    // 0 to bit 7 starts the clock
   Wire.send(decToBcd(minute));
   Wire.send(decToBcd(hour));      // If you want 12 hour am/pm you need to set
                                   // bit 6 (also need to change readDateDs1307)
   Wire.send(decToBcd(dayOfWeek));
   Wire.send(decToBcd(dayOfMonth));
   Wire.send(decToBcd(month));
   Wire.send(decToBcd(year));
   Wire.endTransmission();
}

// Gets the date and time from the ds1307
void getDateDs1307(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfWeek,
          byte *dayOfMonth,
          byte *month,
          byte *year)
{
  // Reset the register pointer
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.send(0);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

  // A few of these need masks because certain bits are control bits
  *second     = bcdToDec(Wire.receive() & 0x7f);
  *minute     = bcdToDec(Wire.receive());
  *hour       = bcdToDec(Wire.receive() & 0x3f);  // Need to change this if 12 hour am/pm
  *dayOfWeek  = bcdToDec(Wire.receive());
  *dayOfMonth = bcdToDec(Wire.receive());
  *month      = bcdToDec(Wire.receive());
  *year       = bcdToDec(Wire.receive());
}

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

  // Change these values to what you want to set your clock to.
  // You probably only want to set your clock once and then remove
  // the setDateDs1307 call.
  second = 45;
  minute = 3;
  hour = 7;
  dayOfWeek = 5;
  dayOfMonth = 17;
  month = 4;
  year = 8;
  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(month, DEC);
  Serial.print("/");
  Serial.print(dayOfMonth, DEC);
  Serial.print("/");
  Serial.print(year, DEC);
  Serial.print("  Day_of_week:");
  Serial.println(dayOfWeek, DEC);

  delay(1000);
}

Код №2 пробовал на газо (тоже через раз)



#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h> // written by  mattt on the Arduino forum and modified by D. Sjunnesson

void setup()
{
  Serial.begin(9600);

  RTC.stop();
  RTC.set(DS1307_SEC,1);        //set the seconds
  RTC.set(DS1307_MIN,23);     //set the minutes
  RTC.set(DS1307_HR,12);       //set the hours
  RTC.set(DS1307_DOW,4);       //set the day of the week
  RTC.set(DS1307_DATE,5);       //set the date
  RTC.set(DS1307_MTH,3);        //set the month
  RTC.set(DS1307_YR,9);         //set the year
  RTC.start();

}

void loop()
{

  Serial.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true
  Serial.print(":");
  Serial.print(RTC.get(DS1307_MIN,false));//read minutes without update (false)
  Serial.print(":");
  Serial.print(RTC.get(DS1307_SEC,false));//read seconds
  Serial.print("      ");                 // some space for a more happy life
  Serial.print(RTC.get(DS1307_DATE,false));//read date
  Serial.print("/");
  Serial.print(RTC.get(DS1307_MTH,false));//read month
  Serial.print("/");
  Serial.print(RTC.get(DS1307_YR,false)); //read year 
  Serial.println();

  delay(1000);

}

Нашёл инструкцию на русском как пользоваться этими часами.
Есть такая штука как Clock Halt – управляет часами. Когда бит установлен то часы стоят. Чтобы запустить ход часов необходимо записать в этот бит 0. После подключения батареи резервного питания, этот бит уставлен и часы не считают время!
Другими словами что нужно сделать чтобы часы шли всегда! Кто нибуть сталкивался с этим?
 

wixa
Offline
Зарегистрирован: 05.02.2012

Я немного не в теме.... но из личного опыта.... Вообщем соорудил я arduino mini своими руками, для теста сделал блинк поочереди для всех портов..... т.е. они все поочереди зажигались, а потом поочереди тухли..... Запитал я arduino от блока питания компа, +5 напрямую, стоит отдельно от старого компа.... вообщем залил скетч, пошло выполнение программы.... всё классно.... но вот сижу роюсь в нете, и вдруг замечаю что arduino зависло.... часть светодиодов заженно, остальные потухли...... тыкнул ресет, всё пошло нормально..... сижу дальше необращаю внимания.... потом глядь, а у меня светодиоды, будто сбесились, программа выполняется, но в раз 10 быстрее.... опять ресет, и всё нормально, но я уже задумался.... и значит посидел я в нете, решил пойти спать..... выключаю на столе лампу настольную дневного света, и бац.... опять зависание..... ресет не клацаю, включаю лампу.... програма продолжилась..... опять выключаю.... нормально..... и вот в ходе включений и выключений её я обнаружил что из-за этого и происходят сбои..... незнаю что это, но похоже на какието помехи, возможно высоковольтные или еще какието.... а блок питания и лампа подключены к одной переноске..... вообщем думаю что может быть это не только из-за програмной части, а и из-за аналоговой....

Извините если не втему.... я новичек, просто поделился мыслями....:)

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

Я сам не знаю что это. По схеме у меня стоит преобразователь из 12в в 200в который питает 6 газоламп и 4 газоточьки. Часы то работают то не работают. Я тут кое что нашёл на форуме. Но не какой конкретики. Последнее сообщение: "Подобная проблема была когда нагрузка индуктивная включалась. Часы останавливались. Проблема решилась конденсатором на ножки питаня ds1307. "
А каким конденсатором на какие ноги и сколько по объему не сказано!

В твоём случае попробуй поставить кондер на 10-20 мкф на питание. Arduino вырубить сложно какими то помехами а вот от недостатка питания возможно.
 

wixa
Offline
Зарегистрирован: 05.02.2012

стоит по питанию кондёр 10 uF ....

И изменнения в работе прослеживаются как при включении так и при выключении лампы.... что то там еще :)

kamosko
Offline
Зарегистрирован: 09.04.2012

 CODE

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

LEVV2006 пишет:

Я уже всё попробовал но не могу пенять что нужно сделать чтобы часы не останавливались. С этой микрой я уже работал. Делал бинарные часы и там всё в порядке.
Сейчас делаю часы на газоразрядных индикаторах. Суть проблемы в том что при выключении блока питания часы (не каждый раз. Как попадётся) перестают идти. То есть я включаю блок питания часы показывают время но не идут. Батарейку проверил. Нормальная. В чём может быть проблема и как её решить?!!

.............................................................................................................................

Нашёл инструкцию на русском как пользоваться этими часами.
Есть такая штука как Clock Halt – управляет часами. Когда бит установлен то часы стоят. Чтобы запустить ход часов необходимо записать в этот бит 0. После подключения батареи резервного питания, этот бит уставлен и часы не считают время!
Другими словами что нужно сделать чтобы часы шли всегда! Кто нибуть сталкивался с этим?
 

Если у вас RESET (у ATmega) не подтянут к +5в резистором 10 кОм, то скорее всего дело именно в этом.

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

Я уже починил. Конденсатор на 100 мкф припаял к ногам часов (+,-)и всё заработало. 

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

А лампа дневного света? и со стартером?

wixa
Offline
Зарегистрирован: 05.02.2012

Вопрос наверное ко мне :) ХЗ я не очень разбираюсь..... но процец зажигания примерно такой : блым-блым-блым-зажглась..... наверное со стартером :) Китайская, с большим блоком питания, настольная, которая вертится во все стороны :) Резистор на 10 кОм стоит на Reset к +5В. 

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

Да ошибся, и первый коммент тоже вам, у меня такая же лампа, пока резистор не поставил симптомы были как и у вас.

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

Я вообще то с этими лампами работаю 

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

Я вот про эту )

 

wixa
Offline
Зарегистрирован: 05.02.2012

Да, лампа похожая на эту.... Но резистор у меня стоит :) Видимо есть еще проблема в чем то :) 

Borland
Offline
Зарегистрирован: 17.05.2012

Разрешите поднять тему

Собрал таймер по схеме

http://www.stepwood.com/avrsuite/wp-content/uploads/2012/04/ds1307exampl...

но без подтягивающих резисторов на SCL SDA и конденсатора

Понимаю что не прав, но не было под рукой

тем не менее работало. Перестало работать в полевых условиях , полагаю по вечерам, когда выпадала роса, не работали именно часы, память  прекрасно читалась/писалась, опрос и установка часов происходил без ошибок. По крестьянски решил что вероятно кварц с росой не дает частоты на  чип, залил лаком, сухую . Вроде получше, но через некоторое время часы снова встали.

Читаю что подтягивающие резисторы на SCL и SDA + конденсатор, вероятно решат мои проблемы, Но хотелось бы понимания почему в моей куцей схеме происходит то что происходит - стоят часы, тоесть понять физику  процесса , ну там повышенное напряжение на такой то ноге изза отсутствия сопротивления оказывает влияние на то то и тото ...

Хотелось бы чтобы спец разжевал.

Borland
Offline
Зарегистрирован: 17.05.2012

Упс, это конечно аппаратный вопрос, но не хотелось подымать новую тему

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

Я не спец на напишу))) Подтягивающие резисторы нужны для согласования уровней напряжения. Особенно это нужно для длинных линий шины. Если часы стоят возле мк то они не критичны. По крайней мере у меня всё работает. Если память считывается а часы не идут то это значит что либо глючит кварц, либо по каким то причинам записывается единица в ячейку памяти отвечающая за ход часов.
1) Это может быть связанно с питанием. Проверь питание чтобы не было всяких проседаний и прочее (стабилизатор).
2) Проверь нет ли флюса!!!
3) Попробуй прикрепить как я писал раньше конденсатор электролит… на (где то) 100 мкф прямо к ногам часов
P/S/ тоже интересно. Может есть и другие причины остановки. Сейчас проект лежит. Так там чтение из памяти через раз происходит. Так из за этого то нормальное время показывает то нули.
 

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

LEVV2006 пишет:

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

Предназначение этих резисторов подтягивать линии к +5 вольт, но не как не для согласования уровней так как у МК и часов уровни одинаковые.

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

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

Вообщем оправдания типа " не было под рукой" это можно рассказывать начальнику, но не оборудованию:) Хотя и начальники тоже, от этого частенько глючить и искрить начинают, с непредсказуемыми последсвиями ;)

С конденсаторами - не торопится. Могут, нооборот, помешать. Тем более не совсем понятно куда и зачем его вкручивать собрались.

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

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

maksim пишет:

LEVV2006 пишет:

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

Предназначение этих резисторов подтягивать линии к +5 вольт, но не как не для согласования уровней так как у МК и часов уровни одинаковые.

А тогда для чего нужна подтяжка?

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

LEVV2006 пишет:

maksim пишет:

LEVV2006 пишет:

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

Предназначение этих резисторов подтягивать линии к +5 вольт, но не как не для согласования уровней так как у МК и часов уровни одинаковые.

А тогда для чего нужна подтяжка?

??? ;)

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

leshak
«С конденсаторами - не торопится. Могут, наоборот, помешать. Тем более не совсем понятно куда и зачем его вкручивать собрались.»
Вряд ли он помешает. У меня так было от помех в питании часы останавливались. Конденсатор спас.
 

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

 

LEVV2006 пишет:

leshak
«С конденсаторами - не торопится. Могут, наоборот, помешать. Тем более не совсем понятно куда и зачем его вкручивать собрались.»
Вряд ли он помешает. У меня так было от помех в питании часы останавливались. Конденсатор спас.

Я же сказал не "не нужно", а "не торопится". Зачем городить опциональные детали, пока наблюдается явная нехватка "обязательных"? Не плодите сущностей сверх необходимого.
К тому же, вот вы счас упомянули про "помехи в питании", а из #13 можно сделать предположение, что Borland куда-то на  SCL SDA линии готов прицепить конденсатор. Где он может начать "кушать" полезные импульсы и человек опять будет гадать "почему не работает".

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

leshak пишет:

LEVV2006 пишет:

maksim пишет:

LEVV2006 пишет:

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

Предназначение этих резисторов подтягивать линии к +5 вольт, но не как не для согласования уровней так как у МК и часов уровни одинаковые.

А тогда для чего нужна подтяжка?

??? ;)

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

Вы же знаете как себя ведет кнопка без "подтяжки" вот и здесь тоже самое.

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

maksim пишет:

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

А всё разобрался спасибо.
Если касательно моего проекта. То там эти резисторы есть и я их даже заменял на новые. Но всё равно нормально работать не хочет.
 

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

Может вы его очень часто опрашиваете? 

Borland
Offline
Зарегистрирован: 17.05.2012

Эх ))) чувствую ссылка leshak это последнее и окончательное  руководство для идиотов, и все равно боюсь не осилю ))

правильно ли я понимаю что подтяжка к земле или к плюсу дает четкие 0 или  единицу невзирая на помехи) в случае если дуина ничего туда не пишет ?

Как хотелось бы чтобы это было так, хоть чтото понять....

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

maksim пишет:

Может вы его очень часто опрашиваете? 

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

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

Borland пишет:

Эх ))) чувствую ссылка leshak это последнее и окончательное  руководство для идиотов, и все равно боюсь не осилю ))

Можете пролистать до слов "Для детей в картинках и комиксах". До этого там идет много объяснений как именно порт "устроен внутри" и как с ним работать напрямую, а не digitalWrite (тот сайт не ардуиновский, а "просто микроконтроллерый"). А после начинается именно объяснение "как сам подтягивающий работает".

 

Borland пишет:

 

правильно ли я понимаю что подтяжка к земле или к плюсу дает четкие 0 или единицу невзирая на помехи) в случае если дуина ничего туда не пишет ?

Как хотелось бы чтобы это было так, хоть чтото понять....

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

Но "общая идея" именно такова. Сделать что-бы пин, на который "никто не воздействует" не "болтался на ветру" под действием случайных помех, а имел какае-то "предсказумое значение" (0 если подтягивающий к земле, 1 если подтягивающий к питанию).

zuka
Offline
Зарегистрирован: 15.07.2016

Ещё один коммент к блочку Tuny1307:

аккумулятор стоит на 3,6v и заряжается он где-то до 4,5v 

а батарейка даёт 3v , от этого тоже сбои идут, особенно если батарея подсела

Pasha_2
Offline
Зарегистрирован: 15.03.2017

LEVV2006 подскажи как ты решил проблему со сбоем в DS1307, у меня почти такая же проблема, часы от USB  от компа работают как "часы" стабильно не останавливаются, а от импульсного блока питания иду 3 или  или 10 секунд и останавливаются, я делал стабилизатор и на 7805, и на MC34063A, все равно тоже самое, уже не знаю что и попробовать - может транформаторный блок питания, что не желательно.