1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Часы, будильник, таймер на Arduino

Содержание

Часы, будильник, таймер на Arduino. v1.0

Спецификация набора

То, что у вас уже есть, вы можете удалить в корзине.

НаименованиеЦенаКол-во
CR1225, Элемент питания литиевый (1шт) 3В63 руб.1
Troyka-Temperature Humidity Sensor DHT11, Цифровой датчик температуры и влажности380 руб.1
0.96inch OLED (A), OLED дисплей с разрешением 128х64px, интерфейсы SPI/I2C, изогнутый контакный разъем1 030 руб.1
Troyka-3D Joystick, 3D-джойстик для Arduino проектов570 руб.1
Troyka-Buzzer, Пьезодинамик 4кГц 80дБ для Arduino проектов240 руб.1
Troyka-Relay, Релейный модуль на основе RTD14005 16А/250В (7А/30В) для Arduino проектов640 руб.1
Troyka-RTC, Часы реального времени на оcнове DS1307 для Arduino проектов570 руб.1
Iskra Mini (без разъемов), Программируемый контроллер на базе ATmega328 (аналог Arduino Mini)640 руб.1

Описание

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

В качестве железа будем использовать Амперкины тройки, искру и дюймовый OLED дисплей.

Дисплей


0.96inch OLED (A) — это встраиваемый двухцветный (желтый/синий) OLED дисплей с интерфейсом I2C/SPI. Разрешение экрана 128х64 пикселей, а угол обзора более 160 градусов.
Размеры платы 29мм х 33 мм.

Контроллер


Iskra Mini — полноценная Arduino-платформа, только маленькая: всего 33×20 мм.

Обратите внимание, что на плате нет собственного USB-порта.
Поэтому для её прошивки понадобится посредник!
Им может быть другой контроллер Arduino

Характеристики Iskra Mini

  • Микроконтроллер: ATmega328
  • Тактовая частота: 16 МГц
  • Флеш-память: 32 КБ (2 КБ используются загрузчиком)
  • Оперативная память SRAM: 2 КБ
  • Энергонезависимая память EEPROM: 1 КБ
  • Рабочее напряжение: 5 В
  • Входное напряжение: 5,3–12 В
  • Портов ввода-вывода общего назначения: 20
  • Портов с поддержкой ШИМ: 6
  • Портов, подключённых к АЦП: 8 (4 из них на нераспаянных выводах)
  • Разрядность АЦП: 10 бит
  • Аппаратные интерфейсы: UART, SPI, I²C (на нераспаянных выводах)
  • Максимальный ток одного вывода: 40 мА
  • Максимальный ток с пина +5V: 150 мА

Цифровой датчик температуры и влажности


Troyka-Temperature Humidity Sensor DHT11.
Данные температуры и влажности датчик отдаёт по одному проводу в виде цифрового сигнала. Это позволяет передавать данные на расстояние до нескольких десятков метров.
В сердце модуля — популярная среди любителей сенсорная сборка DHT11. Он работает по собственному протоколу. На борту модуля — популярная среди любителей сенсорная сборка DHT11.

  • Напряжение питания: 3–5 В
  • Потребляемый ток при запросе данных: 2,5 мА
  • Потребляемый ток в ожидании: 100 мкА
  • Диапазон температур: 0–50 °С
  • Погрешность температуры: ±2 °С
  • Диапазон влажности: 20–90%
  • Погрешность влажности: ±5%
  • Габариты: 25×25 мм

3D-джойстик


3D Joystick — сделает управление нашим устройством быстрым и удобным.
Модуль-джойстик схож с «грибочком» на манипуляторах PlayStation и XBox. Он комбинирует в себе двухосный джойстик и тактовую кнопку. В нейтральном положении аналоговый сигнал соответствует половине напряжения питания. При перемещении джойстика в одну сторону напряжение будет нарастать, а при движении джойстика в другую сторону — падать. Таким образом, можно получать точное положение ручки джойстика и реагировать на угол наклона, а не только на сам факт наклона ручки. Хотя в этом проекте мы используем только факт наклона.

  • Напряжение питания: 3–5 В
  • Интерфейс по осям X, Y: аналоговый, линейный
  • Интерфейс кнопки: цифровой, бинарный
  • Габариты: 25×25 мм

Управление джойстиком

Нажатие влево — вход в меню настроек
изменяемое значение подсвечивается
нажатие вверх — изменение значения
нажатие вправо — переход к следующему значению
при настройки будильника слева появляется значок «а»
нажатие влево — выход из меню с сохранением изменений
время будильника сохраняется в энергонезависимой памяти

Нажатие вниз — вкл/откл будильника

Когда сработал будильник
первое нажатие на кнопку — отключение пищалки
второе нажатие на кнопку — отключение реле

Пьезодинамик


В нашем проекте нужно пищать. Воспользуемся модулем Buzzer.

  • Номинальная частота: 4 кГц
  • Интенсивность: 80 дБ
  • Номинальное рабочее напряжение: 5 В
  • Габариты: 25,4×25,4 мм

Релейный модуль


Модуль Relay это просто механический рубильник, которым можно управлять при помощи микроконтроллера, такого как Arduino. С помощью реле можно включать и выключать электроприборы, которые подключены к бытовой электросети 220 В. На модуле расположен светодиод, который всегда подскажет — замкнуто реле или нет.
У этого реле есть есть не только нормально разомкнутый (NO) контакт, но и нормально замкнутый (NC). Это удобно.

  • Номинальное напряжение питания: 5 В
  • Номинальное напряжение сигнала: 3–5 В
  • Максимальный ток коммутации: 16 А
  • Коммутируемое переменное напряжение (пиковое): 250 В
  • Потребляемый ток: 87 мА
  • Рабочая температура: −40…+85 °C
  • Магнитная система катушки: моностабильная
  • Рекомендованная частота переключения: до 1 Гц
  • Электрическая износостойкость (NO) контакта: 30×10³ переключений
  • Электрическая износостойкость (NC) контакта: 10×10³ переключений
  • Габариты: 50,8×25,4 мм

Часы реального времени


Модуль RTC — сделан на основе популярного чипа DS1307. Он общается с управляющей электроникой по протоколу I²C / TWI.
Слот предназначен для часовой батарейки размера CR1225 на 3В. Без неё модуль не работает даже с внешним питанием.

  • Напряжение внешнего питания: 4,5–5,5 В
  • Напряжение питания батарейки: 2–3,5 В
  • Потребляемый ток: 500 нА (≈6 месяцев на батарейке)
  • Выходной интерфейс: I²C
  • Габариты: 25,4×25,4 мм

Элемент питания

CR1225 – литиевая батарейка

  • Напряжение: 3В
  • Типоразмер cr1225

Обзор часов реального времени DS3231 (RTC)

Автор: Сергей · Опубликовано 16.01.2017 · Обновлено 13.04.2020

Модуль DS3231 (RTC, ZS-042) — представляет собой недорогую плату с чрезвычайно точными часами реального времени (RTC), с температурной компенсацией кварцевого генератора и кристалла. Модуль включает в себя литиевую батарею, которая поддерживает бесперебойную работу, даже при отключении источник питания. Интегрированный генератор улучшить точность устройства и позволил уменьшить количество компонентов.

Технические параметры

► Напряжение питания: 3.3В и 5В
► Чип памяти: AT24C32 (32 Кб)
► Точность: ± 0.432 сек в день
► Частота кварца:32.768 кГц
► Поддерживаемый протокол: I2C
► Габариты: 38мм x 22мм x 15мм

Общие сведения

Большинство микросхем, таких как DS1307 используют внешний кварцевый генератор частотой 32кГц, но в них есть существенный недостаток, при изменении температуры меняется частота кварца, что приводит к погрешности в подсчете времени. Эта проблема устранена в чипе DS3231, внутрь которого установили кварцевый генератор и датчик температуры, который компенсирует изменения температуры, так что время остается точным (при необходимости, данные температуры можно считать). Так же чип DS3231 поддерживает секунды, минуты, часы, день недели, дата, месяц и год информацию, а так же следит за количеством дней в месяце и делает поправку на високосный год. Поддерживает работу часов в двух форматов 24 и 12, а так-же возможно запрограммировать два будильника. Модуль работает по двух проводной шине I2C.

Теперь немного о самом модуле, построен он на микросхеме DS3231N. Резисторная сборка RP1 (4.7 кОм), необходима для подтяжки линий 32K, SQW, SCL и SDA (кстати, если используется несколько модулей с шиной I2C, необходимо выпаять подтягивающие резисторы на других модулях). Вторая сборка резисторов, необходима для подтяжки линий A0, A1 и A2, необходимы они для смены адресации микросхемы памяти AT24C32N. Резистор R5 и диод D1, служат для подзарядки батарее, в принципе их можно выпаять, так как обычной батарейки SR2032 хватает на годы. Так же установлена микросхема памяти AT24C32N, это как бы бонус, для работы часов RTC DS3231N в ней нет необходимости. Резистор R1 и светодиод Power, сигнализируют о включении модуля. Как и говорилось, модуль работает по шине I2C, для удобства эти шины были выведены на два разъема J1 и J2, назначение остальных контактов, можно посмотреть ниже.Назначение J1
► 32K: выход, частота 32 кГц
► SQW: выход
► SCL: линия тактирования (Serial CLock)
► SDA: линия данных (Serial Dфta)
► VCC: «+» питание модуля
► GND: «-» питание модуля Назначение J2
► SCL: линия тактирования (Serial CLock)
► SDA: линия данных (Serial Data)
► VCC: «+» питание модуля
► GND: «-» питание модуля

Немного расскажу, о микросхеме AT24C32N, это микросхема с 32к памятью (EEPROM) от производителя Atmel, собранная в корпусе SOIC8, работающая по двухпроводной шине I2C. Адрес микросхемы 0x57, при необходимости легко меняется, с помощью перемычек A0, A1 и A2 (это позволяет увеличить количество подключенных микросхем AT24C32/64). Так как чип AT24C32N имеет, три адресных входа (A0, A1 и A2), которые могут находится в двух состояния, либо лог «1» или лог «0», микросхеме доступны восемь адресов. от 0x50 до 0x57.

Подключение DS3231 к Arduino

Необходимые детали:
► Arduino UNO R3 x 1 шт.
► Часы реального времени на DS3231, RTC, SPI, AT24C32 x 1 шт.
► Провод DuPont, 2,54 мм, 20 см, F-M (Female — Male) x 1 шт.
► Кабель USB 2.0 A-B x 1 шт.

Подключение:
В данном примере буду использовать только модуль DS3231 и Arduino UNO R3, все данные будут передаваться в «Мониторинг порта». Схема не сложная, необходимо всего четыре провода, сначала подключаем шину I2C, SCL в A4 (Arduino UNO) и SDA в A5 (Arduino UNO), осталось подключить питание GND к GND и VCC к 5V (можно записать и от 3.3В), схема собрана, теперь надо подготовить программную часть.

Библиотеки работающий с DS3231 нет в среде разработке IDE Arduino, необходимо скачать «DS3231 » и добавить в среду разработки Arduino.

Установка времени DS3231
При первом включении необходимо запрограммировать время, откройте пример из библиотеки DS3231 «Файл» —> «Примеры» —> «DS3231» —> «Arduino» —> «DS3231_Serial_Easy», или скопируйте код снизу

Отличительные особенности DS3231

  • Точность ±2 ppm в диапазоне температур от 0°C до +40°C
  • Точность ±3.5 ppm в диапазоне температур от-40°C до +85°C
  • Вход для подключения автономного источника питания, позволяющего обеспечить непрерывную работу
  • Рабочий температурный диапазонкоммерческий: от 0°C до +70°C
  • индустриальный: -от 40°C до +85°C
  • Низкое потребление
  • Часы реального времени, отсчитывающие секунды, минуты, часы, дни недели, дни месяца, месяц и год с коррекцией високосного года вплоть до 2100
  • Два ежедневных будильника
  • Выход прямоугольного сигнала с программируемой частотой
  • Быстродействующие (400 кГц) I2C интерфейс
  • 3.3 В питание
  • Цифровой температурный датчик с точностью измерения ±3°C
  • Регистр, содержащий данные о необходимой подстройке
  • Вход/выход сброса nonRST

Шаг 3. Прошивка Arduino

После того как сборка и проверка схемы завершена, можно приступать к загрузке управляющей программы (или «прошивки») в память Arduino.

Интерфейс среды разработки Arduino IDE

Для этого нужно установить бесплатную официальную среду разработки — Arduino IDE [https://www.arduino.cc/en/Main/Software]. Также вам потребуется исходный код проекта, который вы можете скачать ниже в архиве со всеми библиотеками и скетчем, а если вам нужен просто скетч — его можно скопировать отдельно:

Теперь для завершения работы над устройством потребуется выполнить лишь ряд простых операций:

  1. подсоедините Arduino к USB-порту компьютера. Если модуль подключается впервые, то необходимо будет дождаться определения устройства операционной системой и установки драйвера;
  2. скопируйте содержимое папки libraries из архива в одноимённую папку в каталоге Arduino IDE;
  3. запустите средство разработки Arduino IDE;
  4. настройте тип Arduino в соответствии с имеющимся у вас модулем. Так, если вы используете Arduino Nano, в меню необходимо выбрать Tools -> Board: “Arduino Nano”. Также убедитесь в том, что модель процессора соответствует микроконтроллеру на вашей плате:
Читать еще:  USB электронная нагрузка своими руками

Выбор модели Arduino в среде Arduino IDE

  • откройте исходный код (файл clock_8x32.ino): File -> Open. Arduino IDE предложит вам автоматически создать отдельную директорию под проект — ответьте утвердительно;
  • загрузите программу в память Arduino: Sketch -> Upload.
  • Компиляция программного кода и дальнейшая загрузка в память микроконтроллера займёт некоторое время, обычно не более одной минуты. Об успешном завершении операции будет сообщено в консоли Arduino IDE. После чего остаётся лишь перезагрузить Arduino с помощью кнопки Reset на устройстве — простые часы на светодиодных матрицах готовы!

    Часы на DS3231-чипе своими руками


    Все сложно

    Полтора года назад я уже бегло рассматривал протокол I 2 C, теперь же настало время изучить его более подробно.

    Попробуем написать программную реализацию протокола, рассмотрим «подводные камни» такой реализации, а также способы отладки шины I 2 C. Для обкатки алгоритма попробуем подключить следующие устройства на шине I 2 C: RTC DS1307/DS3231 и EEPROM AT24C512/AT24C32.

    Для проектирования будет использована CAD Proteus_8.5. Для проверки на реальном железе будет использован чип MSP430G2453.

    Часы реального времени на микросхеме DS1307

    Итак, тренироваться будем на RTC DS1307, но здесь должен заметить, что данный чип относиться к 5-вольтовой логике поэтому с 3.3-вольтовым MSP430 он работать не будет. Заставить работать данную связку можно только в Proteus. Для тестирования на реальном железе я буду использовать DS3231 модуль. Однако для того чтобы понять I 2 C не нужен готовый модуль, он будет только мешать.

    Суть проблемы

    Когда не очень опытный радиолюбитель берет устройство на I 2 C, ему надо его как-то проверить, убедиться что оно хотя бы в принципе работает. Как это сделать? Обычно делается это на Arduino (я по крайней мере так делаю). Находится какой-нибудь скетч для проверки, и на нем проверяется.

    Однако, при наличии проблем, как узнать в чем кроется загвоздка: в «косячной» библиотеке или в железке? Например, если мы загрузим этот скетч для работы с DS1307, и запустим его БЕЗ всякого модуля, то получим такую картинку:

    Как видно, мы получили какие-то непонятные значения и если бы сбойная микросхема RTC была бы подключена, нам оставалось бы только гадать, где скрывается проблема: в коде или в железке.

    И здесь проблема здесь не в низком качестве кода скетча. Если посмотрим API References:

    то увидим, что при установлении связи нам ничего не возвращается, в то время как по спецификации протокола, если устройство приняло свой адрес и готово к работе, оно посылает ответ — ACK.

    Поэтому давайте отбросим Arduino в сторону и напишем свой код c шахматами и поэтессами с обработкой исключительных ситуаций.

    Но прежде, чем что-то написать, следует заглянуть в руководство по DS1307:

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

    Первые два подтягивающих резистора Rpu формируют шину I 2 C. Если посмотреть на схему китайского модуля(взято отсюда):

    То здесь используются резисторы номиналом на 3.3K, но я встречал схемы где резисторы были и на 10K.

    У меня на паечной макетке это получилось как-то так:

    Если у вас получится лучше, запишите это себе в плюсы. Здесь слева — это чип EEPROM(о нем позже). Моя наверное главная ошибка — резонатор следовало повернуть на 90 градусов, сэкономилось бы место на плате.

    Теперь в Proteus соберем следующую схему:

    Здесь кроме чипа DS1307, часового кварца и гальванической батареи, также понадобится источник постоянного напряжения на 3.3 Вольт, и I 2 C отладчик.

    Для освежения памяти, я скопировал из своего предыдущего поста диаграмму протокола I 2 C и его основные положения:


    Waveform showing the clock and data timing for an I 2 C message.

      Основные моменты:
    1. Есть две линии: SCL служит для тактирования, SDA служит для передачи данных.
    2. Скважность импульсов не играет роли. Один такт может длиться 5мкс, другой 5мс.
    3. Высокий уровень формируется pull-up режимом, низкий — земля.
    4. Данные передаются сессиями.
    5. Каждая отдельная сессия работает только на прием или только на передачу.
    6. В начале и в конце сессии соответственно формируются сигналы START и STOP. Между этими сигналами линия считается занятой.
    7. Только при START и STOP, SDA линия меняет уровень при высоком уровне SCL.
    8. START формируется последовательностью: a) падением SDA при высоком уровне SCL, б) падением SCL.
    9. STOP формируется последовательностью: a) поднятием SCL при низком SDA, б) поднятием SDA при высоком SCL.
    10. При передаче данных уровень SDA меняется только при низком SCL.
    11. При чтении данных, SDA уровень считывается только при высоком SCL.
    12. После формирования START, передается адрес устройства, с которым хотят связаться. Младший бит адреса указывает режим сессии.
    13. Младший бит равный нулю в адресе устройства означает, что сессия будет направлена на запись, т.е. передачу в адресуемое устройство.
    14. Младший бит равный единице в адресе устройства означает, что сессия будет направлена на чтение, т.е. будет происходить чтение с адресуемого устройства.
    15. Байты передаются побитно, начиная от старшего разряда к младшему.
    16. После передачи каждого байта, принимающая сторона должна формировать ответ, означающий, что передача прошла успешно: ACK.
    17. При чтении с устройства, не сформировав ответ, мы дадим понять устройству, что прием закончен, и мы получили все, что нужно. Это называется NACK.

    Итак, работа с I 2 C идет сессиями. В руководстве представлены варианты допустимых сессий для записи и чтения:

    Есть три варианта сессий: для записи, для чтения, и для чтения с определенного адреса.

    Карта регистров DS1307:

    Т.е. имеем 7 часовых регистра, 1 регистр конфигурации SQW и 56 байт ОЗУ где можно хранить свои данные.

    Опрос I 2 C устройства

    Самая простая успешная сессия для I 2 C шины, это передача адреса в режиме записи, с последующим завершением сессии. Т.е. это такой опрос, есть ли такое устройство на линии/на связи.

    Взяв за основу программы программного UART-передатчика из предыдущего поста и программной реализации I 2 C для AVR из поста за 2015 год, (в основу которой в свою очередь лег код из Procyon avrLib,) я сочинил такой код:

    Результат работы программы:

    В I 2 C отладчике символ S — означает Start, начало сесси, P — stoP, завершение сессии, и D0 — это передаваемый программой адрес. A — означает, что от устройства был получен ACK, ответ т.е.

    Если константу DS1307_ADR заменить на другое четное значение, то через UART терминал будет выдавать сообщение, что устройство не найдено. Если передать нечтный адрес, т.е. адрес с режимом чтения, то программа войдет а ERROR-loop, т.к. чип DS1307 будет ожидать NACK для завершения режима чтения.

    Для реального чипа программа немного отличается:

    Здесь также используется программные UART и I 2 C протоколы, но UART работает на скорости 9600bit/s, а вместо DS1307 используется DS3231(он совместим с DS1307, а также может работать c 3.3-вольтовой логикой).

    Выглядит вся конструкция на макетках как-то так:

    В данном случае подключать подтягиваюшие резисторы для I 2 C шины не нужно, они уже есть в модуле. Ну и конечно, там еще дурацкая схема зарядки аккумулятора, которая батарею просто убъет.

    Здесь я на какое-то время отключал питание от I 2 C модуля. Как видно, обработка исключительных ситуаций работает.

    Между прочим, как оказалось, писать прошивки для реального железа очень удобно в Sublime_text_3:

    Отладка I 2 C шины

    Когда я писал программу, для меня более всего непонятно было, как следует обратывать ответ ACK. В смысле, на какой стадии чип прижимает линию, стоит ли прижимать ее самому для формирования stop-бита, и нужно ли пропускать такт чтобы дать чипу ответить, т.е. послать ACK.

    В Proteus мы можем запустить отладчик, и в пошаговом выполнении наблюдать как все происходит:

    Здесь на 10-м выводе назначена SDA. Когда передается единица, линия принимает высокий уровень(красный квадратик). Когда же передается ноль, то линия прижимается к земле(синий квадратик).

    На видео получение ACK происходит на 2:38, когда линия «отпускается», но на выводе продолжает оставаться низкий уровень, т.е. чип DS1307 удерживает шину.

    Программа для работы с RTC DS1307

    Теперь, когда разобрались с самым сложным моментом протокола I 2 C, написать программу для обмена данными с DS1307 — дело техники.

    Вариант для Proteus c DS1307 у меня получился таким:

    Здесь, для избежании преобразований форматов из BCD в DEC и обратно, установка даты происходит через инициализацию init[] массива УЖЕ в BCD-формате. А через функцию void send_bcd(uint8_t bcd) печатается число в BCD формате.

    Собственно, программа сначала устанавливает значения первых семи «часовых» регистров, а затем в цикле через равные интервалы считывает их актуальные значения. Результат работы программы:

    Программа для работы с RTC DS3231

    Теперь вариант с DS3231 для «живого» MSP430G2453.

    DS3231 совместим с DS1307, но при этом имеет несколько ключевых отличий:

    1. Чип имеет встроенный резонатор;
    2. Как питание, так и батарея могут иметь напряжение от 2.3V до 5.5V;
    3. Может работать на частоте 400kHz (fast I 2 C).

    Если посмотреть на схему включения RTC, то увидим несколько новых фич:

    1. исчез кварц;
    2. появилась возможность сбросить чип через RESET
    3. наряду со знакомым уже SQW, появился высокочастотный вывод 32kHz

    В DS3231 нет ячеек памяти, только регистры.

    Как видно, кроме самих часов появилось два будильника. По ним можно выводить микроконтроллер из спящего режима.

    Если в RTC, нужны ячейки ОЗУ, то можно взять DS3232, там имеется 235 свободных байт. Но это сейчас нас не будет интересовать, как и фичи в виде будильников. Только часы.

    Программа для установки и чтения значений часов DS3231 для реального чипа MSP430x2xx:

    Хочу обратить внимание на существенно уменьшенные значения задержек QDEL и HDEL. This is Fast I 2 C.

    Работа в Proteus c EEPROM AT24C512


    Запись каждого байта в память EEPROM может занимать до 10ms

    Самая скромная флешка с I 2 C интерфейсом которая была в библиотеке Proteus, это AT24C512 т.е. на 64Кбайт. Данная серия чипов фирмы ATMEL изготавливается в вариантах с напряжением питания: 2.7V-5.5V и 1.8V-3.6V. Тип питания отображается в суффиксе микросхемы.

    На I 2 C шину может быть установлено до четырех чипов включительно, объединяемых в единый банк.

    Если посмотреть на руководство к микросхеме, то кроме знакомых выводов SDA и SCL, можно увидеть WP — защита от записи, A0/A1 — номер в банке.

    Номер в банке выбирается через адрес I 2 C устройства:

    Адресация в EEPROM двухбайтная. Сначала передается старший байт адреса, затем младший.

    Имеется два режима записи в EEPOROM: запись байта с произвольным адресом, и запись «страницами» т.е. последовательностями до 128 байт включительно. Если, например, нужно записать подряд 200 байт по адресу А, то их можно записать двумя сессиями I 2 C: сначала первые 128 байт, затем оставшиеся 72.

    При чтении ограничние на длину поледовательности нет. Здесь все также как в DS1307 за исключением того, что адрес двухбайтный:

    Существенным ограничением EEPROM является длительное время записи, до 10ms на байт.

    В Proteus добавим на схему чип AT24C512:

    На мой взгляд самой востребованной функцией работы с eeprom является чтение запись и чтение массивов. Мы не можем записывать за раз блоками более 128 байт, т.е. для более длиных массивов запись надо бить по примеру того как это делается c буферами в С/С++:

    Я реализовал функции записи буфера размером до 128 байт и его чтения. Для проверки алгоритма, я решил организовать цикл, который последовательно будет записывать массив со случайными данными на флешку, затем считывать его и проверять контрольную сумму. Контрольная сумма записывается в последний байт массива и рассчитывается через XOR функцию.

    Из-за нежелания подключать математическую библиотеку, я вставил собственную функцию генерации случайных чисел в надежде, что она будет не таким громоздким как функция rand(). Алгоритм основан на методе середины квадратов, его реализация была подсмотрена здесь, посмотреть на его работу можно здесь.

    Результат работы программы:

    Здесь красным подчеркнуты сессии на запись и на чтение одного и того же массива.

    Читать еще:  Простой разметочный рейсмус своими руками

    В терминал UART’а валится довольно много отладочной информации, которую конечно же можно безболезненно удалить, сократив код.

    EEPROM AT24C32

    Данная EEPROM имеет размер страницы для записи — 32 байта. В остальном она идентична AT24C512, кроме размера памяти, конечно. Причем I 2 C адрес флешки которую сам впаивал осталась та же — 0xA0, а адрес флешки с DS3231 модуля оказался 0xA4. Причем перемычки ответственные за указание банка, были не тронуты.

    Часы, будильник, таймер на Arduino. v1.0

    Спецификация набора

    То, что у вас уже есть, вы можете удалить в корзине.

    НаименованиеЦенаКол-во
    CR1225, Элемент питания литиевый (1шт) 3В63 руб.1
    Troyka-Temperature Humidity Sensor DHT11, Цифровой датчик температуры и влажности380 руб.1
    0.96inch OLED (A), OLED дисплей с разрешением 128х64px, интерфейсы SPI/I2C, изогнутый контакный разъем1 030 руб.1
    Troyka-3D Joystick, 3D-джойстик для Arduino проектов570 руб.1
    Troyka-Buzzer, Пьезодинамик 4кГц 80дБ для Arduino проектов240 руб.1
    Troyka-Relay, Релейный модуль на основе RTD14005 16А/250В (7А/30В) для Arduino проектов640 руб.1
    Troyka-RTC, Часы реального времени на оcнове DS1307 для Arduino проектов570 руб.1
    Iskra Mini (без разъемов), Программируемый контроллер на базе ATmega328 (аналог Arduino Mini)640 руб.1

    Описание

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

    В качестве железа будем использовать Амперкины тройки, искру и дюймовый OLED дисплей.

    Дисплей


    0.96inch OLED (A) — это встраиваемый двухцветный (желтый/синий) OLED дисплей с интерфейсом I2C/SPI. Разрешение экрана 128х64 пикселей, а угол обзора более 160 градусов.
    Размеры платы 29мм х 33 мм.

    Контроллер


    Iskra Mini — полноценная Arduino-платформа, только маленькая: всего 33×20 мм.

    Обратите внимание, что на плате нет собственного USB-порта.
    Поэтому для её прошивки понадобится посредник!
    Им может быть другой контроллер Arduino

    Характеристики Iskra Mini

    • Микроконтроллер: ATmega328
    • Тактовая частота: 16 МГц
    • Флеш-память: 32 КБ (2 КБ используются загрузчиком)
    • Оперативная память SRAM: 2 КБ
    • Энергонезависимая память EEPROM: 1 КБ
    • Рабочее напряжение: 5 В
    • Входное напряжение: 5,3–12 В
    • Портов ввода-вывода общего назначения: 20
    • Портов с поддержкой ШИМ: 6
    • Портов, подключённых к АЦП: 8 (4 из них на нераспаянных выводах)
    • Разрядность АЦП: 10 бит
    • Аппаратные интерфейсы: UART, SPI, I²C (на нераспаянных выводах)
    • Максимальный ток одного вывода: 40 мА
    • Максимальный ток с пина +5V: 150 мА

    Цифровой датчик температуры и влажности


    Troyka-Temperature Humidity Sensor DHT11.
    Данные температуры и влажности датчик отдаёт по одному проводу в виде цифрового сигнала. Это позволяет передавать данные на расстояние до нескольких десятков метров.
    В сердце модуля — популярная среди любителей сенсорная сборка DHT11. Он работает по собственному протоколу. На борту модуля — популярная среди любителей сенсорная сборка DHT11.

    • Напряжение питания: 3–5 В
    • Потребляемый ток при запросе данных: 2,5 мА
    • Потребляемый ток в ожидании: 100 мкА
    • Диапазон температур: 0–50 °С
    • Погрешность температуры: ±2 °С
    • Диапазон влажности: 20–90%
    • Погрешность влажности: ±5%
    • Габариты: 25×25 мм

    3D-джойстик


    3D Joystick — сделает управление нашим устройством быстрым и удобным.
    Модуль-джойстик схож с «грибочком» на манипуляторах PlayStation и XBox. Он комбинирует в себе двухосный джойстик и тактовую кнопку. В нейтральном положении аналоговый сигнал соответствует половине напряжения питания. При перемещении джойстика в одну сторону напряжение будет нарастать, а при движении джойстика в другую сторону — падать. Таким образом, можно получать точное положение ручки джойстика и реагировать на угол наклона, а не только на сам факт наклона ручки. Хотя в этом проекте мы используем только факт наклона.

    • Напряжение питания: 3–5 В
    • Интерфейс по осям X, Y: аналоговый, линейный
    • Интерфейс кнопки: цифровой, бинарный
    • Габариты: 25×25 мм

    Управление джойстиком

    Нажатие влево — вход в меню настроек
    изменяемое значение подсвечивается
    нажатие вверх — изменение значения
    нажатие вправо — переход к следующему значению
    при настройки будильника слева появляется значок «а»
    нажатие влево — выход из меню с сохранением изменений
    время будильника сохраняется в энергонезависимой памяти

    Нажатие вниз — вкл/откл будильника

    Когда сработал будильник
    первое нажатие на кнопку — отключение пищалки
    второе нажатие на кнопку — отключение реле

    Пьезодинамик


    В нашем проекте нужно пищать. Воспользуемся модулем Buzzer.

    • Номинальная частота: 4 кГц
    • Интенсивность: 80 дБ
    • Номинальное рабочее напряжение: 5 В
    • Габариты: 25,4×25,4 мм

    Релейный модуль


    Модуль Relay это просто механический рубильник, которым можно управлять при помощи микроконтроллера, такого как Arduino. С помощью реле можно включать и выключать электроприборы, которые подключены к бытовой электросети 220 В. На модуле расположен светодиод, который всегда подскажет — замкнуто реле или нет.
    У этого реле есть есть не только нормально разомкнутый (NO) контакт, но и нормально замкнутый (NC). Это удобно.

    • Номинальное напряжение питания: 5 В
    • Номинальное напряжение сигнала: 3–5 В
    • Максимальный ток коммутации: 16 А
    • Коммутируемое переменное напряжение (пиковое): 250 В
    • Потребляемый ток: 87 мА
    • Рабочая температура: −40…+85 °C
    • Магнитная система катушки: моностабильная
    • Рекомендованная частота переключения: до 1 Гц
    • Электрическая износостойкость (NO) контакта: 30×10³ переключений
    • Электрическая износостойкость (NC) контакта: 10×10³ переключений
    • Габариты: 50,8×25,4 мм

    Часы реального времени


    Модуль RTC — сделан на основе популярного чипа DS1307. Он общается с управляющей электроникой по протоколу I²C / TWI.
    Слот предназначен для часовой батарейки размера CR1225 на 3В. Без неё модуль не работает даже с внешним питанием.

    • Напряжение внешнего питания: 4,5–5,5 В
    • Напряжение питания батарейки: 2–3,5 В
    • Потребляемый ток: 500 нА (≈6 месяцев на батарейке)
    • Выходной интерфейс: I²C
    • Габариты: 25,4×25,4 мм

    Элемент питания

    CR1225 – литиевая батарейка

    • Напряжение: 3В
    • Типоразмер cr1225

    Обзор часов реального времени DS3231 (RTC)

    Автор: Сергей · Опубликовано 16.01.2017 · Обновлено 13.04.2020

    Модуль DS3231 (RTC, ZS-042) — представляет собой недорогую плату с чрезвычайно точными часами реального времени (RTC), с температурной компенсацией кварцевого генератора и кристалла. Модуль включает в себя литиевую батарею, которая поддерживает бесперебойную работу, даже при отключении источник питания. Интегрированный генератор улучшить точность устройства и позволил уменьшить количество компонентов.

    Технические параметры

    ► Напряжение питания: 3.3В и 5В
    ► Чип памяти: AT24C32 (32 Кб)
    ► Точность: ± 0.432 сек в день
    ► Частота кварца:32.768 кГц
    ► Поддерживаемый протокол: I2C
    ► Габариты: 38мм x 22мм x 15мм

    Общие сведения

    Большинство микросхем, таких как DS1307 используют внешний кварцевый генератор частотой 32кГц, но в них есть существенный недостаток, при изменении температуры меняется частота кварца, что приводит к погрешности в подсчете времени. Эта проблема устранена в чипе DS3231, внутрь которого установили кварцевый генератор и датчик температуры, который компенсирует изменения температуры, так что время остается точным (при необходимости, данные температуры можно считать). Так же чип DS3231 поддерживает секунды, минуты, часы, день недели, дата, месяц и год информацию, а так же следит за количеством дней в месяце и делает поправку на високосный год. Поддерживает работу часов в двух форматов 24 и 12, а так-же возможно запрограммировать два будильника. Модуль работает по двух проводной шине I2C.

    Теперь немного о самом модуле, построен он на микросхеме DS3231N. Резисторная сборка RP1 (4.7 кОм), необходима для подтяжки линий 32K, SQW, SCL и SDA (кстати, если используется несколько модулей с шиной I2C, необходимо выпаять подтягивающие резисторы на других модулях). Вторая сборка резисторов, необходима для подтяжки линий A0, A1 и A2, необходимы они для смены адресации микросхемы памяти AT24C32N. Резистор R5 и диод D1, служат для подзарядки батарее, в принципе их можно выпаять, так как обычной батарейки SR2032 хватает на годы. Так же установлена микросхема памяти AT24C32N, это как бы бонус, для работы часов RTC DS3231N в ней нет необходимости. Резистор R1 и светодиод Power, сигнализируют о включении модуля. Как и говорилось, модуль работает по шине I2C, для удобства эти шины были выведены на два разъема J1 и J2, назначение остальных контактов, можно посмотреть ниже.Назначение J1
    ► 32K: выход, частота 32 кГц
    ► SQW: выход
    ► SCL: линия тактирования (Serial CLock)
    ► SDA: линия данных (Serial Dфta)
    ► VCC: «+» питание модуля
    ► GND: «-» питание модуля Назначение J2
    ► SCL: линия тактирования (Serial CLock)
    ► SDA: линия данных (Serial Data)
    ► VCC: «+» питание модуля
    ► GND: «-» питание модуля

    Немного расскажу, о микросхеме AT24C32N, это микросхема с 32к памятью (EEPROM) от производителя Atmel, собранная в корпусе SOIC8, работающая по двухпроводной шине I2C. Адрес микросхемы 0x57, при необходимости легко меняется, с помощью перемычек A0, A1 и A2 (это позволяет увеличить количество подключенных микросхем AT24C32/64). Так как чип AT24C32N имеет, три адресных входа (A0, A1 и A2), которые могут находится в двух состояния, либо лог «1» или лог «0», микросхеме доступны восемь адресов. от 0x50 до 0x57.

    Подключение DS3231 к Arduino

    Необходимые детали:
    ► Arduino UNO R3 x 1 шт.
    ► Часы реального времени на DS3231, RTC, SPI, AT24C32 x 1 шт.
    ► Провод DuPont, 2,54 мм, 20 см, F-M (Female — Male) x 1 шт.
    ► Кабель USB 2.0 A-B x 1 шт.

    Подключение:
    В данном примере буду использовать только модуль DS3231 и Arduino UNO R3, все данные будут передаваться в «Мониторинг порта». Схема не сложная, необходимо всего четыре провода, сначала подключаем шину I2C, SCL в A4 (Arduino UNO) и SDA в A5 (Arduino UNO), осталось подключить питание GND к GND и VCC к 5V (можно записать и от 3.3В), схема собрана, теперь надо подготовить программную часть.

    Библиотеки работающий с DS3231 нет в среде разработке IDE Arduino, необходимо скачать «DS3231 » и добавить в среду разработки Arduino.

    Установка времени DS3231
    При первом включении необходимо запрограммировать время, откройте пример из библиотеки DS3231 «Файл» —> «Примеры» —> «DS3231» —> «Arduino» —> «DS3231_Serial_Easy», или скопируйте код снизу

    Режимы электропитания

    Напряжение питания микросхемы может находиться в пределах 2.3…5.5В, имеются две линии питания, для внешнего источника (линия Vcc), а также для батареи (Vbat). Напряжение внешнего источника постоянно отслеживается, при падении ниже порога Vpf=2,5В, происходит переключение на линию батареи. В следующей таблице представлены условия переключения между линиями питания:

    Комбинации уровней напряженияАктивная линия питания
    Vcc VbatVcc
    Vcc > Vpf, Vcc Vpf, Vcc > VbatVcc

    Точность хода часов поддерживается за счет отслеживания температуры окружающей среды. В микросхеме запускается внутренняя процедура корректировки частоты тактового генератора, величина корректировки определяется по специальному графику зависимости частоты от температуры. Процедура запускается после подачи питания, а затем выполняется каждые 64 секунды.

    В целях сохранения заряда, при подключении батареи (подача напряжения на линию Vbat), тактовый генератор не запускается до тех пор, пока напряжение на линии Vcc не превысит пороговое значение Vpf, или не будет передан корректный адрес микросхемы по интерфейсу I2C. Время запуска тактового генератора составляет менее одной секунды. Примерно через 2 секунды после подачи питания (Vcc), или получения адреса по интерфейсу I2C, запускается процедура коррекции частоты. После того как тактовый генератор запустился, он продолжает функционировать до тех пор, пока присутствует напряжение Vcc или Vbat. При первом включении регистры даты и времени сброшены, и имеют следующие значения 01/01/ 00 — 01 — 00/00/00 (день/месяц/год/ — день недели — час/минуты/секунды).

    Ток потребления при питании от батареи напряжением 3.63В, составляет 3 мкА, при отсутствии передачи данных по интерфейсу I2C. Максимальный ток потребления может достигать 300 мкА, в случае использования внешнего источника питания напряжением 5.5В, и высокой скорости передачи данных I2C.

    Шаг 2. Сборка электронной схемы

    Схема электронных часов с индикацией на светодиодах с применением Arduino даже для неопытных радиолюбителей покажется довольно простой. Для сборки требуется всего несколько проводников. Таблица подключений:

    Модуль Arduino → светодиодная матрица 32×8 MAX7219

    Модуль Arduino → часы реального времени Adafruit DS3231

    Модуль Arduino → кнопки

    Второй вывод кнопок соединяется с землёй GND.

    Следует лишь обратить внимание и запомнить, каким образом замкнуты между собой контактные отверстия на макетной плате. Следующая схема иллюстрирует способ внутреннего соединения контактных отверстий:

    Два ряда (1 и 4) с обеих сторон замкнуты горизонтально — обычно они используются как линия питания +5V и земля GND. Все внутренние контакты (2 и 3) замкнуты вертикально. При этом монтажная плата как вертикально, так и горизонтально разделена на две независимые друг от друга симметричные части. Это позволяет, например, собрать два разных устройства на одной плате.

    Читать еще:  Простой вакуумный станок своими руками

    Схема электронных часов с индикацией на светодиодах, а также расположение элементов на монтажной плате представлена на иллюстрации:

    Тщательно проверьте соответствие всех соединений указанной схеме. Также убедитесь в том, что проводники хорошо закреплены в контактных отверстиях монтажной платы.

    Внешний вид собранного устройства

    Часы на DS3231-чипе своими руками


    Все сложно

    Полтора года назад я уже бегло рассматривал протокол I 2 C, теперь же настало время изучить его более подробно.

    Попробуем написать программную реализацию протокола, рассмотрим «подводные камни» такой реализации, а также способы отладки шины I 2 C. Для обкатки алгоритма попробуем подключить следующие устройства на шине I 2 C: RTC DS1307/DS3231 и EEPROM AT24C512/AT24C32.

    Для проектирования будет использована CAD Proteus_8.5. Для проверки на реальном железе будет использован чип MSP430G2453.

    Часы реального времени на микросхеме DS1307

    Итак, тренироваться будем на RTC DS1307, но здесь должен заметить, что данный чип относиться к 5-вольтовой логике поэтому с 3.3-вольтовым MSP430 он работать не будет. Заставить работать данную связку можно только в Proteus. Для тестирования на реальном железе я буду использовать DS3231 модуль. Однако для того чтобы понять I 2 C не нужен готовый модуль, он будет только мешать.

    Суть проблемы

    Когда не очень опытный радиолюбитель берет устройство на I 2 C, ему надо его как-то проверить, убедиться что оно хотя бы в принципе работает. Как это сделать? Обычно делается это на Arduino (я по крайней мере так делаю). Находится какой-нибудь скетч для проверки, и на нем проверяется.

    Однако, при наличии проблем, как узнать в чем кроется загвоздка: в «косячной» библиотеке или в железке? Например, если мы загрузим этот скетч для работы с DS1307, и запустим его БЕЗ всякого модуля, то получим такую картинку:

    Как видно, мы получили какие-то непонятные значения и если бы сбойная микросхема RTC была бы подключена, нам оставалось бы только гадать, где скрывается проблема: в коде или в железке.

    И здесь проблема здесь не в низком качестве кода скетча. Если посмотрим API References:

    то увидим, что при установлении связи нам ничего не возвращается, в то время как по спецификации протокола, если устройство приняло свой адрес и готово к работе, оно посылает ответ — ACK.

    Поэтому давайте отбросим Arduino в сторону и напишем свой код c шахматами и поэтессами с обработкой исключительных ситуаций.

    Но прежде, чем что-то написать, следует заглянуть в руководство по DS1307:

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

    Первые два подтягивающих резистора Rpu формируют шину I 2 C. Если посмотреть на схему китайского модуля(взято отсюда):

    То здесь используются резисторы номиналом на 3.3K, но я встречал схемы где резисторы были и на 10K.

    У меня на паечной макетке это получилось как-то так:

    Если у вас получится лучше, запишите это себе в плюсы. Здесь слева — это чип EEPROM(о нем позже). Моя наверное главная ошибка — резонатор следовало повернуть на 90 градусов, сэкономилось бы место на плате.

    Теперь в Proteus соберем следующую схему:

    Здесь кроме чипа DS1307, часового кварца и гальванической батареи, также понадобится источник постоянного напряжения на 3.3 Вольт, и I 2 C отладчик.

    Для освежения памяти, я скопировал из своего предыдущего поста диаграмму протокола I 2 C и его основные положения:


    Waveform showing the clock and data timing for an I 2 C message.

      Основные моменты:
    1. Есть две линии: SCL служит для тактирования, SDA служит для передачи данных.
    2. Скважность импульсов не играет роли. Один такт может длиться 5мкс, другой 5мс.
    3. Высокий уровень формируется pull-up режимом, низкий — земля.
    4. Данные передаются сессиями.
    5. Каждая отдельная сессия работает только на прием или только на передачу.
    6. В начале и в конце сессии соответственно формируются сигналы START и STOP. Между этими сигналами линия считается занятой.
    7. Только при START и STOP, SDA линия меняет уровень при высоком уровне SCL.
    8. START формируется последовательностью: a) падением SDA при высоком уровне SCL, б) падением SCL.
    9. STOP формируется последовательностью: a) поднятием SCL при низком SDA, б) поднятием SDA при высоком SCL.
    10. При передаче данных уровень SDA меняется только при низком SCL.
    11. При чтении данных, SDA уровень считывается только при высоком SCL.
    12. После формирования START, передается адрес устройства, с которым хотят связаться. Младший бит адреса указывает режим сессии.
    13. Младший бит равный нулю в адресе устройства означает, что сессия будет направлена на запись, т.е. передачу в адресуемое устройство.
    14. Младший бит равный единице в адресе устройства означает, что сессия будет направлена на чтение, т.е. будет происходить чтение с адресуемого устройства.
    15. Байты передаются побитно, начиная от старшего разряда к младшему.
    16. После передачи каждого байта, принимающая сторона должна формировать ответ, означающий, что передача прошла успешно: ACK.
    17. При чтении с устройства, не сформировав ответ, мы дадим понять устройству, что прием закончен, и мы получили все, что нужно. Это называется NACK.

    Итак, работа с I 2 C идет сессиями. В руководстве представлены варианты допустимых сессий для записи и чтения:

    Есть три варианта сессий: для записи, для чтения, и для чтения с определенного адреса.

    Карта регистров DS1307:

    Т.е. имеем 7 часовых регистра, 1 регистр конфигурации SQW и 56 байт ОЗУ где можно хранить свои данные.

    Опрос I 2 C устройства

    Самая простая успешная сессия для I 2 C шины, это передача адреса в режиме записи, с последующим завершением сессии. Т.е. это такой опрос, есть ли такое устройство на линии/на связи.

    Взяв за основу программы программного UART-передатчика из предыдущего поста и программной реализации I 2 C для AVR из поста за 2015 год, (в основу которой в свою очередь лег код из Procyon avrLib,) я сочинил такой код:

    Результат работы программы:

    В I 2 C отладчике символ S — означает Start, начало сесси, P — stoP, завершение сессии, и D0 — это передаваемый программой адрес. A — означает, что от устройства был получен ACK, ответ т.е.

    Если константу DS1307_ADR заменить на другое четное значение, то через UART терминал будет выдавать сообщение, что устройство не найдено. Если передать нечтный адрес, т.е. адрес с режимом чтения, то программа войдет а ERROR-loop, т.к. чип DS1307 будет ожидать NACK для завершения режима чтения.

    Для реального чипа программа немного отличается:

    Здесь также используется программные UART и I 2 C протоколы, но UART работает на скорости 9600bit/s, а вместо DS1307 используется DS3231(он совместим с DS1307, а также может работать c 3.3-вольтовой логикой).

    Выглядит вся конструкция на макетках как-то так:

    В данном случае подключать подтягиваюшие резисторы для I 2 C шины не нужно, они уже есть в модуле. Ну и конечно, там еще дурацкая схема зарядки аккумулятора, которая батарею просто убъет.

    Здесь я на какое-то время отключал питание от I 2 C модуля. Как видно, обработка исключительных ситуаций работает.

    Между прочим, как оказалось, писать прошивки для реального железа очень удобно в Sublime_text_3:

    Отладка I 2 C шины

    Когда я писал программу, для меня более всего непонятно было, как следует обратывать ответ ACK. В смысле, на какой стадии чип прижимает линию, стоит ли прижимать ее самому для формирования stop-бита, и нужно ли пропускать такт чтобы дать чипу ответить, т.е. послать ACK.

    В Proteus мы можем запустить отладчик, и в пошаговом выполнении наблюдать как все происходит:

    Здесь на 10-м выводе назначена SDA. Когда передается единица, линия принимает высокий уровень(красный квадратик). Когда же передается ноль, то линия прижимается к земле(синий квадратик).

    На видео получение ACK происходит на 2:38, когда линия «отпускается», но на выводе продолжает оставаться низкий уровень, т.е. чип DS1307 удерживает шину.

    Программа для работы с RTC DS1307

    Теперь, когда разобрались с самым сложным моментом протокола I 2 C, написать программу для обмена данными с DS1307 — дело техники.

    Вариант для Proteus c DS1307 у меня получился таким:

    Здесь, для избежании преобразований форматов из BCD в DEC и обратно, установка даты происходит через инициализацию init[] массива УЖЕ в BCD-формате. А через функцию void send_bcd(uint8_t bcd) печатается число в BCD формате.

    Собственно, программа сначала устанавливает значения первых семи «часовых» регистров, а затем в цикле через равные интервалы считывает их актуальные значения. Результат работы программы:

    Программа для работы с RTC DS3231

    Теперь вариант с DS3231 для «живого» MSP430G2453.

    DS3231 совместим с DS1307, но при этом имеет несколько ключевых отличий:

    1. Чип имеет встроенный резонатор;
    2. Как питание, так и батарея могут иметь напряжение от 2.3V до 5.5V;
    3. Может работать на частоте 400kHz (fast I 2 C).

    Если посмотреть на схему включения RTC, то увидим несколько новых фич:

    1. исчез кварц;
    2. появилась возможность сбросить чип через RESET
    3. наряду со знакомым уже SQW, появился высокочастотный вывод 32kHz

    В DS3231 нет ячеек памяти, только регистры.

    Как видно, кроме самих часов появилось два будильника. По ним можно выводить микроконтроллер из спящего режима.

    Если в RTC, нужны ячейки ОЗУ, то можно взять DS3232, там имеется 235 свободных байт. Но это сейчас нас не будет интересовать, как и фичи в виде будильников. Только часы.

    Программа для установки и чтения значений часов DS3231 для реального чипа MSP430x2xx:

    Хочу обратить внимание на существенно уменьшенные значения задержек QDEL и HDEL. This is Fast I 2 C.

    Работа в Proteus c EEPROM AT24C512


    Запись каждого байта в память EEPROM может занимать до 10ms

    Самая скромная флешка с I 2 C интерфейсом которая была в библиотеке Proteus, это AT24C512 т.е. на 64Кбайт. Данная серия чипов фирмы ATMEL изготавливается в вариантах с напряжением питания: 2.7V-5.5V и 1.8V-3.6V. Тип питания отображается в суффиксе микросхемы.

    На I 2 C шину может быть установлено до четырех чипов включительно, объединяемых в единый банк.

    Если посмотреть на руководство к микросхеме, то кроме знакомых выводов SDA и SCL, можно увидеть WP — защита от записи, A0/A1 — номер в банке.

    Номер в банке выбирается через адрес I 2 C устройства:

    Адресация в EEPROM двухбайтная. Сначала передается старший байт адреса, затем младший.

    Имеется два режима записи в EEPOROM: запись байта с произвольным адресом, и запись «страницами» т.е. последовательностями до 128 байт включительно. Если, например, нужно записать подряд 200 байт по адресу А, то их можно записать двумя сессиями I 2 C: сначала первые 128 байт, затем оставшиеся 72.

    При чтении ограничние на длину поледовательности нет. Здесь все также как в DS1307 за исключением того, что адрес двухбайтный:

    Существенным ограничением EEPROM является длительное время записи, до 10ms на байт.

    В Proteus добавим на схему чип AT24C512:

    На мой взгляд самой востребованной функцией работы с eeprom является чтение запись и чтение массивов. Мы не можем записывать за раз блоками более 128 байт, т.е. для более длиных массивов запись надо бить по примеру того как это делается c буферами в С/С++:

    Я реализовал функции записи буфера размером до 128 байт и его чтения. Для проверки алгоритма, я решил организовать цикл, который последовательно будет записывать массив со случайными данными на флешку, затем считывать его и проверять контрольную сумму. Контрольная сумма записывается в последний байт массива и рассчитывается через XOR функцию.

    Из-за нежелания подключать математическую библиотеку, я вставил собственную функцию генерации случайных чисел в надежде, что она будет не таким громоздким как функция rand(). Алгоритм основан на методе середины квадратов, его реализация была подсмотрена здесь, посмотреть на его работу можно здесь.

    Результат работы программы:

    Здесь красным подчеркнуты сессии на запись и на чтение одного и того же массива.

    В терминал UART’а валится довольно много отладочной информации, которую конечно же можно безболезненно удалить, сократив код.

    EEPROM AT24C32

    Данная EEPROM имеет размер страницы для записи — 32 байта. В остальном она идентична AT24C512, кроме размера памяти, конечно. Причем I 2 C адрес флешки которую сам впаивал осталась та же — 0xA0, а адрес флешки с DS3231 модуля оказался 0xA4. Причем перемычки ответственные за указание банка, были не тронуты.

    Ссылка на основную публикацию
    Статьи c упоминанием слов:
    Adblock
    detector