Работа с микросхемой часов реального времени Ds1307, в среде компилятора Bascom
2 варианта симуляции в Протеус 7.10 + 2 варианта исходников (Bascom 2.0.7.1) - скачать
Отредактировано sasha_1973 (2014-01-16 16:05:38)
Программирование ATMEL в BASCOM. |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » Программирование ATMEL в BASCOM. » Примеры применения в среде Баском » Исследование Ds1307
Работа с микросхемой часов реального времени Ds1307, в среде компилятора Bascom
2 варианта симуляции в Протеус 7.10 + 2 варианта исходников (Bascom 2.0.7.1) - скачать
Отредактировано sasha_1973 (2014-01-16 16:05:38)
Ещё один вариант работы с RTC Ds1307
Для правильного отображения форматирования компилятором, используйте шрифт "Consolas"
$map ' Получаем карту распределения памяти компилятором Bascom
$regfile = "m328pdef.dat"
$crystal = 1843200
$framesize = 32 ' Размер области используемой и необходимой для преобразований
$hwstack = 40 ' Размер аппаратного стека
$swstack = 16 ' Размер программного стека$baud = 4800
Ucsr0a.1 = 1 ' Двойная скорость работы USART, скорость трансляции = $baud * 2Config 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 на программном уровне
I2cinitConst Запись_ds1307 = &HD0 ' Адрес записи в ОЗУ Ds1307
Const Чтение_ds1307 = &HD1 ' Адрес чтения из ОЗУ Ds1307Const 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 ' Регистр число_месяца Ds1307Const 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 ByteDim Флаг_опросить_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 IfIdle
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 - скачать
Симуляция + исходник - скачать
Вы здесь » Программирование ATMEL в BASCOM. » Примеры применения в среде Баском » Исследование Ds1307