Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Вс апр 01, 2018 15:09:05

Тут можно сказать: есть задача, есть разные пути её решения. Ни когда не знаешь заранее верного пути. Как можно заранее знать, что сам себе переусложнил задачу? Я бы остановился на первом варианте, если б он заработал. Быстро, просто и легко.

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

Я не считаю, что я что-либо перемудрил. Нет "правильного" и "не правильного", есть "рабочее" или "не рабочее". Это важно! "Мудрость" тут вообще не при чём. Можно было сдаться, заныть, заплатить безбашенных денег "дяде". Но когда решение найдено, то это весомее миллионов слов и мнений.

Просто советую искать и не сдаваться. Опыт дело наживное.

И наверное хватит оффтопы разводить ))

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пт апр 06, 2018 13:38:23

Здравствуйте!!! Вот не задача. Ранее мной был написан код для изучения и тестирования работы с часами по TWI. На тот момент все отрабатывало на УРА.Затем я снова вернулся к своему грандиозному проекту для внедрения этих часов.Немнго усовершенствовал ранее написанный код и приступил к испытаниям.Но новая версия работает как-то не стабильно.Обмен с данными по TWI не стабильны.А именно то есть ACK то нет. Долго искал причину, перепробовал всякое,тем не менее решил проверить ранее написанный код. и обнаружилось,что тоже самое происходит и с проверенным кодом. В коде ниже я привел пример на функции чтения данных из часов. каждая сессия чтения отличается, то считывается 6 байт, то 2 байта где-то есть ACK где-то его нет, а где-то анализатор выдает Missing ACK/NACK. Я максимально убрал не нужное с кода, оставил минимум нужного, чтобы было проще анализировать.Я уже подумываю на то , что конкретно измучил свой МК и нужно его менять. Дальнейшая его судьба зависит от Вас :(

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пт апр 06, 2018 14:28:31

Код:
   START_TWI();
   TWDR=0xd0;
   clear_TWINT_ACK();

По-моему, уже тут ошибка. Зачем взводить TWEA бит, если это ЗАПИСЬ байта?

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

Ну и, чисто эстетически, две одинаковые функции старта не нужны.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пт апр 06, 2018 15:00:13

По-моему, уже тут ошибка. Зачем взводить TWEA бит, если это ЗАПИСЬ байта?

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

эстетически да,понимаю...

вот с исправленными замечаниями:


Добавлено after 5 minutes 11 seconds:
При пошаговой отладке заметил,что происходит зацикливание в while(!(TWCR&(1<<TWINT))). флаг TWINT не выставляется.С чем это может быт связано? Не помню в какой статье, велась дискуссия по поводу цикла while(!(TWCR&(1<<TWINT))). Один из участников писал, что такой цикл использовать нельзя, так как если часы отвалятся,то можно в цикле зависнуть навсегда.В даташите именно так ожидают флаг. Мое предположение,что если часы отвалятся, флаг в любом случае установиться,но будет соответствующий код ощибки в регистре стутуса. Так где истина?

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пт апр 06, 2018 20:08:22

У меня в этом цикле есть дополнительный счётчик, который при переполнении выскакивает из цикла. Тоже ввёл когда-то из-за подвисаний DS1307 (или чтобы работало при её отсутствиии).

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Вс апр 08, 2018 09:47:37

выскакивает из цикла.

не понятно почему нужно вручную выходить из цикла.TWINT устанавливается аппаратно,но этого не происходит.Он же в любом случае должен устанавливаться,хоть есть часы на шине, хоть их нет.Не хочется верить,что модульTWI глючит.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Вс авг 19, 2018 20:49:10

Здравствуйте,уважаемые Кототроники.Сегодня весь день перечитывал здешние посты посвященные часам 1307. Девайс,скажу вам довольно капризный.И не оттого,что он такой уж и сложный,а потому что даташит многих нужных вещах просто не пишет.Китайские товары всегда идут с примечанием "догадайся,мол,сама".А часики у меня долго не запускались,периодически дохли и воскресали,теряли время при выключении питания.Пришлось не раз курить даташит и предпринимать всяческие танцы с бубном,пока набрался некоторый опыт.Итак изложу все по-порядку.В проекте я пользуюсь контроллером АТМега16А,там на порту С пин0 и 1 есть аппаратный TWI (I2C).Он довольно капризный и пришлось немало поиграться пока я его оживил.Примеры кода я приведу в БАСКОМ-АВР,поскольку в нем и пишу.
1.Когда вы пишете шапку программы, правильно укажите скорость работы кристалла.У меня TWI работает только при 4000000 Гц.На скоростях ниже часы 1307 перестают быть видимыми.Кстати этот же фокус работает и для термометра DS18B20.Если с ним программа связаться не может - понизьте такты.И обязательно не забудьте ту же частоту выставить на фюзах контроллера
2.В Баскоме в шапке программы обязательно подключите библиотеку I2C_Twi.lbx если у вас аппаратный TWI.Эта библиотека есть в штатном дистрибутиве Баскома.
3.Правильно пропишите конфигурацию порта и пинов,на которых работает TWI. У меня в АТмеге16а TWI сидит на пинах 0 и 1 портаС. Потому в шапке пишу DDRC=&Bxxxxxx00 x - здесь определяет назначение пина 1 на ввод,0 на вывод.как вам нужно,но PinC.0 и PinC.1 выставлены здесь в нули на ввод.Если вы выставите их в 1,TWI не заработает и будете долго искать причину "поломки"
4.Определяю состояние уровней на пинах порта С при старте PortC=0,т.е все линии посажены в нуль.
5."Знакомлю" программу,где у нее пины SCL и SDA. Config SCL=PortC.0 Config SDA=PortC.1
6.Если TWI (или I2C) работают неуверенно,немного притормаживаю скорость обмена config I2Cdelay=10
7.Запускаю систему TWI,чтобы правильно выставила уровни на пинах С0 и С1 I2CInit.
8.Указываю программе скорость тактирования пина SCL Config TWI=100000
Все.Если у вас технически все подключено правильно,можете приступать к работе.Не забудьте,что пины SCL и SDA должны быть подтянуты к питанию резисторами 5..10Ком.

Рабочий код запускаем как обычно
I2CStart 'стартуем обмен с устройствами на шине TWI (I2C)
I2Cwbyte &HD0 'вызываем часы 1307 по их адресу &HD0
I2C wbyte 0 'выставляем регистр адресов на самый первый (нулевой по даташиту) регистр.Это регистр секунд
I2C wbyte 5 'Пишем в него что-нибудь в двоично-десятичном формате.Важно только,чтобы старший бит был равен 0,потому что он запускает часы 1307
Waitms 100 'даю схеме малость "опомниться" после проведенных манипуляций иначе у нее могут быть "заскоки".В иностранных программах этот "отдых" бывает даже до 500 миллисекунд.Я выставил 100.Пока хватает.Если в вашем экземпляре часов бывают каламбуры записи-чтения,пробуйте увеличивать интервалы между доступами к регистрам.
A=Minut 'некой байтовой переменной А присваивается значение Минут из подпрограммы настройки времени
A=MakeBCD(A) 'Дальше эта переменная конвертируется в двоично-десятичный вид функцией MakeBCD
I2Cwbyte A 'Конвертированная переменная А записывается в регистр минут часов 1307 и указатель адресов в микросхеме 1307 автоматом передвигается на регистр часов.
Записав данные в регистр минут снова даем схеме передышку Waitms 100 и по тому же образцу пишем часы,потом все остальное.Хотя и вроде не обязательно,но я также заношу ноль в регистр управления &HD7.Все.Заканчиваю настройку часов командой I2CStop.
А теперь про "фокусы" схемы.
1.Следите,чтобы напряжение на батарейке было в допустимых пределах.Иначе либо не читает,либо не пишет,либо вообще ее не видно.
2.В микросхеме по-видимому есть куча триггеров.которые должны находиться в каком-то определенном состоянии.По разным причинам,а особенно из-за пиковых всплесков напряжения на шине питания,статического электричества эти триггеры оказываются расстроенными и микросхема "защелкивается".Вроде все есть.все подключено,все в пределах,а она "сдохла".Путем танцев с бубном случайно удалось выяснить,что кратковременное замыкание вывода Vbat на землю действует как "сброс" и схема начинает отвечать на обращения.Долго не было понятно,почему регистры не держат настроек времени после выключения основного питания.Чего только не перепробовал.Помогло одно.Линии SCL и SDA отпаял от ведущего контроллера,чтобы его не повредить,потом SCL и SDA часов замкнул между собой накоротко и кратковременно "стукнул" по ним напряжением +5 вольт от шины питания.Ныне,тьху-тьху микросхема ожила и работает как в "былой молодости".Все пишет,все считает и хранит.Правда конфуз выловился некий и это уже внешними примочками не решить.Видно грешит внутренняя математика.Когда количество минут выставляю на 59 за ними на дисплее следует 60,61... и часы не меняются.Я рот разинул от удивления ... Если минуты при настройке выставляются в 58 все идет как по-салу.Вот пока... Успехов всем Кототроникам в их кропотливом хобби.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пн авг 20, 2018 00:08:32

Во-первых, на 4МГц (вроде там 6 нулей Вы нарисовали) TWI не рассчитан, частоты там на порядок меньше.. А DS1307 по даташиту вообще 100 кГц, ЕМНИП. Вот DS3231 может и на 400 кГц работать, но уж точно не на 4 МГц.
Во вторых, после 59 минут точно идут 00. Специально прямо сейчас поверил. А вот если зачем-то установить в большее, чем 60, значение, то будут и дальше увеличиваться, пока не выскочат-таки в нормальный диапазон.
В третьих, DS1307 - одно из самых простых устройств на шине I²C, и каких-либо сюрпризов от него ждать не приходится. Всё чётко по даташиту.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пн авг 20, 2018 09:42:12

Спасибо за замечания и за Ваши интересные посты из коих я многому поучился.По канону все должно быть так как Вы и пишете,но мои экземпляры 1307 почему-то капризны и не хотят работать в таких режимах.Более того я написал здесь в посте config TWI=100000 и скажу Вам честно,микруха работать перестала.Один нуль удалил,получилось config TWI=10000 (!).Только так она пашет как ни в чем не бывало.Я думаю,что у ребят,постивших здесь о своих проблемах с 1307,тоже попались китайские микрухи "с фокусами",нетрадиционалы по даташиту" так сказать.так что у кого микруха имитирует "дохлость" попробуйте оживить ее сбросом и подбором режимов тактирования.Вещи все-таки китайские,а там не все "по-закону".И еще,уважаемый WiseLord,я хотел бы посоветоваться у Вас насчет 5807М FM радио.Сделал я его,но работает что-то оно неуверенно.Похоже там нет автоподстройки частоты,со временем станция уплывает в шумы.На какой ветке мы можем с Вами побеседовать на сию тему? Спасибо за ответ.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пн авг 20, 2018 12:27:05

Если не ошибаюсь, там в регистрах был какой-то бит, отвечающий за это.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пн авг 20, 2018 12:40:07

Вы имеете ввиду схему 5807М я так понял.Там действительно в третьем регистре есть бит TUNE.Выставив его в 1 добиваемся точной настройки на станцию,после чего он автоматом сбрасывается в 0 и за привязкой к частоте ничто уже более не следит.Или я что-то накосячил в познаниях?

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пт окт 26, 2018 17:51:30

Здравствуйте, коты. Вопрос по кварцу. Нормально, что часы 1307 убежали на 3 минуты за месяц? Как сделать точнее? Перебирать кварцы или как то можно подстроить? Температура и питалово стабильны. Есть и 3231, но уже всё сделано в железе.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пт окт 26, 2018 18:08:13

Особо никак. Либо подбирать кварц получше, либо программно корректируйте, скажем, каждой ночью на 6 секунд.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Пт окт 26, 2018 22:55:04

Для корректировки времени я заводил 3-и байта в EEPROM и делал в меню возможность их настройки. Каждый байт определяет свою задержку. Старший - 10 миллисекунд, средний - 100 микросекунд и младший - 1 микросекунду. Значения байтов выступают при этом множителями. Диапазон значений 0-99. Паузу выбирал в две секунды и делал коррекцию 4-е раза в сутки (можно раз в сутки). Выбор значений взвалил на пользователя, т.к. учесть (рассчитать по алгоритмам) значения практически не возможно, т.к. много всяких процессов и неопределённостей. Дал команду остановки хода, взвёл 3-х байтный таймер, дождался отклика что ход остановлен, вывел сообщение о коррекции, дождался истечения таймера, запустил ход, обновил значение времени. Со своей стороны смог только обеспечить временное окно, когда наиболее безопасно проводить коррекцию хода. В итоге за месяц погрешность не превысила 1-й секунды. При этом точность хода корректировалась ещё только на среднем байте. Младший остался в более долгосрочной перспективе. Синхронизировал по "Satellite Time Reader" с сотового телефона, каждый раз после коррекции подкручивал секунды так, что б засвечивались одновременно (муторно не выполнимо).

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Сб окт 27, 2018 09:23:08

DrLirhium, спасибо за идею. Только сделаю "железную" коррекцию. Измерю поточнее на сколько конкретно часы спешат и последнюю секунду в сутках сделаю соответственно длиннее. Железные таймеры все заняты. Сделал на захвате протокол общения с датчиком темпер.-влажности DHT22-таймер1, ещё ШИМ и софт таймер. Asm, Mega8.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Чт янв 10, 2019 11:45:47

Подскажите пожалуйста по инициализации DS3231!
Что записывать в регистры 0EH, 0FH? Просто сколько не смотрю в даташит, то в регистр 0EH максимум требуется "пнуть" преобразование температуры.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Чт янв 10, 2019 13:30:15

Согласно написанному в даташите на страницах 13 и 14 расписываем биты в байте 0EH и 0FH, конвертим в HEX и скармливаем. В зависимости от вАшей ситуации меняем биты, конвертим в HEX и обновляем. Сложного ничего нет, просто надо прочитать и понять.

Сам не юзал 3231, возился с 1338. В ней, в моём случае (мне надо только включить SQW на 1Гц, для обновления значений на дисплее) регистр 07H = 00010000 или 0x10 в HEX.
Последний раз редактировалось DrLithium Пт янв 11, 2019 01:55:32, всего редактировалось 1 раз.

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Чт янв 10, 2019 13:37:35

serg_svd писал(а):DS3231
$0E-ещё разрешает, при необходимости, вывод разных частот в зависимости от битов RS1,0 и INTCN
$0F- можно запретить вывод 32кГц

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Чт янв 10, 2019 15:05:27

Короче сам виноват :)
Я подразумевал только пуск часов, безо всяких выходов и прочего. Просто после рассматривания даташита было у меня мнение, что вообще не надо инициализировать микросхему, если просто юзать часы без выходов и прерываний.
Ответить