Помогите разобраться с часами DS1307
- Войдите на сайт для отправки комментариев
Здравствуйте! Нужна Ваша помощь!
У меня Ардуина Мега 2560, хочу подключить к ней RTC DS1307. Купил на ебае вот такой модуль http://www.ebay.com/itm/130702223257?ssPageName=STRK:MEWNX:IT&_trksid=p3...
и возникли вопросы. Вроде как бы все понятно, но ничего не понятно.
1. Как подключить. Если я все правильно понял, то SDA цепляем на 20 пин ардуины, а SCL на 21 (на этих ногах ардуины реализована шина I2C) GND - на землю. Vcc +5V. Если я планирую использовать не одно устройство на этой шине, то нужно ли мне использовать подтягивающие резисторы на SDA и SCL к 5 вольтам? Если нужно то какой должен быть номинал резисторов 4,7К или 10К ? В интернете вроде полно примеров, но все выполнены по разному, запутали меня.
2. Какую библиотеку лучше использовать? У меня IDE 1.0.1 Опять же в интернете полно всяких библиотек для RTC (некторые примеры реализованы просто через wire.h), но какая точно подойдет, конечно можно методом "тыка"...
3. Хотелось бы найти заведомо рабочие примеры скетчей.
Интернет ковырял, гуглил, копал форум ардуины, инфы много... а вопросов еще больше.
>Если я планирую использовать не одно устройство на этой шине
Рояля не играет сколько устройст. Подтягивающий резистор должен быть. Одна штука. Вне зависимости от того сколько устройст.
>какой должен быть номинал резисторов 4,7К или 10К ?
По даташиту, вроде 4.7K. Но и с 10K ничего страшного не случится. Это тот случай когда "больше не меньше".
Нужно просто понять смысл этого резистора. Представте себе что линия эта "натянутая струна". Котрую устройство "дергает вниз" (подключает к нулю) что-бы передать какую-то информацию морзянкой. Но устройство только может только "дергать вниз". Что-бы, после того как устройство "отпустило" эту струну, она вернулась в верхнее положение (логическая 1) - нужна какая-то пружинка-резиночка, которая будет ее возвращать в 1. Вот этот резистор и есть эта "пружинка". Чем больше его номинал (слабее пружинка) - тем легче линию "придавить к нулю" (и при этом меньше ток идет), но и "возвращатся в 1" соотвественно линия будет более медленно. И наоборот, при малом номинале (тугая пружина)- труднее придавить к нулю, но зато, после отпускания, логическая 1 востановится быстрее.
Так что какой именно резистор вы тут возьмете - не сильно критично. Какой есть под руками. Безопастно - в любом случае. Ну а дальше просто смотреть работает стабильно или нет.
Если погуглить "ds1307 application note" то можно найти пример-рекомендацию от производителя микрухи
http://www.maxim-ic.com/app-notes/index.mvp/id/95
Как видим они используеют 5K (вообщем фактически те же 4,7K из стандартного ряда)
leshak , спасибо за ответ! Все на пальцах объяснили. Но у меня еще тут вопросец появился.
Есть у меня RTC DS1307 и датчик давления BMP085. Питание у DS1307 +5В, а у BMP085 3,3В. Как их подключить к шине I2C. Точней я запутался с подтягивающими резисторами. Исходя из даташита каждого устройства я понимаю как их подключить по отдельности, а как вместе, если питание у каждого устройства разное? Вот например так или нет? (не получается вставить картинку на форум, закинул на хостинг).
http://s3.itrash.ru/idb/00399af77a0efaf25f75a66bf8f2e84c/oP1070646.jpg
Объяснить-то объяснили, но не похоже что поняли :)
Иначе как объяснить попытку всандалить два подтягивающих резистора? Хотя четко написал "Рояля не играет сколько устройст. Подтягивающий резистор должен быть. Одна штука. Вне зависимости от того сколько устройст."
Вот в соотвествии с этими объяснениями, какое напряжение, по вашему, должно в этой схеме образоватся когда ни одно устройство не давит линию к нулю? Одна "пружинка" тянет к 5v, другая к 3v. Что на линии будет? Вы же, фактически, еще линия питания 5v и 3v между собой соединили. Через резистор 9.4K и у вас ток пойдейт вкачиватца в 3v из 5v.
Честно говоря я не готов сказать 100% "как правильно", но то что ваша схема "неправильно" - это точно.
Подключать на одну шину устройства с разными уровнями питания - я не пробовал. Беглое гугление дало такие результаты:
Питают его от 3.3V, а вот линиюю SDA,SLC подключают просто к шине. Не обращая внимание на что там бывает 5v. Хотя прямого указания, в даташите, что эти входы допускают подачу на них 5v - я не нашел. Но у шилдов, на его базе, такое упоминине есть. Так что если "параноится", то нужно еще какое-то согласование уровней мудрить.... но во всех примерах что мне попались никаким согласованием не пахнет.
Вот один из примеров: http://wiring.org.co/learning/libraries/bmp085.html или вот http://www.sparkfun.com/tutorials/253. На втором примере можон еще и схематику ихнего брекаута посмотреть.
Обратите внимание что в этих примерах не видно вообще никаких подтягивающих резисторов. Это объясняется тем что они уже есть на брекауте. Так что самому их ставить уже не нужно (даже если у вас есть еще и другие устройства на шине). Если же у вас "голый" чип, то этим нужно озаботится. Вообщем на линии должен быть один резистор.
Я бы попробовал делать наверное так: запитал DS1307 от 5v, а BPM от 3.3v, и подключил подключил их обоих к линииям SDA,SLC, а сами линии подтянул-бы резисторами 4.7K (по резистору на линию) к 3.3v. Если DS1307 так работать не захочет, тогда попробовал бы рискнуть и подтянуть не к 3.3v, а 5v (но при этом BPM все равно питать нужно от 3.3v).
Для ардуины и DS1707. оба варианта будут безопастны. Рискует только BPM в варианте подтяжки к 5v. Но риск весьма "условный" Если верить фразе "Logic: 3 to 5V compliant" на http://www.adafruit.com/products/391 то риска нет.
Итого: какую-то пару резисторов с вашей схемы нужно убрать. Либо левую, либо правую. Безопастней, для BMP, - убрать левую пару резисторов (подтягивающих к 5v). Если юзаете не голый чип, а брекаут от спаркфуда - убрать все. Правая пара уже "встроена" в сам брекаут.
Спасибо за ответ :) На счет своей схемы, конечно, вы правы это полная ерунда! Да я и сам понял, получилось что засиделся допоздна, голова уже не работала и в порыве отправил сообщение. Попробую сначада подтянуть к 3,3 v. Рассмотрел внимательно свои брекауты, на датчике давления резисторов нет, пины SDA и SCL распаяны прямо на чип, так что думаю резисторы будут не лишними.
На счет "параноиться", с согласованием уровней - почему бы и нет, мне как самостоятельно изучающему эту "науку" было бы не лишне разобраться и в этом вопросе. Вот кстати нашел у буржуев по данной тематике.. http://arduino.cc/playground/Main/I2CBi-directionalLevelShifter
Собрал все воедино, RTC и BPM085 подтянул к 3,3 V. Заработало сразу, и без проблем.
На счет "параноиться", с согласованием уровней - почему бы и нет, мне как самостоятельно изучающему эту "науку" было бы не лишне разобраться и в этом вопросе. Вот кстати нашел у буржуев по данной тематике.. http://arduino.cc/playground/Main/I2CBi-directionalLevelShifter
Архиправильный подход :)
"Наши" люди тоже умеют писать на эти темы Согласование логических уровней 5В и 3.3В устройств
Лично мне нравится диодный вариант. Просто потому что "я смог понять как он работает" и соотношение надежность/простота меня устраивает.
Чтобы не множыть темы напишу здесь.
Ардуино нано и такие же часы как здесь обсужалить. Брал тут.
Делал:
1. Подключил к часам GND и +5v. SDA к пину 4 и SCL к пину 5. Не работает.
2. Понял что туплю подключил подтягивающие резисторы. Напряжение на резисторах 0.28 вольт. Не работает.
3. Пробовал использовать различные библиотеки (4 разных). Не работает. Один из скетчей:
Как не работает: Выше приведенный скетч выдает такое в независимо от того подключены часы или нет.
Вопрос: Что я делаю неправильно, в чем может быть проблема. Как проверить вообще рабочие ли часы?
>Напряжение на резисторах 0.28 вольт.
Что-то сильно странное. Правда не понятно что вы имеете ввиду под "напряжение на резисторах". Падение на резисторе?
Лучше померять между землей и самой линией (SDA/SLC) там, когда нет передачи, благодаря резисторам должно быть "что-то близкое к пяти" (четыре с копейками). То есть лучше проверить что "Резисторы делают что нужно", а не сами резисторы мерять :)
>Как проверить вообще рабочие ли часы?
Можете попробовать вот что-то типа такого
http://todbot.com/blog/2009/11/29/i2cscanner-pde-arduino-as-i2c-bus-scan...
Скетчик опрашивает все адреса от 0 до 100, и говорит есть ли кто-то откликнувшийся. Узнаете слышыт ли вообще ардуина вашу железку.
И да, вот еще веточка может быть полезная
http://arduino.ru/forum/obshchii/sokhranenie-kartinok-na-forume
Там она расписывается как "Загружать на сервер" картинку, но в вашем случае, когда "картинка уже в инете и вы знаете ее урл" - на первом скриншоте достаточно вставить ее адрес в поле URL и нажать OK. И она будет видна прямо в посте.
Примерно так:
> Лучше померять между землей и самой линией
Если так мерять то напряжение ~ 5 вольт, как и предполагалось.
Как картинки всталять я заню, просто решил что в даном случае будет лучше ссылку просто оставыть.
Спасибо за ссылку на I2C сканер, проверю.
Глупость я делал. Подключал I2C на цифровые пины.
Сейчас все работает, извините за ненужные вопросы.
Глупость я делал. Подключал I2C на цифровые пины.
Сейчас все работает, извините за ненужные вопросы.
Боюсь спросить - а на какие пины надо подключать линию цифрового обмена данными?
Глупость я делал. Подключал I2C на цифровые пины.
Сейчас все работает, извините за ненужные вопросы.
Боюсь спросить - а на какие пины надо подключать линию цифрового обмена данными?
Есть предположение что "цифровыми" обозвали аналоговые. А цифровые "просто пинами". Тогда все встает на свои места - при подключении на аналоговые не работало, а при подключении на "просто пины" - заработало :)
Я имел ввиду что нужно подключать сюда:
Тоесть к аналоговым входам.
>Я имел ввиду что нужно подключать сюда:
Вот же блин. И в голову не пришло что это могут быть аналоговые пины. Пять раз перечитывал "I2C: 4 (SDA) и 5 (SCL)" и был свято уверен что речь идет про цифровые пины (обычно аналоговость отдельно оговорена).
У меня на меге, они просто без нумерации так и подписанны SDA, SCL :) И таки цифровые.
Так что " извините за ненужные вопросы" - лишние. Вопросы оказались очень даже нужными. Да еще сами и ответ нашли. И другим рассказали.
у меня arduino mega.
подключаю ds1307 к sda/20 и scl/21 пинам + питание и земля
без резистора
со стандартными примерами выдает время ...
сканер портов пробовал запускать -
ты её (DS1307) голую подключаешь, или модуль?
без какова резистора?
читал,что нужны подтягивающие резисторы линий SDA и SCL
подключаю модуль.
Может родные примеры подтягивают шины к "+" ?
код стандартный, из примеров)
попереключался, i2c сканер нашел 2 занятых порта!
сейчас выводит время после установки
В стране проблема с резисторами на 4К7 ?
все-таки они нужны?)))
они нужны по стандарту I2C