Организация обратного отсчета времени в чч:мм:сс
|
|
S_moke |
Дата: Пт, 20.07.2012, 12:04 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
17
Замечания:
±
На сайте с 16.08.2011
Статус:
Offline
|
Добрый день форумчане! Знающие (возможно уже сталкивающиеся с данной задачей) люди, помогите разложить произвольное число, например 7777 т.о. чтобы происходил обратный отсчет времени в формате остаток: чч:мм:сс. Имеется код прямого счета для 876А на TMR0:
Device = 16F876A Xtal = 4 Config CP_OFF, DEBUG_OFF, WRT_OFF, CPD_OFF, LVP_OFF, BODEN_On, PWRTE_ON, WDT_OFF, XT_OSC '-------------------------- Настройки подключения ЖКИ ------------------------ Declare LCD_Type ALPHA ' Тип ЖКИ - буквенно -цифровой Declare LCD_RSPin PORTC.2 ' Управление линией RS Declare LCD_ENPin PORTC.3 ' Управление линией E Declare LCD_DTPin PORTC.4 ' Порт данных ЖКИ Declare LCD_Interface 4 ' Разрядность шины данных Declare LCD_CommandUs 2000 ' Задержка перед посылкой команды Declare LCD_DataUs 50 ' Задержка перед посылкой данных Declare LCD_Lines 2 ' Количество строк ЖКИ Declare All_Digital = On ' Каждый порт выполняет свою функцию по умолчанию TRISA = %00000000 TRISB = %00001111 TRISC = %00000000 PORTA = %00000000 PORTB = %00000000 PORTC = %00000000 ADCON1 = %00000110 Symbol GIE = INTCON.7 ' Global Interrupt Enable Bit Symbol TMR0_uS = 256 ' Set time interval of TMR0 Symbol TMR0_Enable = INTCON.5 ' This option enables TMR0 interrupts Symbol TMR0_Overflow = INTCON.2 ' This is the TMR0 overflow flag Dim uS As Word Dim mS As Word Dim S As Byte Dim M As Byte Dim H As Byte Dim D As Word Dim SS As Word Dim Minute As Byte Dim Hourse As Byte
On_Interrupt Int_Sub GoTo Initialization Int_Sub: GIE = 0 If TMR0_Overflow = 1 And TMR0_Enable = 1 Then TMR0_Overflow = 0: uS = uS + TMR0_uS: EndIf If uS >= 1000 Then uS = 0: mS = mS + 1: EndIf If mS >= 962 Then mS = 0: S = S + 1: SS = SS + 1: EndIf If S >= 60 Then S = 0: M = M + 1: EndIf If SS >= 60 Then SS = 0: EndIf If M >= 60 Then M = 0: H = H + 1: EndIf If H >= 24 Then H = 0: D = D + 1: EndIf GIE = 1 Context Restore Initialization: TMR0_Enable = 0 ' Disable TMR0 interrupts S = 0 'Clear timer registers OPTION_REG.0 = 0 '000 - 1 : 2 OPTION_REG.1 = 0 ' OPTION_REG.2 = 0 OPTION_REG.5 = 0 ' Select Internal Clock Source TMR0 = 0 ' Clear the TMR0 register TMR0_Enable = 1 ' Enable TMR0 Interrupts GIE = 1 ' Enable Global Interrupts
Main: Cls
obr:
GoTo obr
Сообщение отредактировал
S_moke - Пт, 20.07.2012, 12:05
|
|
|
|
Broka |
Дата: Пт, 20.07.2012, 19:17 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
253
Замечания:
±
На сайте с 30.09.2009
Статус:
Offline
|
On_Interrupt Int_Sub GoTo Initialization Int_Sub: GIE = 0 If TMR0_Overflow = 1 And TMR0_Enable = 1 Then TMR0_Overflow = 0: uS = uS + TMR0_uS: EndIf If uS >= 1000 Then uS = 0: mS = mS + 1: EndIf If mS >= 962 Then mS = 0: S = S + 1: SS = SS + 1: EndIf` If S >= 60 Then S = 0: M = M + 1: EndIf If SS >= 60 Then SS = 0: EndIf If M >= 60 Then M = 0: H = H + 1: EndIf If H >= 24 Then H = 0: D = D + 1: EndIf GIE = 1 Context Restore
У меня вопрос ... почему в 7 строке If mS >= 962 then mS = 0:Inc S:Inc SS:Endif стоит число 962, почему не 1000? Желательно описать все переменные, какая и для чего ..., так проще будет для всех!
Наладчик КИП и А
Сообщение отредактировал
Broka - Пт, 20.07.2012, 19:20
|
|
|
|
S_moke |
Дата: Пн, 23.07.2012, 11:07 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
17
Замечания:
±
На сайте с 16.08.2011
Статус:
Offline
|
962 стоит потому, что в реальном устройстве была недопустимая для устройства спешка по времени. Путем подгона константы удалось определить ее на уровне 962
|
|
|
|
DAlexV |
Дата: Вт, 24.07.2012, 12:05 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (S_moke) люди, помогите разложить произвольное число, например 7777 т.о. чтобы происходил обратный отсчет времени в формате остаток: чч:мм:сс. До кучи добавил еще дни. Все в архиве. Quote (Broka) У меня вопрос ... почему в 7 строке If mS >= 962 then mS = 0:Inc S:Inc SS:Endif стоит число 962, почему не 1000? Quote (S_moke) 962 стоит потому, что в реальном устройстве была недопустимая для устройства спешка по времени. Путем подгона константы удалось определить ее на уровне 962 А не проще четко выставить прерывание ???? Вот исходник. Сколько раз про это твержу, ни кто не слышит. В прерывании все по минимуму. А если еще кучу условий проверять, и счетом заниматься (так и будем в прерывании крутиться)
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
S_moke |
Дата: Пт, 10.08.2012, 15:25 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
17
Замечания:
±
На сайте с 16.08.2011
Статус:
Offline
|
Спасибо, DAlexV, совет помог и все получилось
|
|
|
|
DAlexV |
Дата: Сб, 11.08.2012, 11:40 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (S_moke) совет помог и все получилось Позвольте полюбопытствовать, что помогло ???? Quote (DAlexV) четко выставить прерывание ????
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|