Часы с будильником
|
|
proton |
Дата: Ср, 13.07.2011, 21:28 | Сообщение # 1 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
16
Замечания:
±
На сайте с 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
|
|
|
|
Andriy76 |
Дата: Ср, 13.07.2011, 22:04 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
231
Замечания:
±
На сайте с 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 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Нужно просто объявить массивы HOURr, MINUTESr и TEMPUST и не париться. Для чего они вообще нужны?
|
|
|
|
mikhail09p |
Дата: Чт, 14.07.2011, 13:27 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Это кусочек моей программы программируемого термостата. Нужно их объявить Dim TEMPUST[4] As Byte Dim HOURr[4] As Byte Dim MINUTESr[4] As Byte
Если они нужны... В часах они не нужны. Внимательней разбирайте чужие программы.
|
|
|
|
proton |
Дата: Чт, 14.07.2011, 16:37 | Сообщение # 5 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
16
Замечания:
±
На сайте с 13.07.2011
Статус:
Offline
|
Извиняюсь, что я взял образцы из чужой программы. Я просто новичок я конечно стараюсь сам все делать, но бывает такие вещи как таймер который немного сложен в понимании и приходится прибегать к чужим программам, что бы разобраться в его работе.
Сообщение отредактировал
proton - Чт, 14.07.2011, 16:38
|
|
|
|
mikhail09p |
Дата: Чт, 14.07.2011, 18:45 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Да на здоровье! Для того здесь и выкладывают программы, кусочки кода и т. д. Я наоборот рад, что мой труд кому-то помог ! Мы все тут учимся.
|
|
|
|
proton |
Дата: Чт, 14.07.2011, 18:49 | Сообщение # 7 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
16
Замечания:
±
На сайте с 13.07.2011
Статус:
Offline
|
Inc SECONDS 'Инкрементируем секунды _____________________ на этой строчке компилятор выдает ошибку
|
|
|
|
mikhail09p |
Дата: Чт, 14.07.2011, 19:04 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
У Вас есть в программе Dim SECONDS As Byte ; переменная для счета секунд ?
|
|
|
|
proton |
Дата: Чт, 14.07.2011, 19:12 | Сообщение # 9 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
16
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 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 ' Плюс температуры Внимательно посмотрите.
Если хотите - совет: Скопируйте ВСЮ программу, ВСЕ переменные и отредактируйте под свои нужды программу. Там неизбежно добавите ещё переменных или ещё чего. А только, как заработает более-менее как нужно, вычищайте понемногу лишнее. И доводите до ума. Ведь у выбраного пика памяти хватает для этого.
Сообщение отредактировал
mikhail09p - Чт, 14.07.2011, 19:49
|
|
|
|
proton |
Дата: Чт, 14.07.2011, 21:50 | Сообщение # 11 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
16
Замечания:
±
На сайте с 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 в протеусе заработало, но на кнопки реагирует неадекватно
|
|
|
|
mikhail09p |
Дата: Чт, 14.07.2011, 22:18 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 13.07.2011
Статус:
Offline
|
mikhail09p БОЛЬШОЕ ВАМ СПАСИБО ЗА ПОМОЩЬ!!!!!!!!!!!!!!! Ура часы заработали!!!!!!!!!!! Теперь думаю как сделать таймер на два режима включения, например включаем нагрузку в 8 утра и выключаем в 9 утра, затем в 5 вечера и выключаем в 6 вечера. А не кто не знает почему часы в протеусе отстают......от реальных. А так же добавил к часам секунды
Сообщение отредактировал
proton - Пт, 15.07.2011, 11:43
|
|
|
|
mikhail09p |
Дата: Пт, 15.07.2011, 13:25 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Отстают потому, что BIG = 1108292 ' Запишем в BIG Это значение 1108292 для моего кварца Declare Xtal=4.433169 А Протеус не понимает (если не ошибаюсь) такого значения. А если у Вас кварц на 4 Мгц, то в программе нужно указать Declare Xtal=4 и BIG =1000000 , тогда и в Протеусе будет тип-топ!
Сообщение отредактировал
mikhail09p - Пт, 15.07.2011, 13:28
|
|
|
|
proton |
Дата: Пт, 15.07.2011, 15:47 | Сообщение # 15 |
Группа:
Пользователи
Ранг:
Новенький
Сообщений:
16
Замечания:
±
На сайте с 13.07.2011
Статус:
Offline
|
Quote (mikhail09p) Отстают потому, что BIG = 1108292 ' Запишем в BIG Это значение 1108292 для моего кварца Declare Xtal=4.433169 А Протеус не понимает (если не ошибаюсь) такого значения. А если у Вас кварц на 4 Мгц, то в программе нужно указать Declare Xtal=4 и BIG =1000000 , тогда и в Протеусе будет тип-топ! Спасибо разобрался
Добавлено (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
|
|
|
|