Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





В DS1307 имеется вывод для прерывания МК, который может программироваться с различным коэффициентом деления частоты кварца. Мы запрограммируем его на выдачу импульсов с периодом 1 с, по внешнему прерыванию от этих импульсов в МК будем считать секунды, обновлять значение времени и выполнять другие полезные действия. В отличие от счета времени самим контроллером (см. главу 8), здесь мы можем быть уверены, что при любых сбоях в МК время у нас будет отсчитываться верно, а также получаем возможность проведения длинных процедур (вроде чтения из внешней памяти) без боязни сбить отсчет времени.

Схема подключения DS1307 к нашему измерителю приведена на рис. 12.4. Обратите внимание, что выводы интерфейса 12С микросхемы (контакты 5 и 6) здесь те же самые, что и для памяти (и корпуса у них одинаковые). Выход программируемой частоты SQW у нас подсоединен к выводу внешнего прерывания МК. SQW мы должны запрограммировать на выдачу сигнала с периодом 1 с.

Основное неудобство обращения с часами DS1307— то, что у них нет состояния "по умолчанию", и внутренние регистры могут при включении питания иметь произвольные значения. В частности, в этих часах в одном из регистров (том же, что хранит значения секунд) предусмотрен бит СН, который может погружать часы в "спячку" — если он установлен в 1, то не работает генератор и даже невозможно определить правильность подключения. Есть и бит (в регистре управления), который отключает выход частоты на прерывания МК. Поэтому после первого включения (если батарейка подсоединена — то только после первого) часы приходится инициализировать. Логика разработчиков проста: зачем кому-то нужны часы, которые не установлены на правильное время? Ну а если корректировать показания, то нетрудно установить и эти биты. На том, как записывать в часы текущее время, мы остановимся в главе 13, а здесь рассмотрим только, как их "завести" — запустить в работу.

Сначала нам придется написать процедуру инициализации часов. Для этого в регистре управления DS1307 (он имеет номер 07h) нужно установить бит 4 (SQWE), который разрешает выход частоты для прерывания. Если обнулить младшие два бита в этом регистре, то это означает частоту на этом выходе 1 Гц (подробности см. в описании DS1307, которое можно скачать с сайта maxim-ic.com). Но это еще не все: ранее мы говорили, что необходимо вообще завести часы, установив бит (СН), который отвечает за работу задающего генератора. Это бит номер 7 в регистре секунд (номер OOh) — здесь учтен тот факт, что максимальное значение секунд равно 59 (напомним, что оно в BCD-форме, потому это равносильно значению $59), и старший бит всегда будет равен нулю. А если мы его установим, то часы стоят, и значение секунд не имеет значения. Потому мы совместим сброс этого бита с установкой секунд в нужное значение (листинг 12.5).

Листинг 12.5
IniSek: /секунды — в temp, если бит 7=1 ;то остановить, иначе завести часы sbis PinC,pSDA /линия занята rcall err_i2c ldi ClkA,0 /адрес регистра секунд mov DATA,temp rcall write_i2c brcs stopW
ldi temp,$AA /все отлично rcall out_com
ret
IniClk: /установить выход SQW
ldi'ClkA,7 /адрес регистра управления
ldi DATA, ОЬОООЮООО /выход SQW с частотой 1 Гц
rcall write_i2c
brcs stopW
ldi temp,$AA /все отлично rcall out_com
ret
stopW:
ldi temp,$EE /подтверждение не получено rcall out com ret
err_i2c: ldi temp,$AE ;линия занята rcall out_com
sei ret

Процедуры доступа по интерфейсу I2C (write_i2c, как и использующаяся далее read_i2c), напомним, находятся в файле i2c.prg (см. приложение 3). Для надежности отдельно перед записью проверяется линия SDA. При обнаружении ошибок в компьютер (без запроса с его стороны) выдается определенный код: $АЕ, если линия занята, и $ЕЕ, если подтверждение со стороны часов (АСК) не получено (флаг переноса, согласно процедурам в i2c.prg, при получении отклика АСК должен сбрасываться). Если все в порядке, то выдается код $АА. Те же самые вызовы для выдачи кодов ошибки у нас будут в других процедурах обращения к часам.



     
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru