Work with zs-042 (DS3231) at avr-gcc
Проверено для arduino pro mini - atmega328p
Вся работа вынесена в обработчики прерываний. Для приема сигналов будильника используется прерывание INT0 по спаду уровня(32-я нога процессора, 2-й выход arduino pro mini).
Собираем командой make при помощи avr-gcc.
В Arduino pro mini можно загрузить командой
make pro_mini
Подключаемся к USART на скорости 38400 формат 8N1 При запуске устройство сообщает - start и мигает светодиодом с частотой ~0.5 Hz (17 ножка процессора).
Шеснадцатиричные команды отправляются на USART порт. Пример команд:
Установка времени:
xD00001171301301115 - Установить время дату:
x - префикс шеснадцатиричной команды;
D0 - номер I2C устройства для записи данных;
00 - адрес ячейки памяти с который будем писать;
01 - секунды;
17 - минуты;
13 - часы;
01 - день недели (понедельник);
30 - число;
11 - месяц (ноябрь);
15 - год
Будет установлена дата: 30 ноября 15-го года 13:17:01
Получение температуры чипа: Запрашиваем 0x11 регистр данных: xD011 x - префикс шеснадцатиричной команды; D0 - номер I2C устройства для записи данных; 11 - адрес регистра данных; Читаем два байта от запрошенного адреса: xD102 x - префикс шеснадцатиричной команды; D1 - номер I2C устройства для записи данных; 02 - длина записи в байтах Результат: OK - подтверждение отправки первой команды 0x1C - 28 градусов цельсия 0x80 - еще 0.5 градусов цельсия, и того 28.5 градусов.
Прочитать текущее время: xD000 xD103 - Секунды, минуты, часы.
Установить на выходе SQW импульсы 1 Hz xD00E00 - В регистра состояния азаписываем 0;
Включить первый будильник: xD00E05 - В регистр 0E пишем b00000101 bit 2 - INTCN - генерация импульсов/будильник bit 1 - A2IE - включить второй будильник bit 0 - A1IE - включить первый будильник
Первый будильник раз в минуту: xD00700808080 - начиная с седмого ригистра пишем: b00000000 - срабатывать в 0 секунд; b10000000 - на минуты забить; b10000000 - на часы забить; b10000000 - на дни и все такое то же забить. После каждого срабатывания будильника нужно сбрасывать бит 0 регистра 0F
Регистры чипа DS3231 (шоб не искать каждый раз).
АДРЕС BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 ФУНКЦИЯ ДИАПАЗОН
MSB LSB
0x00 0 | 10-ки секунд | едениницы секунд | Секунды 00-59
0x01 0 | 10-ки минут | еденицы минут | Минуты
0x02 0 |12/!24 | !AM/PM| 0-4 | еденицы часов | Часы 1-12 + !AM/PM
| | 0-2 | | | 00-23
0x03 0 | 0 | 0 | 0 | 0 | День недели | День недели 1-7
0x04 0 | 0 | 0-3 | | День месяца | День месяца 01-31
0x05 Век(пере-| 0 | 0 | 0-1 | Месяц | Месяц/пере- 01-12 +
полнение | | ход века век(128)
годов) |
0x06 10-ки лет
0x07 A1M1 | 10-ки секунд | едениницы секунд | Будильник 1 секунды 00-59
0x08 A1M2 | 10-ки минут | едениницы минут | Будильник 1 минуты 00-59
0x09 A1M3 |12/!24 | !AM/PM| 0-4 | еденицы часов | Будильник 1 часы 1-12 + !AM/PM
| | 0-2 | | | 00-23
0x0A A1M4 |Еженед.| десятки | День недели | Будильник 1 день 1-7
Ежемес.| | День месяца | 1-31
0x0B A2M2 | 10-ки минут | едениницы минут | Будильник 1 минуты 00-59
0x0C A3M3 |12/!24 | !AM/PM| 0-4 | еденицы часов | Будильник 1 часы 1-12 + !AM/PM
| | 0-2 | | | 00-23
0x0D A4M4 |Еженед.| десятки | День недели | Будильник 1 день 1-7
|Ежемес.| | День месяца | 1-31
0x0E !EOSC |BBSQW | CONV | RS2 | RS1 | INTCN | A2IE | A1IE | Контрольный регистр
0x0F OSF | 0 | 0 | 0 |EN32kHz| BSY | A2F | A1F | Контрольный/Статусы
0x10 ЗНАК | DATA | DATA | DATA | DATA | DATA | DATA | DATA | Корректировка хода
0x11 ЗНАК | DATA | DATA | DATA | DATA | DATA | DATA | DATA | Целые температуры
0x12 DATA | DATA | 0 | 0 | 0 | 0 | 0 | 0 | Дробная часть температуры
0.0,0.25,0.5,0.75
AT24C32 I2C адрес чипа:
| 1 | 0 | 1 | 0 | A2 | A1 | A0 | R/W |
По умолчанию: AE - запись, AF - Чтение.
Запись одного байта eeprom:
xAE000001
x - префикс шеснадцатиричной команды;
AE - номер I2C устройства для записи данных;
0000 - адрес памати eeprom (0x0000-0x0FFF);
01 - байт данных.
За одну операцию можно записать не более 32-байт.
Чтение eeprom:
xAE0000 - Встать на ячейку 0000
xAF01 - Прочитать один байт из eeprom