Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: demanik, ivan_fd  
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Часы с будильником
Часы с будильником
proton Дата: Ср, 13.07.2011, 21:28  |                                                                                                                Сообщение # 1
Группа: Пользователи
Ранг:  Новенький
Сообщений: 16
Репутация: 0   ±
Замечания:   ±
На сайте с 13.07.2011

Статус: Offline

Device = 16F877A
Declare Xtal=4

'-------------------------- Настройки подключения ЖКИ ------------------------
Declare LCD_Type ALPHA ' Тип ЖКИ - буквенно -цифровой
Declare LCD_DTPin PORTD.4 ' Порт данных ЖКИ
Declare LCD_ENPin PORTD.3 ' Управление линией E
Declare LCD_RSPin PORTD.2 ' Управление линией RS
Declare LCD_Interface 4 ' Разрядность шины данных
Declare LCD_CommandUs 200 ' Задержка перед посылкой команды
Declare LCD_DataUs 50 ' Задержка перед посылкой данных
Declare LCD_Lines 2 ' Количество строк ЖКИ

'-------------------------- Настройки портов ---------------------------------
Symbol RBIF = INTCON.0 ;RB Port Interrupt Flag
Symbol INTF = INTCON.1 ; RB0 External Interrupt Flag
Symbol T0IF = INTCON.2 ; TMR0 Overflow Interrupt Flag
Symbol RBIE = INTCON.3 ; RB Port Change Interrupt Enable
Symbol INTE = INTCON.4 ;RB0 External Interrupt Enable
Symbol T0IE = INTCON.5 ; TMR0 Overflow Interrupt Enable
Symbol PEIE = INTCON.6 ; Peripheral Interrupt Enable
Symbol GIE = INTCON.7 ; Global Interrupt Enable
Dim BIG As Dword 'переменная для счета секунд
Dim BIG1 As BIG.HighWord
Dim K As Byte
Dim TEXT As Word
Dim HOUR As Byte ; для счета часов '
Symbol VR=PORTB.0 ' Ввод значения
Symbol VERH=PORTB.3 ' часы
Symbol NIZ=PORTB.4 ' минуты
Symbol DQ = PORTC.0 ' пищалка
BIG = 1108292 ' Запишем в BIG 1000000 для отсчета секундных интервалов

On_Interrupt GoTo MYINT
GoTo MAIN ; Переход на начало программы

MYINT: ; Обработчик прерывания
big1 = big1 -1 ' отнимаем единицу из старшего байта переменной BIG1
'то же самое, что и вычесть 65536 из BIG , но занимает меньше места
If BIG < 0 Then 'Если BIG < 0 то значит прошла секунда
BIG = BIG + 1108292 'К этому отрицательному числу прибавляем 1108292
Inc SECONDS 'Инкрементируем секунды
t = ~t: Inc d
EndIf
T0IF = 0 ' сбросить флаг прерываний TOIF регистра TMRO
Context Restore

MAIN:
INTCON = %10100000 ; Enable global interrupts, peripheral interrupts
OPTION_REG = %00000111
TRISB = %1111111
TRISC = %0011111
loop:

If SECONDS>=60 Then ; инкрементируем время
SECONDS=0
If HOUR = HOURr[0] And MINUTES = MINUTESr[0] Then SetTemp = TEMPUST[1]
If HOUR = HOURr[1] And MINUTES = MINUTESr[1] Then SetTemp = TEMPUST[2]
If HOUR = HOURr[2] And MINUTES = MINUTESr[2] Then SetTemp = TEMPUST[3]
If HOUR = HOURr[3] And MINUTES = MINUTESr[3] Then SetTemp = TEMPUST[0]
Inc MINUTES ; +минуты
If MINUTES=60 Then
MINUTES=0
SECONDS=K
Inc HOUR ; +ЧАСЫ
If HOUR=24 Then
HOUR=0
EndIf
EndIf
EndIf
i = M - 1
If i = 4 Then i = 0
If PLUS = 0 Then
Inc TEMPUST[M - 2]
ElseIf MINUS = 0 Then
Dec TEMPUST[M - 2]
EndIf
If VERH=0 Then
Inc HOURr[M - 2]
If HOURr[M - 2] >= 24 Then
HOURr[M - 2] = 0
EndIf
ElseIf NIZ = 0 Then
Inc MINUTESr[M - 2]
If MINUTESr[M - 2] >= 60 Then
MINUTESr[M - 2] = 0
EndIf
EndIf
Print At 1,1, 2,"CT",Dec M - 1," ",Dec2 HOURr[M - 2],":",Dec2 MINUTESr[M - 2]
При компиляции выдает ошибку
помогите пожалуйста разобратся

Сообщение отредактировал proton - Ср, 13.07.2011, 21:29
ЯНДЕКС Дата: 13.07.2011
Andriy76 Дата: Ср, 13.07.2011, 22:04  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 231
Репутация: 10   ±
Замечания:   ±
На сайте с 06.04.2010

Статус: Offline

Нету обявленных всех переменных

Добавлено (13.07.2011, 22.04.45)
---------------------------------------------
Ругаеться на это
If HOUR = HOURr[0] And MINUTES = MINUTESr[0] Then SetTemp = TEMPUST1
Надо наверное попроще
IF HOUR = 0 And MINUTES = 0 Then TEMPUST1 - примерно

ADMIN Дата: Чт, 14.07.2011, 13:22  |                                                                                                                Сообщение # 3
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1087
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Нужно просто объявить массивы HOURr, MINUTESr и TEMPUST и не париться. Для чего они вообще нужны?
mikhail09p Дата: Чт, 14.07.2011, 13:27  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Это кусочек моей программы программируемого термостата.
Нужно их объявить
Dim TEMPUST[4] As Byte
Dim HOURr[4] As Byte
Dim MINUTESr[4] As Byte

Если они нужны... wink
В часах они не нужны.
Внимательней разбирайте чужие программы.
proton Дата: Чт, 14.07.2011, 16:37  |                                                                                                                Сообщение # 5
Группа: Пользователи
Ранг:  Новенький
Сообщений: 16
Репутация: 0   ±
Замечания:   ±
На сайте с 13.07.2011

Статус: Offline

Извиняюсь, что я взял образцы из чужой программы. Я просто новичок я конечно стараюсь сам все делать, но бывает такие вещи как таймер который немного сложен в понимании и приходится прибегать к чужим программам, что бы разобраться в его работе.
Сообщение отредактировал proton - Чт, 14.07.2011, 16:38
mikhail09p Дата: Чт, 14.07.2011, 18:45  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Да на здоровье! Для того здесь и выкладывают программы, кусочки кода и т. д. smile
Я наоборот рад, что мой труд кому-то помог !
Мы все тут учимся.
proton Дата: Чт, 14.07.2011, 18:49  |                                                                                                                Сообщение # 7
Группа: Пользователи
Ранг:  Новенький
Сообщений: 16
Репутация: 0   ±
Замечания:   ±
На сайте с 13.07.2011

Статус: Offline

Inc SECONDS 'Инкрементируем секунды _____________________ на этой строчке компилятор выдает ошибку
mikhail09p Дата: Чт, 14.07.2011, 19:04  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

У Вас есть в программе
Dim SECONDS As Byte ; переменная для счета секунд ?
proton Дата: Чт, 14.07.2011, 19:12  |                                                                                                                Сообщение # 9
Группа: Пользователи
Ранг:  Новенький
Сообщений: 16
Репутация: 0   ±
Замечания:   ±
На сайте с 13.07.2011

Статус: Offline

Quote (mikhail09p)
У Вас есть в программе
Dim SECONDS As Byte ; переменная для счета секунд ?

Конечно есть

Device = 16F874A
Declare Xtal=4.433169
Declare Optimiser_Level =0

'-------------------------- Настройки подключения ЖКИ ------------------------
Declare LCD_Type ALPHA ' Тип ЖКИ - буквенно -цифровой
Declare LCD_DTPin PORTD.4 ' Порт данных ЖКИ
Declare LCD_ENPin PORTD.3 ' Управление линией E
Declare LCD_RSPin PORTD.2 ' Управление линией RS
Declare LCD_Interface 4 ' Разрядность шины данных
Declare LCD_CommandUs 200 ' Задержка перед посылкой команды
Declare LCD_DataUs 50 ' Задержка перед посылкой данных
Declare LCD_Lines 2 ' Количество строк ЖКИ

'-------------------------- Настройки портов ---------------------------------
Symbol RBIF = INTCON.0 ;RB Port Interrupt Flag
Symbol INTF = INTCON.1 ; RB0 External Interrupt Flag
Symbol T0IF = INTCON.2 ; TMR0 Overflow Interrupt Flag
Symbol RBIE = INTCON.3 ; RB Port Change Interrupt Enable
Symbol INTE = INTCON.4 ;RB0 External Interrupt Enable
Symbol T0IE = INTCON.5 ; TMR0 Overflow Interrupt Enable
Symbol PEIE = INTCON.6 ; Peripheral Interrupt Enable
Symbol GIE = INTCON.7 ; Global Interrupt Enable
Dim BIG As Dword 'переменная для счета секунд
Dim BIG1 As BIG.HighWord
Dim TEXT As Word
Dim SECONDS As Byte ; переменная для счета секунд
Dim MINUTES As Byte ; для счета минут '
Dim HOUR As Byte ; для счета часов '
BIG = 1108292 ' Запишем в BIG 1000000 для отсчета секундных интервалов

On_Interrupt GoTo MYINT
GoTo MAIN ; Переход на начало программы

MYINT: ; Обработчик прерывания
big1 = big1 -1 ' отнимаем единицу из старшего байта переменной BIG1
'то же самое, что и вычесть 65536 из BIG , но занимает меньше места
If BIG < 0 Then 'Если BIG < 0 то значит прошла секунда
BIG = BIG + 1108292 'К этому отрицательному числу прибавляем 1108292
Inc SECONDS 'Инкрементируем секунды
t = ~t: Inc d
EndIf
T0IF = 0 ' сбросить флаг прерываний TOIF регистра TMRO
Context Restore

MAIN:
INTCON = %10100000 ; Enable global interrupts, peripheral interrupts
OPTION_REG = %00000111
TRISB = %1111111
TRISC = %0011111

loop:

If SECONDS>=60 Then ; инкрементируем время
SECONDS=0
If HOUR = HOURr[0] And MINUTES = MINUTESr[0] Then SetTemp = TEMPUST[1]
If HOUR = HOURr[1] And MINUTES = MINUTESr[1] Then SetTemp = TEMPUST[2]
If HOUR = HOURr[2] And MINUTES = MINUTESr[2] Then SetTemp = TEMPUST[3]
If HOUR = HOURr[3] And MINUTES = MINUTESr[3] Then SetTemp = TEMPUST[0]
Inc MINUTES ; +минуты
If MINUTES=60 Then
MINUTES=0
SECONDS=K
Inc HOUR ; +ЧАСЫ
If HOUR=24 Then
HOUR=0
EndIf
EndIf
EndIf

GoTo loop

LAB_1:
i = M - 1
If i = 4 Then i = 0
If PLUS = 0 Then
Inc TEMPUST[M - 2]
ElseIf MINUS = 0 Then
Dec TEMPUST[M - 2]
EndIf
If VERH=0 Then
Inc HOURr[M - 2]
If HOURr[M - 2] >= 24 Then
HOURr[M - 2] = 0
EndIf
ElseIf NIZ = 0 Then
Inc MINUTESr[M - 2]
If MINUTESr[M - 2] >= 60 Then
MINUTESr[M - 2] = 0
EndIf
EndIf
Print At 1,1, 2,"CT",Dec M - 1," ",Dec2 HOURr[M - 2],":",Dec2 MINUTESr[M - 2]
DelayMS 300
GoTo loop
VREMYA:

If VERH=0 Then
Inc HOUR
If HOUR >= 24 Then
HOUR=0
EndIf
ElseIf NIZ=0 Then
Inc MINUTES
If MINUTES>=60 Then
MINUTES=0
EndIf
EndIf
Print At 1,1, 2,"CT. ",6,"ACIB"," "
Print At 2,1, Dec2 HOUR, ":", Dec2 MINUTES," "
DelayMS 300
GoTo loop

Сообщение отредактировал proton - Чт, 14.07.2011, 19:14
mikhail09p Дата: Чт, 14.07.2011, 19:21  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Вам это нужно?
If HOUR = HOURr[0] And MINUTES = MINUTESr[0] Then SetTemp = TEMPUST[1]
If HOUR = HOURr[1] And MINUTES = MINUTESr[1] Then SetTemp = TEMPUST[2]
If HOUR = HOURr[2] And MINUTES = MINUTESr[2] Then SetTemp = TEMPUST[3]
If HOUR = HOURr[3] And MINUTES = MINUTESr[3] Then SetTemp = TEMPUST[0]
Эти переменные не объявлены.
Эти тоже
t = ~t: Inc d
Компилятор же пишет, что переменная такая не существует.
А это Вам нужно?
Symbol PLUS=PORTA.1 ' Плюс температуры
Внимательно посмотрите.

Если хотите - совет:
Скопируйте ВСЮ программу, ВСЕ переменные и отредактируйте под свои нужды программу. Там неизбежно добавите ещё переменных или ещё чего. А только, как заработает более-менее как нужно, вычищайте понемногу лишнее. И доводите до ума. Ведь у выбраного пика памяти хватает для этого. cool

Сообщение отредактировал mikhail09p - Чт, 14.07.2011, 19:49
proton Дата: Чт, 14.07.2011, 21:50  |                                                                                                                Сообщение # 11
Группа: Пользователи
Ранг:  Новенький
Сообщений: 16
Репутация: 0   ±
Замечания:   ±
На сайте с 13.07.2011

Статус: Offline

Device = 16F874A
Declare Xtal=4.433169
Declare Optimiser_Level =0

'-------------------------- Настройки подключения ЖКИ ------------------------
Declare LCD_Type ALPHA ' Тип ЖКИ - буквенно -цифровой
Declare LCD_DTPin PORTD.4 ' Порт данных ЖКИ
Declare LCD_ENPin PORTD.3 ' Управление линией E
Declare LCD_RSPin PORTD.2 ' Управление линией RS
Declare LCD_Interface 4 ' Разрядность шины данных
Declare LCD_CommandUs 200 ' Задержка перед посылкой команды
Declare LCD_DataUs 50 ' Задержка перед посылкой данных
Declare LCD_Lines 2 ' Количество строк ЖКИ

'-------------------------- Настройки портов ---------------------------------
Symbol RBIF = INTCON.0 ;RB Port Interrupt Flag
Symbol INTF = INTCON.1 ; RB0 External Interrupt Flag
Symbol T0IF = INTCON.2 ; TMR0 Overflow Interrupt Flag
Symbol RBIE = INTCON.3 ; RB Port Change Interrupt Enable
Symbol INTE = INTCON.4 ;RB0 External Interrupt Enable
Symbol T0IE = INTCON.5 ; TMR0 Overflow Interrupt Enable
Symbol PEIE = INTCON.6 ; Peripheral Interrupt Enable
Symbol GIE = INTCON.7 ; Global Interrupt Enable
Dim BIG As Dword 'переменная для счета секунд
Dim BIG1 As BIG.HighWord
Dim SECONDS As Byte ; переменная для счета секунд
Dim MINUTES As Byte ; для счета минут '
Dim HOUR As Byte ; для счета часов '
Symbol VR=PORTB.0 ' Ввод значения
Symbol VERH=PORTB.3 ' НИЗ
Symbol NIZ=PORTB.4 ' ВВЕРХ
Symbol payalo = PORTC.7 ' нагрузка

EData 5, 8, 15, 23, 0, 0, 0, 0, 18, 20, 19, 21, 17
BIG = 1108292 ' Запишем в BIG 1000000 для отсчета секундных интервалов

On_Interrupt GoTo MYINT
GoTo MAIN ; Переход на начало программы

MYINT: ; Обработчик прерывания
big1 = big1 -1 ' отнимаем единицу из старшего байта переменной BIG1
'то же самое, что и вычесть 65536 из BIG , но занимает меньше места
If BIG < 0 Then 'Если BIG < 0 то значит прошла секунда
BIG = BIG + 1108292 'К этому отрицательному числу прибавляем 1108292
Inc SECONDS 'Инкрементируем секунды
EndIf
T0IF = 0 ' сбросить флаг прерываний TOIF регистра TMRO
Context Restore

MAIN:
INTCON = %10100000 ; Enable global interrupts, peripheral interrupts
OPTION_REG = %00000111
TRISB = %1111111
TRISC = %0011111
loop:
If SECONDS>=60 Then ; инкрементируем время
SECONDS=0
Inc MINUTES ; +минуты
If MINUTES=60 Then
MINUTES=0
Inc HOUR ; +ЧАСЫ
If HOUR=24 Then
HOUR=0
EndIf
EndIf
EndIf
VREMYA:

If VERH=0 Then
Inc HOUR
If HOUR >= 24 Then
HOUR=0
EndIf
ElseIf NIZ=0 Then
Inc MINUTES
If MINUTES>=60 Then
MINUTES=0
EndIf
EndIf
Print At 1,1, 2,"CT. ",6,"ACIB"," "
Print At 2,1, Dec2 HOUR, ":", Dec2 MINUTES," "
Print At 1,1,Dec2 HOUR,Dec2 MINUTES
GoTo loop
в протеусе заработало, но на кнопки реагирует неадекватно
ЯНДЕКС Дата: 14.07.2011
mikhail09p Дата: Чт, 14.07.2011, 22:18  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Вот попробуйте
Code


  loop:  
  If SECONDS>=60 Then ; èíêðåìåíòèðóåì âðåìÿ  
  SECONDS=0  
  Inc MINUTES ; +ìèíóòû  
  If MINUTES=60 Then  
  MINUTES=0  
  Inc HOUR ; +×ÀÑÛ  
  If HOUR=24 Then  
  HOUR=0  
  EndIf  
  EndIf  
  EndIf
  If VERH=0 Or NIZ=0 Then VREMYA  
Print At 1,1,Dec2 HOUR, ":", Dec2 MINUTES
GoTo loop
   
  VREMYA:  
  If VERH=0 Then  
  Inc HOUR  
  If HOUR >= 24 Then  
  HOUR=0  
  EndIf  
  ElseIf NIZ=0 Then  
  Inc MINUTES  
  If MINUTES>=60 Then  
  MINUTES=0  
  EndIf  
  EndIf  
  Print At 1,1, 2,"CT. ",6,"ACIB"," "  
  Print At 2,1, Dec2 HOUR, ":", Dec2 MINUTES," "
  DelayMS 300
  Cls  
GoTo loop

Только скорректируйте, в какой строчке что выводится под себя. Да и посмотрите, нужна ли задержка...
proton Дата: Пт, 15.07.2011, 10:30  |                                                                                                                Сообщение # 13
Группа: Пользователи
Ранг:  Новенький
Сообщений: 16
Репутация: 0   ±
Замечания:   ±
На сайте с 13.07.2011

Статус: Offline

mikhail09p БОЛЬШОЕ ВАМ СПАСИБО ЗА ПОМОЩЬ!!!!!!!!!!!!!!! Ура часы заработали!!!!!!!!!!! Теперь думаю как сделать таймер на два режима включения, например включаем нагрузку в 8 утра и выключаем в 9 утра, затем в 5 вечера и выключаем в 6 вечера. А не кто не знает почему часы в протеусе отстают......от реальных. А так же добавил к часам секунды
Сообщение отредактировал proton - Пт, 15.07.2011, 11:43
mikhail09p Дата: Пт, 15.07.2011, 13:25  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Отстают потому, что BIG = 1108292 ' Запишем в BIG
Это значение 1108292 для моего кварца Declare Xtal=4.433169
А Протеус не понимает (если не ошибаюсь) такого значения.
А если у Вас кварц на 4 Мгц, то в программе нужно указать Declare Xtal=4 и BIG =1000000 , тогда и в Протеусе будет тип-топ! smile

Сообщение отредактировал mikhail09p - Пт, 15.07.2011, 13:28
proton Дата: Пт, 15.07.2011, 15:47  |                                                                                                                Сообщение # 15
Группа: Пользователи
Ранг:  Новенький
Сообщений: 16
Репутация: 0   ±
Замечания:   ±
На сайте с 13.07.2011

Статус: Offline

Quote (mikhail09p)
Отстают потому, что BIG = 1108292 ' Запишем в BIG
Это значение 1108292 для моего кварца Declare Xtal=4.433169
А Протеус не понимает (если не ошибаюсь) такого значения.
А если у Вас кварц на 4 Мгц, то в программе нужно указать Declare Xtal=4 и BIG =1000000 , тогда и в Протеусе будет тип-топ!

Спасибо разобрался biggrin

Добавлено (15.07.2011, 15.47.15)
---------------------------------------------
KORR:
If PLUS=0 Then
Inc K
ElseIf MINUS=0 Then
Dec K
EndIf
Print At 1, 1, "Korekziya vremya"
Print At 2, 1, "K= ",SDec K," "
DelayMS 300
GoTo loop

этот кусочек программы для коррекции часов но он у меня неработает

Сообщение отредактировал proton - Пт, 15.07.2011, 18:00
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Часы с будильником
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: