Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Исследование Ds1307

Сообщений 1 страница 3 из 3

1

Работа с микросхемой часов реального времени Ds1307, в среде компилятора Bascom

http://s7.uploads.ru/t/SoHew.jpg http://s7.uploads.ru/t/FI17W.jpg

http://s7.uploads.ru/t/wQoh4.jpghttp://s7.uploads.ru/t/5rvo2.jpg

2 варианта симуляции в Протеус 7.10 + 2 варианта исходников (Bascom 2.0.7.1)  -  скачать

Отредактировано sasha_1973 (2014-01-16 16:05:38)

+4

2

Ещё один вариант работы с RTC Ds1307

Исходник

Для правильного отображения форматирования компилятором, используйте шрифт "Consolas"

  $map              ' Получаем карту распределения памяти компилятором Bascom
  $regfile = "m328pdef.dat"
  $crystal = 1843200
  $framesize = 32   ' Размер области используемой и необходимой для преобразований
  $hwstack = 40     ' Размер аппаратного стека
  $swstack = 16     ' Размер программного стека

  $baud = 4800
  Ucsr0a.1 = 1      ' Двойная скорость работы USART, скорость трансляции = $baud * 2

  Config Pind.2 = Input       ' Настраиваем вывод на вход
  Config Int0 = Rising       ' Прерывание срабатывает по спаду уровня   Rising (по переднему фронту) ; Falling (по заднему фронту) ; Low Level (по низкому уровню)
  On Int0 Прерывание_ds1307 Nosave       ' После прерывания идем в подпрограмму обработки

  Config Scl = Portc.5       ' I2c Scl
  Config Sda = Portc.4       ' I2c Sda
  Config I2cdelay = 1       ' Скорость работы шины I2c на программном уровне
  I2cinit

  Const Запись_ds1307 = &HD0       ' Адрес записи в ОЗУ Ds1307
  Const Чтение_ds1307 = &HD1       ' Адрес чтения из ОЗУ Ds1307

  Const Const_год = 6       ' Регистр год Ds1307
  Const Const_часы = 2       ' Регистр часы Ds1307
  Const Const_месяц = 5       ' Регистр месяц Ds1307
  Const Const_минуты = 1       ' Регистр минуты Ds1307
  Const Const_секунды = 0       ' Регистр секунды Ds1307
  Const Const_день_недели = 3       ' Регистр день_недели Ds1307
  Const Const_число_месяца = 4       ' Регистр число_месяца Ds1307

  Const Const_настройка_ds1307 = 7       ' Регистр для настройки Ds1307
  Const Const_stop_часы = &B10000000       ' Значение константы для остановки часов
  Const Const_start_часы = &B00000000       ' Значение константы для запуска часов
  Const Const_разрешение_sout_ds1307 = &B10010000       ' Значение константы для старта секундных импульсов

'===============================================================================
'            И С П О Л Ь З У Е М Ы Е     П О Д П Р О Г Р А М М Ы
'===============================================================================

  Declare Sub Запись_i2c(byval Адрес_чипа_запись As Byte , Byval Регистр_чипа As Byte , Byval Записываемая_переменная As Byte)
  Declare Sub Чтение_i2c(byval Адрес_чипа_чтение As Byte , Byval Адрес_чипа_запись As Byte , Byval Регистр_чипа As Byte , Считанная_переменная As Byte)

'===============================================================================
'             И С П О Л Ь З У Е М Ы Е     П Е Р Е М Е Н Н Ы Е
'===============================================================================

  Dim Год As Byte
  Dim Часы As Byte
  Dim Месяц As Byte
  Dim Минуты As Byte
  Dim Секунды As Byte
  Dim День_недели As Byte
  Dim Число_месяца As Byte

  Dim Флаг_опросить_ds1307 As Byte
  Dim Флаг_данные_передача_usart As Byte

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'    З А П У С К    И    П Р Е Д В А Р И Т Е Л Ь Н Ы Е    Н А С Т Р О Й К И
'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

  Call Запись_i2c(запись_ds1307 , Const_настройка_ds1307 , Const_разрешение_sout_ds1307)

  Секунды = 10
  Минуты = 10
  Часы = 10
  День_недели = 7
  Число_месяца = 12
  Месяц = 4
  Год = 14

  Год = Makebcd(год)       ' Год
  Часы = Makebcd(часы)       ' Часы
  Месяц = Makebcd(месяц)       ' Месяц
  Минуты = Makebcd(минуты)       ' Минуты
  Секунды = Makebcd(секунды)       ' Секунды
  День_недели = Makebcd(день_недели)       ' День недели
  Число_месяца = Makebcd(число_месяца)       ' Число

  Call Запись_i2c(запись_ds1307 , Const_год , Год)
  Call Запись_i2c(запись_ds1307 , Const_часы , Часы)
  Call Запись_i2c(запись_ds1307 , Const_месяц , Месяц)
  Call Запись_i2c(запись_ds1307 , Const_минуты , Минуты)
  Call Запись_i2c(запись_ds1307 , Const_секунды , Секунды)
  Call Запись_i2c(запись_ds1307 , Const_день_недели , День_недели)
  Call Запись_i2c(запись_ds1307 , Const_число_месяца , Число_месяца)

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'--------------  Разрешаем работу необходимых прерываний  ----------------------
  Enable Int0
'------------  Разрешаем работу всех включенных прерываний  --------------------
  Enable Interrupts
'===============================================================================
'                   Г Л А В Н Ы Й         Ц И К Л
'===============================================================================
  Главный_цикл:

     If Флаг_опросить_ds1307 <> 0 Then

         Call Чтение_i2c(чтение_ds1307 , Запись_ds1307 , Const_год , Год)
         Call Чтение_i2c(чтение_ds1307 , Запись_ds1307 , Const_часы , Часы)
         Call Чтение_i2c(чтение_ds1307 , Запись_ds1307 , Const_месяц , Месяц)
         Call Чтение_i2c(чтение_ds1307 , Запись_ds1307 , Const_минуты , Минуты)
         Call Чтение_i2c(чтение_ds1307 , Запись_ds1307 , Const_секунды , Секунды)
         Call Чтение_i2c(чтение_ds1307 , Запись_ds1307 , Const_день_недели , День_недели)
         Call Чтение_i2c(чтение_ds1307 , Запись_ds1307 , Const_число_месяца , Число_месяца)

         Год = Makedec(год)       ' Год
         Часы = Makedec(часы)       ' Часы
         Месяц = Makedec(месяц)       ' Месяц
         Минуты = Makedec(минуты)       ' Минуты
         Секунды = Makedec(секунды)       ' Секунды
         День_недели = Makedec(день_недели)       ' День недели
         Число_месяца = Makedec(число_месяца)       ' Число

         Флаг_данные_передача_usart = 1

         Флаг_опросить_ds1307 = 0

         Goto Главный_цикл

     End If

     If Флаг_данные_передача_usart <> 0 Then
         Print Часы ; ":" ; Минуты ; ":" ; Секунды ; "_" ; День_недели ; "-" ; Число_месяца ; "-" ; Месяц ; "-20" ; Год
         Флаг_данные_передача_usart = 0
         Goto Главный_цикл
     End If

   Idle
  Goto Главный_цикл:
End
'===============================================================================
'        П О Д К Л Ю Ч Е Н И Е     Р А Б О Ч И Х     М О Д У Л Е Й
'===============================================================================

'===============================================================================
'                        П О Д П Р О Г Р А М М Ы
'===============================================================================

'===============================================================================
  Sub Запись_i2c(byval Адрес_чипа_запись As Byte , Byval Регистр_чипа As Byte , Byval Записываемая_переменная As Byte)
'-------------------------------------------------------------------------------
    I2cstart        ' Подготовка к работа шины I2c
    I2cwbyte Адрес_чипа_запись       ' Адресное обращение к используемому чипу i2c, для записи
    I2cwbyte Регистр_чипа       ' Адрес регистра, в который будет производиться запись
    I2cwbyte Записываемая_переменная       ' Записываемая переменная
    I2cstop         ' Освобождаем шину I2c
'-------------------------------------------------------------------------------
  End Sub
'===============================================================================

'===============================================================================
  Sub Чтение_i2c(byval Адрес_чипа_чтение As Byte , Byval Адрес_чипа_запись As Byte , Byval Регистр_чипа As Byte , Считанная_переменная As Byte)
'-------------------------------------------------------------------------------
    I2cstart        ' Подготовка к работе шины I2c
    I2cwbyte Адрес_чипа_запись       ' Адресное обращение к используемому чипу i2c, для записи
    I2cwbyte Регистр_чипа       ' Регистр с которого будем считывать данные
    I2crepstart     ' Повторная подготовка к работе шины I2c
    I2cwbyte Адрес_чипа_чтение       ' Адресное обращение к используемому чипу i2c, для чтения
    I2crbyte Считанная_переменная , Nack       ' Читаем значение из регистра чипа i2c
    I2cstop         ' Освобождаем шину I2c
'-------------------------------------------------------------------------------
  End Sub
'===============================================================================

'===============================================================================
'  Подпрограмма для обработки прерывания инициируемого секундными импульсами с вывода "SQW/OUT" Ds1307
'===============================================================================
  Прерывание_ds1307:       ' с помощью ASM AVR
'-------------------------------------------------------------------------------
    $asm
      push R16      ' Время выполнения инструкции, 2 такта
      ldi R16 , 1   ' Загрузить константу, время выполнения инструкции, 1 такт
      sts {Флаг_опросить_ds1307} , R16       ' Загрузить значение регистра в переменную, время выполнения инструкции, 2 такта
      Pop R16       ' Время выполнения инструкции, 2 такта
      reti          ' Время выполнения инструкции, 4 такта
    $end Asm
'-------------------------------------------------------------------------------
  Return
'===============================================================================

Симуляция Протеус 7.10 + исходник Bascom 2.0.7.1  -  скачать

+2

3

Симуляция + исходник  -  скачать

http://s2.uploads.ru/t/ib5h8.jpg

+1