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





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

Пример установки часов DS1307 с помощью UART
Предположим, мы уже изучили Приложение 4 и знаем, как посылать данные через ПК. Вариант организации обмена данными со стороны контроллера в таком случае мы покажем на примере записи значений текущего времени, необходимых для начальной установки часов реального времени DS1307 из главы 12.
Для организации такой процедуры сначала следует установить некий протокол обмена: чтобы МК "знал", что именно ему следует делать в данном конкретном сеансе связи, придется договориться о наборе команд, каждая из которых будет означать какое-либо определенное действие. Набор команд, необходимый для управления часами реального времени, приведен в табл. 13.1.

Таблица 13.1. Команды установки часов реального времени
Команда Описание Аргументы Ответ
$во Установка секунд = 59 $АА — все ОК
$ЕЕ — подтверждение 12С не получено
$А0 Установка секунд = 0 $АА — все ОК
$ЕЕ — подтверждение 12С не получено
$А1 Установка часов из ПК 6 байтов
BCD-формат Сек:Мин:Час:Дат:Мес:Год $АА — все ОК
$ЕЕ — подтверждение 12С не получено
$А2 Чтение часов в ПК BCD-формат
Час: Мин: Сек: Дат: Мес: Год

Первые две команды нужны для точной подстройки времени (причем, как показывает опыт, команда установки секунд в значение 59 на практике значительно удобнее, чем сброс секунд в ноль). Значения байтов, означающих команды, здесь указаны, разумеется, совершенно произвольно, можно выбрать любые другие по желанию.
Итак, предполагаем, что UART инициализирован с определенной скоростью, и процедуры записи и чтения (outcom и in_com) уже расположены где-то в тексте программы. Пишем основной цикл программы (листинг 13.7).

Листинг 13.7
Gcykle:
rcall in_com
cli
cpi temp,0xB0 /установить секунды = 59 breq proc_B0
cpi temp,OxAO /установить секунды = О breq proc_A0
cpi temp,0xAl /установить часы + б байт времени breq proc_Al
cpi temp,0xA2 /прочесть часы в ПК breq proc_A2 /cpi temp,0xF2 /читать данные из памяти breq proc_F2
sei
rjmp Gcykle
proc_B0: /установить секунды =59 push cnt ldi temp,$59 ldi count_sek, 59 rcall IniSek pop
cnt
sei
rjmp Gcykle
proc_A0: /установить секунды = О push cnt ldi temp,0 clr count_sek rcall IniSek pop cnt sei
rjmp Gcykle
proc_Al: /установить часы rcall SetTime sei
rjmp Gcykle
ргос_А2: /прочесть часы в ПК rcall ReadTime sei
rjmp Gcykle
proc_F2: ;F2 читать данные из памяти rcall.ReadFullFlash
rcall Rclocklni /восстанавливаем часы rjmp Gcykle



     
 

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