Главная » Статьи » Программирование » Программирование в 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) | Автор: Space E W
Просмотров: 2987 | Теги: atmega16, час на мк, часы на микроконтроллере, часы реального времени, как сделать часы на мк, как сделать часы, ds1307, часы+аtmega16, часы
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]