Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Часы с таймером на ds1307 (Подскажите пожалуйста как реализовать таймер на ds1307)
Часы с таймером на ds1307
mixa Дата: Вс, 24.07.2011, 21:44  |                                                                                                                Сообщение # 1
Группа: Пользователи
Ранг:  Новенький
Сообщений: 12
Репутация: 0   ±
Замечания:   ±
На сайте с 05.04.2011

Статус: Offline

Device = 16F877A
Xtal = 4
Declare SHOW_SYSTEM_VARIABLES = OFF ;В Proteus показать внутренние переменные
Declare FSR_CONTEXT_SAVE = OFF ;Не заботится о сохранении содержимого регистра FSR
Declare Reminders = OFF ;Выключает напоминания компилятора
Declare Warnings = OFF ;Выключает предупреждения компилятора
Declare SDA_Pin PORTC.4
Declare SCL_Pin PORTC.3
Declare Slow_Bus OFF ;Выключить замедление при OSC > 4 Мгц
Declare BUS_SCL OFF ;Включить режим работы шины SCL без подтягивающего резистора
Declare PortB_Pullups = OFF ; Включить подтягивающие резисторы на PORTB
Declare All_Digital = off ;Каждый порт выполняет свою функцию по умолчанию
Declare LCD_Type ALPHA
Declare LCD_DTPin PORTA.0
Declare LCD_ENPin PORTC.0
Declare LCD_RSPin PORTC.1
Declare LCD_Interface 4
Declare LCD_CommandUs 2000
Declare LCD_DataUs 50
Declare LCD_Lines 4

SCL VAR PORTC.3 ' ножка clock
SDA VAR PORTC.4 ' ножкка data

'Dim Ctrl As Byte
'Ctrl = %00010000 ' управляюший регистр (на выходе SOUT 1Hz)

rtc_read CON %11010000 ' Адрес часов для чтения
rtc_write con %11010001 ' Адрес часов для записи
Dim sec As Byte ' секунды
Dim sec1 As Byte ' секунды в десятичном формате
Dim sec2 As Byte
Dim mins As Byte ' минуты в формате DS1307
Dim mins1 As Byte ' минуты в десятичном формате
Dim hr As Byte ' часы в формате DS1307
Dim hr1 As Byte ' часы в десятичном формате
Dim day As Byte ' день недели
Dim date As Byte ' дата в формате DS1307
Dim date1 As Byte ' дата в десятичном формате
Dim mon As Byte ' месяц в формате DS1307
Dim mon1 As Byte ' месяц в десятичном формате
Dim yr As Byte ' год в формате DS1307
Dim yr1 As Byte
Dim tmp As Byte
Dim tmp1 As Byte
Dim X As Byte
TRISB = %11111111 ' Сделать каналы PORTВ входами
'--Инициализация--
Init:
Clear
'I2COUT SDA, SCL, RTC_write, 7, [Ctrl]
Main:
If PORTB.4 = 0 Then Cls: DelayMS 500: GoTo UstVREMY
GoSub read_time
GoSub PRNT3_4
GoTo Main
End
Return
UstVREMY:
DelayMS 300
BranchL X, [Ust_godov, Ust_mesacev, Ust_dney, Ust_chasov, Ust_minut, Ust_secund]
Print At 3 ,1,$A9,$63,$BF,$61,$BD,$6F,$B3,$BA,$61,$20,$B3,$70,$65,$BC,$65,$BD,$B8,$20,$20,$20 '"Ustanovka vremeni"
If PORTB.7 = 0 Then Cls: DelayMS 300: GoTo Main
GoTo UstVREMY
Ust_godov:
Print At 1, 1, $50,$65,$E3,$61,$BA,$E5,$B8,$C7,$20,$B4,$6F,$E3,$6F,$B3,$20,$20,$20,$20,$20 '"Редакция годов"
If PORTB.5 = 0 Then DelayMS 500: yr1 = yr1 + 1: If yr1 >= 99 Then yr1 = 99
If PORTB.6 = 0 Then DelayMS 500: yr1 = yr1 - 1: If yr1 <= 0 Then yr1 = 0
GoSub PRNT3_4
If PORTB.7 = 0 Then Cls: DelayMS 300: X = 1: GoTo UstVREMY
GoTo Ust_godov

Ust_mesacev:
Print At 1, 1, $50,$65,$E3,$61,$BA,$E5,$B8,$C7,$20,$BC,$65,$63,$C7,$E5,$65,$B3,$20,$20,$20 '"Ред месяцев "
If PORTB.5 = 0 Then DelayMS 500: mon1 = mon1 + 1: If mon1 >= 12 Then mon1 = 12
If PORTB.6 = 0 Then DelayMS 500: mon1 = mon1 - 1: If mon1 <= 0 Then mon1 = 0
GoSub PRNT3_4
If PORTB.7 = 0 Then Cls: DelayMS 300: X = 2: GoTo UstVREMY
GoTo Ust_mesacev

Ust_dney:
Print At 1, 1, $$50,$65,$E3,$61,$BA,$E5,$B8,$C7,$20,$E3,$BD,$65,$B9,$20,$20,$20,$20,$20,$20 '"Ред дней"
If PORTB.5 = 0 Then DelayMS 500: date1 = date1 + 1: If date1 >= 30 Then date1 = 30
If PORTB.6 = 0 Then DelayMS 500: date1 = date1 - 1: If date1 <= 0 Then date1 = 0
GoSub PRNT3_4
If PORTB.7 = 0 Then Cls: DelayMS 300: X = 3: GoTo UstVREMY
GoTo Ust_dney

Ust_chasov:
Print At 1, 1, $50,$65,$E3,$61,$BA,$E5,$B8,$C7,$20,$C0,$61,$63,$6F,$B3,$20,$20,$20,$20,$20
If PORTB.5 = 0 Then DelayMS 500: hr1 = hr1 + 1: If hr1 >= 23 Then hr1 = 23
If PORTB.6 = 0 Then DelayMS 500: hr1 = hr1 - 1: If hr1 <= 0 Then hr1 = 0
GoSub PRNT3_4
If PORTB.7 = 0 Then Cls: DelayMS 300: X = 4: GoTo UstVREMY
GoTo Ust_chasov

Ust_minut:
Print At 1, 1, $50,$65,$E3,$61,$BA,$E5,$B8,$C7,$20,$BC,$B8,$BD,$79,$BF,$20,$20,$20,$20,$20 '"Redakciya minut"
If PORTB.5 = 0 Then DelayMS 500: mins1 = mins1 + 1: If mins1 >= 59 Then mins1 = 59
If PORTB.6 = 0 Then DelayMS 500: mins1 = mins1 - 1: If mins1 <= 0 Then mins1 = 0
GoSub PRNT3_4
If PORTB.7 = 0 Then Cls: DelayMS 300: X = 5: GoTo UstVREMY
GoTo Ust_minut

Ust_secund:
Print At 1, 1, $50,$65,$E3,$61,$BA,$E5,$B8,$C7,$20,$63,$65,$BA,$79,$BD,$E3,$20,$20,$20,$20 '"Redakciya secund"
If PORTB.5 = 0 Then DelayMS 500: sec1 = sec1 + 1: If sec1 >= 59 Then sec1 = 59
If PORTB.6 = 0 Then DelayMS 500: sec1 = sec1 - 1: If sec1 <= 0 Then sec1 = 0
GoSub PRNT3_4
If PORTB.7 = 0 Then Cls: DelayMS 300: X = 0: GoSub write_time: GoTo Main
GoTo Ust_secund
Return
PRNT3_4:
Print At 3, 1,$E0,$61,$BF,$61,$20,$3A,$20, Dec2 date1,"-",Dec2 mon1,"-",Dec2 yr1
Print At 4, 1,$42,$70,$65,$BC,$C7,$3A,$20, Dec2 hr1,"-",Dec2 mins1,"-",Dec2 sec1
Return
'--Чтение времени из DS1307--
read_time:
I2CIN SDA, SCL, RTC_read, 0, [sec,mins,hr,day,date,mon,yr]
tmp = sec
GoSub fix_bcd_in
sec1 = tmp
tmp = mins
GoSub fix_bcd_in
mins1 = tmp
tmp = hr
GoSub fix_bcd_in
hr1 = tmp
tmp = date
GoSub fix_bcd_in
date1 = tmp
tmp = mon
GoSub fix_bcd_in
mon1 = tmp
tmp = yr
GoSub fix_bcd_in
yr1 = tmp
Return

'--Запись времени в DS1307---
write_time:
tmp = sec1
GoSub fix_bcd_out
sec = tmp
tmp = mins1
GoSub fix_bcd_out
mins = tmp
tmp = hr1
GoSub fix_bcd_out
hr = tmp
tmp = date1
GoSub fix_bcd_out
date = tmp
tmp = mon1
GoSub fix_bcd_out
mon = tmp
tmp = yr1
GoSub fix_bcd_out
yr = tmp
sec = 0
I2COUT SDA, SCL, RTC_write, 0, [sec,mins,hr,day,date,mon,yr]
Return
fix_bcd_in:
tmp1 = tmp & 15
tmp = tmp >> 4
tmp = tmp1 + 10 * tmp
Return
fix_bcd_out:
tmp1 = tmp / $A
tmp = tmp - (tmp1 * $A)
tmp = tmp + (tmp1 << 4)
Return
Часы у меня получились, взял код из http://terrarus.ucoz.ru/contr_na_pic16/index.html Контроллер ошибок на PIC16F887A. Ну вот не пойму как реализовать таймер. С TMR0 понятно, но мне нужно на ds1307.

Добавлено (24.07.2011, 21.44.10)
---------------------------------------------
А если сделать на сравнение, то есть если минуты и часы отчитываемые ds1307 совпадут с установленным c кнопками таймера устанавливающие минуты и часы, то должен произойти установление флага и прерывание по определенному по порту.Правильно я понял............... faint

ЯНДЕКС Дата: 24.07.2011
ADMIN Дата: Вт, 26.07.2011, 16:14  |                                                                                                                Сообщение # 2
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1111
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Так и делается таймер, правильно. Алгоритм можно такой: Создаются переменные - для установки времени. Задается нужное время и записывается в эти переменные. Вычисляется разница между текущим и установленным временем(можно, например, в секундах). При прохождении очередного секундного интервала из этой разницы отнимается единица - секунда. При достижении нуля - настает момент срабатывания таймера. Вариантов много, в принципе. Допустим, сейчас 13:06. Устанавливаем таймер(или будильник), например, на 18:00. Вычисляем сразу же разницу между текущим и установленным:
это 4 часа 54 минуты, или 4 *60*60 + 54*60 = 17640 сек. Вот из этого числа вычитай секунды каждый раз. Это - один из вариантов. Или можно так - каждую секунду после запуска таймера проверять на равенство текущие и установленные часы или минуты. Как удобней.
mixa Дата: Чт, 28.07.2011, 16:20  |                                                                                                                Сообщение # 3
Группа: Пользователи
Ранг:  Новенький
Сообщений: 12
Репутация: 0   ±
Замечания:   ±
На сайте с 05.04.2011

Статус: Offline

Main:
If PORTB.4 = 0 Then Cls: DelayMS 500: GoTo MENU
GoSub read_time
GoSub PRNT3_4
GoTo Main
End
MENU:

If PORTB.6 = 0 Then DelayMS 500: X = X + 1: If X > 3 Then X = 1
If PORTB.5 = 0 Then DelayMS 500: X = X - 1: If X = 0 Then X = 3
If X = 1 Then GoSub Rezim1
If X = 2 Then GoSub Rezim2
If X = 3 Then GoSub Rezim3
If PORTB.4=0 Then Cls: DelayMS 500: GoTo Main
If X = 1 And PORTB.7 = 0 Then Cls: GoSub read_time: DelayMS 400: X = 0: GoTo UstVREMY
If X = 2 And PORTB.7 = 0 Then Cls: DelayMS 400: X = 0
If X = 3 And PORTB.7 = 0 Then Cls: DelayMS 400: X = 0


GoTo MENU
Return
Rezim1:
Print At 1 ,1, "menu"
Print At 2 ,1,"UstVREMY"
Return

Rezim2:
Print At 1 ,1, "menu"
Print At 2 ,1,"time"

Return

Rezim3:
Print At 1 ,1, "menu"
Print At 2 ,1,"regtime"
Return

Вот попытался меню замутить, не тут то было, заработало но не могу добиться при нажатии кнопки на PORTB.4 что бы появлялись все режимы в меню
ADMIN Дата: Пт, 29.07.2011, 07:06  |                                                                                                                Сообщение # 4
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1111
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

А не может быть, что X равен 0 или другому, отличному от 1,2,3 числу?
mixa Дата: Пт, 29.07.2011, 14:00  |                                                                                                                Сообщение # 5
Группа: Пользователи
Ранг:  Новенький
Сообщений: 12
Репутация: 0   ±
Замечания:   ±
На сайте с 05.04.2011

Статус: Offline

Спасибо будем разбиратся
Сообщение отредактировал mixa - Пт, 29.07.2011, 14:18
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Часы с таймером на ds1307 (Подскажите пожалуйста как реализовать таймер на ds1307)
Страница 1 из 11
Поиск: