Главная » Статьи » Программирование » Программирование в BascomAVR |
Часы реального времени DS1307 (реализация)
Совсем не давно выложил статью "Часы реального времени DS1307". Эта статья можно сказать продолжение. В принципе рассказывать здесь особо не чего. По микросхеме Ds1307, краткую информацию выложил в статье упомянутой выше. К фоткам сделаю комментарии. Так же упомяну о возможных проблемах. И так поехали. Для начала подключим клавиши и плату часов реального времени. Средний, зелёный провод нам не нужен. P. S. наличие микросхемы 24LCxxx не обязательно. Чтобы собрать часы на отдельной плате можно использовать пример схемы ниже. Мк на схеме atmega16. Естественно добавить ещё обвязки для мк+дисплей и клавиши. После того как вы прошили мк, на экране дисплея вы увидите след.: Означает это, что микросхема DS1307 работает, требуется лишь произвести настройку даты и времени. Для этого используем 4 клавиши: вверх, вниз, ввод и меню. В программе сделано что-то вроде меню. Чтобы оно появилось на экране нажимаем соответствующую клавишу. На экране сначала появится настройка даты, вводим год, затем нажимаем ввод, следом выводится месяц, день и т.д. Не много о работе микросхемы DS1307. Это я упустил конечно. Работает как ведомое устройство на последовательной шине. Для доступа к нему надо установить состояние START и передать код идентификации устройства, сопровождаемый адресом регистра. К последующим регистрам можно обращаться последовательно, пока не установлено состояние STOP. Когда Vcc(основное питание) падает ниже 1.25 х Vbat, устройство прекращает связь и сбрасывает адресный счётчик. В это время оно не будет реагировать на входные сигналы, чтобы предотвратить запись ошибочной информации. Когда Vcc падает ниже Vbat, устройство переключается в режим хранения с низким потреблением. При вкл. питания устройство переключается питание с батареи на основное питание. Теперь сама программа: Code '******************************************************************************* ' Автор: Кирилл (Space) ' Сайт: www.enore.ucoz.ru ' CPU: ATmega16 ' Тактовая частота: 16000000 Hz ' Компилятор: BASCOM-AVR 1.11.9.0 '******************************************************************************* ' Программируемые Fuse: ' SUT0 ' BOOTSZ0, BOOTSZ1 ' CKORT ' SPIEN '******************************************************************************* '***************************Тип_микроконтроллера******************************** $regfile = "m16def.dat" $crystal = 16000000 '************************Дополнительные библиотеки****************************** $lib "lcd4.lbx" 'используем 4-битное подключение дисплея с помощью альтернативной библиотеки $lib "ds1307clock.lib" '******************************************************************************* Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 Config Lcd = 20 * 4 'используем дисплей на 20 символ и 4 строки '***********************************Порты*************************************** Set Porta.0 : Меню Alias Pina.0 'Меню Set Porta.1 : Вниз Alias Pina.1 'Вниз Set Porta.2 : Вверх Alias Pina.2 'Вверх Set Porta.3 : Ввод Alias Pina.3 'Ввод '************************************I2C**************************************** Config Scl = Portc.0 Config Sda = Portc.1 '**********************************Прочее*************************************** Config Clock = User Config Date = Dmy , Separator = . '*********************************Константы************************************* Const Ds1307w = &HD0 Const Ds1307r = &HD1 '********************************Переменные************************************* Dim I As Byte , Byte0 As Byte , Byte1 As Byte Dim Incoming As String * 8 , Stroka As String * 8 Dim J1 As Byte , M1 As Byte , D1 As Byte , H1 As Byte , Min1 As Byte Dim Aa As Byte , X1 As Byte , Weekday As Byte , Pos As Byte , Digit As Byte '************************************Процедуры********************************** Declare Sub Настройка() Declare Sub Клавиши() Declare Sub МенюП() '*****************************Оcновной_цикл_программы*************************** Cls 'очищаем дисплей Cursor Off 'отключаем курсор Do Locate 1 , 1 Lcd Time$ ; "-BpeјЗ" Locate 2 , 1 Lcd Date$ ; "-аaїa" If Меню = 0 Then : Gosub МенюП : End If Loop End Getdatetime: I2cstart ' Generate start code I2cwbyte Ds1307w 'Отправка адреса I2cwbyte 0 'Стартовый адрес в 1307 I2cstart ' Generate start code I2cwbyte Ds1307r 'Отправка адреса I2crbyte _sec , Ack 'Секунды I2crbyte _min , Ack 'Минуты I2crbyte _hour , Ack 'Часы I2crbyte Weekday , Ack 'День недели I2crbyte _day , Ack 'День I2crbyte _month , Ack 'Месяц I2crbyte _year , Nack 'Год I2cstop _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour) _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year) Return Дата: _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year) I2cstart ' Generate start code I2cwbyte Ds1307w ' send address I2cwbyte 4 ' starting address in 1307 I2cwbyte _day ' Send Data to SECONDS I2cwbyte _month ' MINUTES I2cwbyte _year ' Hours I2cstop Return Время: _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour) I2cstart ' Generate start code I2cwbyte Ds1307w ' send address I2cwbyte 0 ' starting address in 1307 I2cwbyte _sec ' Send Data to SECONDS I2cwbyte _min ' MINUTES I2cwbyte _hour ' Hours I2cstop Return End '******************************************************************************* Sub Настройка() Cls 'X1 = 08 Aa = 0 X1 = _year Do If X1 > 50 Then X1 = 9 If X1 < 9 Then X1 = 50 Locate 1 , 1 Lcd "[> ©cї. гaїГ <]" 'установка времени Locate 2 , 1 Lcd "Ўoг: " ; X1 ; " " 'год Клавиши J1 = X1 Loop Until Aa = 1 'при нажатие клавиши ввод, выходим из цикла '******************************************************************************* Cls Aa = 0 'X1 = 11 X1 = _month Do If X1 > 12 Then X1 = 1 If X1 < 1 Then X1 = 12 Locate 1 , 1 Lcd "[> ©cї. гaїГ <]" 'установка времени Locate 2 , 1 Lcd "MecЗе: " ; X1 ; " " 'месяц Клавиши M1 = X1 Loop Until Aa = 1 'при нажатие клавиши ввод, выходим из цикла '******************************************************************************* Cls Aa = 0 'X1 = 1 X1 = _day Do If X1 > 31 Then X1 = 1 If X1 < 1 Then X1 = 31 Locate 1 , 1 Lcd "[> ©cї. гaїГ <]" 'установка времени Locate 2 , 1 Lcd "аeЅД: " ; X1 ; " " 'день Клавиши D1 = X1 Loop Until Aa = 1 'при нажатие клавиши ввод, выходим из цикла _year = J1 _month = M1 _day = D1 Gosub Дата '******************************************************************************* Cls Aa = 0 'X1 = 12 X1 = _hour Do If X1 > 23 Then X1 = 0 If X1 < 0 Then X1 = 23 Locate 1 , 1 Lcd "[> ©cї. іpeјeЅё <]" 'установка времени Locate 2 , 1 Lcd "«acГ: " ; X1 ; " " 'часы Клавиши H1 = X1 Loop Until Aa = 1 'при нажатие клавиши ввод, выходим из цикла '******************************************************************************* Cls Aa = 0 'X1 = 30 X1 = _min Do If X1 > 59 Then X1 = 0 If X1 < 1 Then X1 = 59 Locate 1 , 1 Lcd "[> ©cї. іpeјeЅё <]" 'установка времени Locate 2 , 1 Lcd "MёЅyїГ: " ; X1 ; " " 'минуты Клавиши Min1 = X1 Loop Until Aa = 1 'при нажатие клавиши ввод, выходим из цикла _hour = H1 _min = Min1 _sec = 0 Gosub Время End Sub '******************************************************************************* Sub Клавиши() Waitms 300 If Вверх = 0 Then Incr X1 'при нажатие клавиши увеличиваем переменную на единицу If Вниз = 0 Then Decr X1 'при нажатие клавиши уменьшаем переменную на единицу If Ввод = 0 Then : Aa = 1 : Else : Aa = 0 : End If End Sub '******************************************************************************* Sub МенюП() Aa = 0 : X1 = 0 Клавиши : Настройка Cls End Sub End '******************************************************************************* Возможные проблемы в работе и их устранение!!! 1) На экране дисплея вы видите следующие изображение: Микросхема DS1307 не определена. Устранение: 1. Проверьте контакты, может где-то отходит 2. Возможно надо заменить микросхему 3. Не подается основное питание на микросхему. 2) После завершения настроек не идут секунды или идут, но очень медленно. Устранение: Здесь дело в часовом кварце. Для начала проверить контачит ли он с микросхемой. Если всё в порядке, то заменить часовой кварц. 3) Часы работают(секунды идут) только при включенном основном питание. Как только отключаем питание часы останавливаются(секунды не идут). Устранение: Заменить литиевую батарейку (Vbat). Источник: http://enore.ucoz.ru | |
Категория: Программирование в BascomAVR | Добавил: Space (19.04.2011) | | |
Просмотров: 3031 | |
Всего комментариев: 0 | |