Официальный сайт компании Arduino по адресу arduino.cc
Часы DS1307 останавливаются.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Я уже всё попробовал но не могу пенять что нужно сделать чтобы часы не останавливались. С этой микрой я уже работал. Делал бинарные часы и там всё в порядке.
Сейчас делаю часы на газоразрядных индикаторах. Суть проблемы в том что при выключении блока питания часы (не каждый раз. Как попадётся) перестают идти. То есть я включаю блок питания часы показывают время но не идут. Батарейку проверил. Нормальная. В чём может быть проблема и как её решить?!!
Мои наработки.
Код №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. После подключения батареи резервного питания, этот бит уставлен и часы не считают время!
Другими словами что нужно сделать чтобы часы шли всегда! Кто нибуть сталкивался с этим?
Я немного не в теме.... но из личного опыта.... Вообщем соорудил я arduino mini своими руками, для теста сделал блинк поочереди для всех портов..... т.е. они все поочереди зажигались, а потом поочереди тухли..... Запитал я arduino от блока питания компа, +5 напрямую, стоит отдельно от старого компа.... вообщем залил скетч, пошло выполнение программы.... всё классно.... но вот сижу роюсь в нете, и вдруг замечаю что arduino зависло.... часть светодиодов заженно, остальные потухли...... тыкнул ресет, всё пошло нормально..... сижу дальше необращаю внимания.... потом глядь, а у меня светодиоды, будто сбесились, программа выполняется, но в раз 10 быстрее.... опять ресет, и всё нормально, но я уже задумался.... и значит посидел я в нете, решил пойти спать..... выключаю на столе лампу настольную дневного света, и бац.... опять зависание..... ресет не клацаю, включаю лампу.... програма продолжилась..... опять выключаю.... нормально..... и вот в ходе включений и выключений её я обнаружил что из-за этого и происходят сбои..... незнаю что это, но похоже на какието помехи, возможно высоковольтные или еще какието.... а блок питания и лампа подключены к одной переноске..... вообщем думаю что может быть это не только из-за програмной части, а и из-за аналоговой....
Извините если не втему.... я новичек, просто поделился мыслями....:)
Я сам не знаю что это. По схеме у меня стоит преобразователь из 12в в 200в который питает 6 газоламп и 4 газоточьки. Часы то работают то не работают. Я тут кое что нашёл на форуме. Но не какой конкретики. Последнее сообщение: "Подобная проблема была когда нагрузка индуктивная включалась. Часы останавливались. Проблема решилась конденсатором на ножки питаня ds1307. "
А каким конденсатором на какие ноги и сколько по объему не сказано!
В твоём случае попробуй поставить кондер на 10-20 мкф на питание. Arduino вырубить сложно какими то помехами а вот от недостатка питания возможно.
стоит по питанию кондёр 10 uF ....
И изменнения в работе прослеживаются как при включении так и при выключении лампы.... что то там еще :)
CODE
Я уже всё попробовал но не могу пенять что нужно сделать чтобы часы не останавливались. С этой микрой я уже работал. Делал бинарные часы и там всё в порядке.
Сейчас делаю часы на газоразрядных индикаторах. Суть проблемы в том что при выключении блока питания часы (не каждый раз. Как попадётся) перестают идти. То есть я включаю блок питания часы показывают время но не идут. Батарейку проверил. Нормальная. В чём может быть проблема и как её решить?!!
.............................................................................................................................
Нашёл инструкцию на русском как пользоваться этими часами.
Есть такая штука как Clock Halt – управляет часами. Когда бит установлен то часы стоят. Чтобы запустить ход часов необходимо записать в этот бит 0. После подключения батареи резервного питания, этот бит уставлен и часы не считают время!
Другими словами что нужно сделать чтобы часы шли всегда! Кто нибуть сталкивался с этим?
Если у вас RESET (у ATmega) не подтянут к +5в резистором 10 кОм, то скорее всего дело именно в этом.
Я уже починил. Конденсатор на 100 мкф припаял к ногам часов (+,-)и всё заработало.
А лампа дневного света? и со стартером?
Вопрос наверное ко мне :) ХЗ я не очень разбираюсь..... но процец зажигания примерно такой : блым-блым-блым-зажглась..... наверное со стартером :) Китайская, с большим блоком питания, настольная, которая вертится во все стороны :) Резистор на 10 кОм стоит на Reset к +5В.
Да ошибся, и первый коммент тоже вам, у меня такая же лампа, пока резистор не поставил симптомы были как и у вас.
Я вообще то с этими лампами работаю
Я вот про эту )
Да, лампа похожая на эту.... Но резистор у меня стоит :) Видимо есть еще проблема в чем то :)
Разрешите поднять тему
Собрал таймер по схеме
http://www.stepwood.com/avrsuite/wp-content/uploads/2012/04/ds1307exampl...
но без подтягивающих резисторов на SCL SDA и конденсатора
Понимаю что не прав, но не было под рукой
тем не менее работало. Перестало работать в полевых условиях , полагаю по вечерам, когда выпадала роса, не работали именно часы, память прекрасно читалась/писалась, опрос и установка часов происходил без ошибок. По крестьянски решил что вероятно кварц с росой не дает частоты на чип, залил лаком, сухую . Вроде получше, но через некоторое время часы снова встали.
Читаю что подтягивающие резисторы на SCL и SDA + конденсатор, вероятно решат мои проблемы, Но хотелось бы понимания почему в моей куцей схеме происходит то что происходит - стоят часы, тоесть понять физику процесса , ну там повышенное напряжение на такой то ноге изза отсутствия сопротивления оказывает влияние на то то и тото ...
Хотелось бы чтобы спец разжевал.
Упс, это конечно аппаратный вопрос, но не хотелось подымать новую тему
Я не спец на напишу))) Подтягивающие резисторы нужны для согласования уровней напряжения. Особенно это нужно для длинных линий шины. Если часы стоят возле мк то они не критичны. По крайней мере у меня всё работает. Если память считывается а часы не идут то это значит что либо глючит кварц, либо по каким то причинам записывается единица в ячейку памяти отвечающая за ход часов.
1) Это может быть связанно с питанием. Проверь питание чтобы не было всяких проседаний и прочее (стабилизатор).
2) Проверь нет ли флюса!!!
3) Попробуй прикрепить как я писал раньше конденсатор электролит… на (где то) 100 мкф прямо к ногам часов
P/S/ тоже интересно. Может есть и другие причины остановки. Сейчас проект лежит. Так там чтение из памяти через раз происходит. Так из за этого то нормальное время показывает то нули.
Подтягивающие резисторы нужны для согласования уровней напряжения.
Предназначение этих резисторов подтягивать линии к +5 вольт, но не как не для согласования уровней так как у МК и часов уровни одинаковые.
Резисторы подтягивающие ставить однозначно. Они нужны по самой спецификации шины. Без них все будет работать "по фазе луны и погоды на марсе". Почему "дома работает" - можно предположить, но это именно из серии "дома погода тихая".
Вообщем оправдания типа " не было под рукой" это можно рассказывать начальнику, но не оборудованию:) Хотя и начальники тоже, от этого частенько глючить и искрить начинают, с непредсказуемыми последсвиями ;)
С конденсаторами - не торопится. Могут, нооборот, помешать. Тем более не совсем понятно куда и зачем его вкручивать собрались.
Проверить остатки флюса - хороший совет, никогда не помешает. Хотя, если бы причина была в этом, то скорее всего и дома-бы не работало.
Подтягивающие резисторы нужны для согласования уровней напряжения.
Предназначение этих резисторов подтягивать линии к +5 вольт, но не как не для согласования уровней так как у МК и часов уровни одинаковые.
А тогда для чего нужна подтяжка?
Подтягивающие резисторы нужны для согласования уровней напряжения.
Предназначение этих резисторов подтягивать линии к +5 вольт, но не как не для согласования уровней так как у МК и часов уровни одинаковые.
А тогда для чего нужна подтяжка?
??? ;)
http://easyelectronics.ru/avr-uchebnyj-kurs-ustrojstvo-i-rabota-portov-vvoda-vyvoda.html
leshak
«С конденсаторами - не торопится. Могут, наоборот, помешать. Тем более не совсем понятно куда и зачем его вкручивать собрались.»
Вряд ли он помешает. У меня так было от помех в питании часы останавливались. Конденсатор спас.
leshak
«С конденсаторами - не торопится. Могут, наоборот, помешать. Тем более не совсем понятно куда и зачем его вкручивать собрались.»
Вряд ли он помешает. У меня так было от помех в питании часы останавливались. Конденсатор спас.
Я же сказал не "не нужно", а "не торопится". Зачем городить опциональные детали, пока наблюдается явная нехватка "обязательных"? Не плодите сущностей сверх необходимого.
К тому же, вот вы счас упомянули про "помехи в питании", а из #13 можно сделать предположение, что Borland куда-то на SCL SDA линии готов прицепить конденсатор. Где он может начать "кушать" полезные импульсы и человек опять будет гадать "почему не работает".
Подтягивающие резисторы нужны для согласования уровней напряжения.
Предназначение этих резисторов подтягивать линии к +5 вольт, но не как не для согласования уровней так как у МК и часов уровни одинаковые.
А тогда для чего нужна подтяжка?
??? ;)
Подтяжка нужна чтобы вывод настроенный на вход не ловил наводок в момент когда линия свободна. В интерфейсе I2C по одному и тому же проводу идут данные как в одну так и в другую сторону, а значит бывают моменты когда линия свободна - все устройства "слушают" (все устройства настроены на вход) и если данные читаются через раз то причина может быть и в отсутствии этих резисторов.
Вы же знаете как себя ведет кнопка без "подтяжки" вот и здесь тоже самое.
если данные читаются через раз то причина может быть и в отсутствии этих резисторов.
А всё разобрался спасибо.
Если касательно моего проекта. То там эти резисторы есть и я их даже заменял на новые. Но всё равно нормально работать не хочет.
Может вы его очень часто опрашиваете?
Эх ))) чувствую ссылка leshak это последнее и окончательное руководство для идиотов, и все равно боюсь не осилю ))
правильно ли я понимаю что подтяжка к земле или к плюсу дает четкие 0 или единицу невзирая на помехи) в случае если дуина ничего туда не пишет ?
Как хотелось бы чтобы это было так, хоть чтото понять....
Может вы его очень часто опрашиваете?
Я уже несколько часов сделал. И код и подключение часов одинаковы во всех случаях. Я тоже раньше думал что проблема в частоте опрашивания. Но нет.
Эх ))) чувствую ссылка leshak это последнее и окончательное руководство для идиотов, и все равно боюсь не осилю ))
Можете пролистать до слов "Для детей в картинках и комиксах". До этого там идет много объяснений как именно порт "устроен внутри" и как с ним работать напрямую, а не digitalWrite (тот сайт не ардуиновский, а "просто микроконтроллерый"). А после начинается именно объяснение "как сам подтягивающий работает".
правильно ли я понимаю что подтяжка к земле или к плюсу дает четкие 0 или единицу невзирая на помехи) в случае если дуина ничего туда не пишет ?
Как хотелось бы чтобы это было так, хоть чтото понять....
Ваша хотелка исполнилась. Общую идею подтягивающего резистора вы уловили верное. Ну разве что с поправкой что не "когда дуина не пишет", а "когда его никто не притягивает (подключает) к нулю линию" (при резисторе подтягивающем к питанию). Потому как "придавливать линию к нулю" может и дуина, и I2C устройство, да и банальная кнопка.
Но "общая идея" именно такова. Сделать что-бы пин, на который "никто не воздействует" не "болтался на ветру" под действием случайных помех, а имел какае-то "предсказумое значение" (0 если подтягивающий к земле, 1 если подтягивающий к питанию).
Ещё один коммент к блочку Tuny1307:
аккумулятор стоит на 3,6v и заряжается он где-то до 4,5v
а батарейка даёт 3v , от этого тоже сбои идут, особенно если батарея подсела
LEVV2006 подскажи как ты решил проблему со сбоем в DS1307, у меня почти такая же проблема, часы от USB от компа работают как "часы" стабильно не останавливаются, а от импульсного блока питания иду 3 или или 10 секунд и останавливаются, я делал стабилизатор и на 7805, и на MC34063A, все равно тоже самое, уже не знаю что и попробовать - может транформаторный блок питания, что не желательно.