Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » совтовые часы сбрасываются на ноль. Почему?


совтовые часы сбрасываются на ноль. Почему?

Сообщений 61 страница 72 из 72

61

demon1, спасибо, но как раз из этих часов я и делаю часы на 1307.
max, зачем что то убирать из того кода более сложного для меня, если можно поправить этот. я просто прошу помощи.
p.s. если закоментировать чтение с ds1307 (хотя вроде там все верно), то почти работает. иначе такое ощущение, что очень быстро цифры перебирает.

0

62

Я не могу понять одного: зачем изобретать колесо, если его уже изобрели? Возьмите готовый и рабочий исходник(кстати он хорошо прокомментирован), уберите лишнее и в путь. Если возникнут вопросы - задавайте, только уже здесь. Автор и тех и этих часов один - Pasha.

Отредактировано max (2013-03-13 22:11:13)

0

63

Всем спасибо, разобрался! проблема была в записи при обработке нажатий кнопок.

Код:
Minuti:                                                     'При нажатии кнопки «минуты» обнуляем секунды и увеличиваем переменную _min на 1
Incr Mine
Seco = 00
If Mine = 60 Then Mine = 00

Seco = Makebcd(seco) : Mine = Makebcd(mine) : Hour = Makebcd(hour)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' starting address in 1307
  I2cwbyte Seco                                             ' Send Data to SECONDS
  I2cwbyte Mine                                             ' MINUTES
  I2cwbyte Hour                                             ' Hours
  I2cstop

Return

Chasi:                                                      'Тоже, что с минутами
Incr Hour
Seco = 00
If Hour > 23 Then Hour = 00

Seco = Makebcd(seco) : Mine = Makebcd(mine) : Hour = Makebcd(hour)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' starting address in 1307
  I2cwbyte Seco                                             ' Send Data to SECONDS
  I2cwbyte Mine                                             ' MINUTES
  I2cwbyte Hour                                             ' Hours
  I2cstop                                                   ' закончили работать с I2C

Return

0

64

demon1 написал(а):

ребята мне лично, нравиться простота этих часов, тока блин точка нужна....а термометры и будильники уже у всех есть.... если можете то помогите  с прошивой, например Skull большое ему спосибо человек хоть пытаеться помочь за это ему ещё раз большое спасибо...

Очень частый вопрос. Мигающие точки не ставил в связи со следующим: поскольку схема питается через резистор, то во время загорания точек падение напряжение на резисторе увеличивается и яркость цифр соответственно уменьшается. По итогу цифры мигают, что не приятно глазу.

Для мигания точек попробуйте следующее (в железе не проверялось):

Код:
' Пример часов которые отображают часы и минуты на семисегментном
' четырехсимвольном светодиодном индикаторе с общим минусом
' прога для ознакомления, работает 100%
' выставленные фюзы (в понипроге стоят галки на):CKOPT,BOOTSZ1,BOOTSZ0,SUT1,SUT0,CKSEL3,CKSEL1,CKSEL0
' Кварц выдрал из маленького тетриса с часами, думаю также подойдет из любых кварцевых наручных/настенных часов
'насчет точности - терпения больше 2х дней не хватило, идут точно, секунда в секунду.
'e-mail P-a-h-a@yandex.ru
$regfile = "m8def.dat"                                      ' мега8
$crystal = 8000000
Config Portb = Output , Portd = Output : Portc = &H30
Dim I As Byte , X As Byte , Cifri(4) As Byte , Tochka As Byte       'задаем всякие переменные и масивы      '
Config Clock = Soft                                         ' конфигурируем совтовые часы
     Config Timer0 = Timer , Prescale = 8 : On Timer0 Pulse : Enable Timer0       ' конфигурируем таймер 0 чтоб потом на него повесить алгоритм отображения цифр ' назначаем подпрограмму, которая будет запускатся по переполнению 1го таймера
     Config Timer1 = Counter , Edge = Falling , Prescale = 1 : Enable Interrupts       ' конфигурируем таймер 1 на подсчет импульсов на кварце, припаянного к Xtal1 Xtal2 на 32768 гц БЕЗ КОНДЕРОВ!
 Do                                                         ' начало основного цикла
If Pinc.4 = 0 Then
Do
 Incr _min : _sec = 00
 If _min > 59 Then : _min = 00 : Incr _hour : End If
 If _hour > 23 Then _hour = 00 : Waitms 100
Loop Until Pinc.4 = 1
End If
If Pinc.5 = 0 Then
    Do
   Incr _hour : If _hour > 23 Then _hour = 00 : Waitms 100
    Loop Until Pinc.5 = 1
End If
  Loop                                                      'конец основного цикла
Pulse:                                                      ' подпрограмма прерываний таймера0
Cifri(1) = _min Mod 10 : Cifri(2) = _min / 10 : Cifri(3) = _hour Mod 10 : Cifri(4) = _hour / 10 : Tochka = _sec Mod 2
Portb = &HFF
Incr X : If X > 3 Then X = 0
Portd = Lookup(cifri(x + 1) , Dta)
If Tochka <> 0 Then Reset Portd.2 Else Set Portd.2
Reset Portb.x
Return                                                      '  возвращаемся на место откуда прервали программу
       Dta:                                                 '  таблица с данными о цифрах зажигает по порядку : 0123456789
       Data &HEF , &H8C , &HB7 , &HBE , &HDC , &H7E , &H7F , &HAC , &HFF , &HFE

HEX:

Код:
:1000000012C01895189518954CC118951895189503
:1000100018957BC0189518951895189518951895EA
:100020001895189518958FE58DBFC8E3E0E24E2E20
:1000300084E08EBFD4E0F4E05F2EA89584B7082E4C
:10004000877F84BF88E1992781BD91BDEEEFF3E002
:10005000A0E6B0E088278D933197E9F766248FEF0B
:1000600087BB8FEF81BB80E385BB88E082BD85E0E5
:1000700085BD89B7806489BF82E083BF89B781600D
:1000800089BF80E08FBD87E08EBD78949C9926C0A3
:10009000A8E6B0E08C918F5F8C9380E0809367003E
:1000A000009168000B3310F009F001C008C080E037
:1000B00080936800A9E6B0E08C918F5F8C930091EB
:1000C0006900073110F009F001C003C080E080939F
:1000D000690084E690E0B3D09C9BDACF9D9914C070
:1000E000A9E6B0E08C918F5F8C9300916900073195
:1000F00010F009F001C003C080E08093690084E63D
:1001000090E09DD09D9BECCFC1CF0F921F922F927C
:100110003F924F925F927F92AF92BF920F931F9345
:100120002F933F934F935F936F937F938F939F93FF
:10013000AF93BF93CF93DF93EF93FF938FB78F93DB
:10014000009168004AE001D1A2E6B0E08C930091F2
:1001500068004AE0FAD0A3E6B0E00C930091690091
:100160004AE0F3D0A4E6B0E08C93009169004AE045
:10017000ECD0A5E6B0E00C930091670042E0E5D03A
:10018000A6E6B0E08C938FEF88BBA1E6B0E08C913F
:100190008F5F8C9300916100033010F009F001C073
:1001A00003C080E080936100E2E2F2E0A1E6B0E00B
:1001B000AD90BB24A2E6B0E0AA0DBB1D8C9199279F
:1001C000A2E3B0E05BD000916600003009F402C009
:1001D000929801C0929AA1E6B0E08C91A8E3B0E0B9
:1001E0005AD04FD08C9189238C938F918FBFFF91E0
:1001F000EF91DF91CF91BF91AF919F918F917F91BF
:100200006F915F914F913F912F911F910F91BF90EF
:10021000AF907F905F904F903F902F901F900F90E6
:100220001895EF8CB7BEDC7E7FACFFFE3197F1F7FF
:100230000895689462F80895E89462F80895EF9339
:10024000FF93EE27E82BE92B31F0E0EDF7E0319753
:10025000F1F70197D1F7FF91EF910895C895319685
:100260000020089591E005C092E003C094E001C031
:1002700098E0F4DF0D929A95E1F70895E80FF91FE1
:10028000F1CF91E0882321F08894991F8A95E9F7AE
:10029000892F90950895883018F011968850FBCFDB
:1002A0000895AF93BF930F939F938F938FB78F93BF
:1002B000A7E6B0E08C9183958D938C3309F03DC017
:1002C00088278E9311968C9183958D938C3309F0AA
:1002D00034C088278E9311968C9183958D938831A5
:1002E00061F588278E9311968C9183958D939C91BF
:1002F0000EE1943089F0963079F0993069F09B30B6
:1003000059F00CE1923039F411969C911197937049
:1003100019F4039501C00FE1801778F071F081E0C6
:100320008E9311968C9183958D938D3031F481E06D
:100330008E9311968C9183958C938F918FBF8F9113
:100340009F910F91BF91AF911895FF93881BF9E092
:10035000001FFA9511F4FF910895881F841B18F46B
:0A036000840F8894F5CF0894F3CFC2
:00000001FF

Отредактировано Pasha (2013-10-06 17:58:55)

0

65

Вы указали компилятору, что регистры будете сохранять и восстанавливать сами  (On Timer2 Обработка_прерывания_timer2 Nosave )

Так почему этого не делаете?

Фрагмент

' Подпрограмма обработки прерывания TIMER2, происходит 1 или 2 раза в секунду, в зависимости от настроек TIMER2
  Обработка_прерывания_timer2:
'-------------------------------------------------------------------------------

Incr Секунды : If Секунды > 59 Then : Секунды = 0 : Incr Минуты : If Минуты > 59 Then : Минуты = 0 : Incr Часы : If Часы > 23 Then Часы = 0 : End If : End If

'----  Сохраняем регистры, которые используем в обработке прерывания

      !Push R31                                             ' Сохраняем регистры, которые используем в обработке прерывания
      !In R31 , Sreg
      !Push R31

'------------------  Считаем количество прерываний TIMER2  ---------------------

      !Lds R31 , {счетчик_прерываний_timer2}                ' Считываем значение переменной "Счетчик_прерываний_timer2" в регистр "R31", для последующих операций
      !Inc R31                                              ' Увеличиваем значение переменной в регистре "R31"
      !sts {счетчик_прерываний_timer2} , R31                ' Пишем значение из регистра "R31" в переменную "Счетчик_прерываний_timer2"

'------------------

      !Andi R31 , 1                                         ' Сравниваем полученное значение с значением "Const количество_срабатываний_timer2"

'------------------

      !Breq Выход_прерывание_timer2                         ' Если полученное значение меньше значениея "Const количество_срабатываний_timer2", уходим на метку "Выход_прерывание_timer2" -- иначе
      !clr R31                                     ' Если полученное значение равно значениию "Const количество_срабатываний_timer2", пишем "0" в регистр "R31
      !sts {счетчик_прерываний_timer2} , R31                ' Заносим значение из регистра "R31" в переменную "Счетчик_прерываний_timer2" и переходим к подпрограмме расчета времени

'--------  Подпрограммы обрабатываемые по 2 срабатыванию TIMER2  ---------------

      !ldi R31 , 1
      !sts {Флаг_обновить_данные_времени} , R31             ' Поднимаем флажок, что надо обновить время

'---------------  Восстанавливаем ранее сохраненные регистры  ------------------

     Выход_прерывание_timer2:
      !Pop R31
      !Out Sreg , R31                                       ' Восстанавливаем регистры
      !Pop R31

'-------------------------------------------------------------------------------
  Return

Попробуйте этот вариант

$map
$regfile = "m8def.dat"                                      ' мега8
$crystal = 1000000                                          ' частота кристала 1 мегагерц
Config Portb = Output , Portd = Output : Portc = &HF7       ' конфигурируем порты на ввод и выввод, подтягиваем входные лапы к + питания внутренними резисторами, кроме С.3 для детектирования сетевого блока питания
Dim I As Byte , X As Byte , Cifri(4) As Byte , Charge As Bit       'задаем всякие переменные и масивы
Config Timer2 = Timer , Async = On , Prescale = 128 : On Timer2 Обработка_прерывания_timer2 Nosave       ' Делитель 32768 / 128 / 256 = 1 сек (прерывание TIMER2 = 1 раз в секунду)
Config Timer0 = Timer , Prescale = 8 : On Timer0 Pulse      ' конфигурируем таймер 0 чтоб потом на него повесить алгоритм отображения цифр ' назначаем подпрограмму, которая будет запускатся по переполнению 1го таймера

'---------------  Настройка пониженного энергопотребления МК  ------------------
  Assr.3 = 1 : Waitms 100                                   ' Включить НЧ-генератор AS2 и подождать стабилизации амплитуды генератора
  Mcucr = &B10110000                                        ' Разрешаем режим пониженного энергопотребления  Power Save
  Dim Часы As Byte , Минуты As Byte , Секунды As Byte , Счетчик_прерываний_timer2 As Byte , Флаг_обновить_данные_времени As Byte , Флаг_sleeps As Bit , Флаг_battery As Bit
Enable Timer0 : Enable Timer2 : Enable Interrupts          'разрешаем прерывания

Nachalo:
Do
If Pinc.4 = 0 Then                                          'если нажата кнопка "Минуты"
Waitms 500                                                  ' ждем пол секунды а вдруг вторую кнопку нажмут
If Pinc.5 = 0 Then Goto Sleeps                              'если сначала нажата кнопка "минуты" и в течении 0,5 сек "часы" то идем в режим работы от батареек с выключенным дисплеем
Do
Incr Минуты : Секунды = 00                                 ' Ну А Когда Кнопку С "часы не нажали увеличиваем минуты на 1, секунды сбрасываем на 00"
If Минуты > 59 Then : Минуты = 00 : Incr Часы : End If     'если минуты достигли 60 то сбрасываем их на 00 и прибавляем к часам 1 час
If Часы > 23 Then Часы = 00 : Waitms 100                   ' если часы достигли 24 то сбрасываем их к 00
Loop Until Pinc.4 = 1                                       ' повторяем добавление минут пока не отпустят кнопку "Минуты"
End If
If Pinc.5 = 0 Then                                          ' Если нажата кнопка часы то
Waitms 500                                                  ' ждем а не нажмут ли кнопку "минуты"
If Pinc.4 = 0 Then : Set Charge : Goto Battery : End If     'если сначала нажата кнопка "часыы" и в течении 0,5 сек "минуты" то выставляем или убираем флаг и идем в режим работы от батареек с выключенным дисплеем и ждем пока дадут электричество чтоб вернутся в основной цикл
    Do
   Incr Часы : If Часы > 23 Then Часы = 00 : Waitms 100     ' увеличиваем часы на 1, если часы достигли 24 то сбрасываем их на 00
    Loop Until Pinc.5 = 1
End If
If Pinc.3 = 0 And Charge = 1 Then Goto Battery              ' если включен режим ожидания напряжения от блока питания и часы работают от батареи то идем в режим работы от батареек с выключенным дисплеем и ждем пока дадут электричество чтоб вернутся в основной цикл
Idle
Loop

Pulse:                                                     ' подпрограмма прерываний таймера0 для работы с семисегментником
Cifri(1) = Минуты Mod 10 : Cifri(2) = Минуты / 10 : Cifri(3) = Часы Mod 10 : Cifri(4) = Часы / 10       ' расчитываем число каждого сегмента. например сейчас 08:56 последний сегмент = остаток от деления минут на 10 (56/10=6) предпоследний сегмент = минуты разделить на 10, а поскольку переменные целые то десятые исчезают в небытиё 56/10=5. С часами тоже самое остаток от 08/10 = 8. и просто разделить 08/10=0  таким образом получаем масив из 6,5,8,0 т.е. наоборот
Portb = &HFF                                                ' Гасим все индикаторы
Incr X : If X > 3 Then X = 0                                ' При каждом срабатывании таймера выбираем какой сегмент будем показывать от 0,1,2,3
Portd = Lookup(cifri(x + 1) , Dta)                          'таблица DTA начинает считатся с первой ячейки. А поскольку значение времени может быть 0 то прибавляем единицу. Х сейчас равен 1 поэтому берем масив Х+1 т.е cifri(2). Выше мы считали что Cifri(2) = _min / 10 и это = 5 а поскольку тут мы прибавили 1 то берем шестой элемент таблицы DTA который выведет на семисегментник цифру 5. (когда дойдем до часов и нужно будет отобразить 0 (Cifri(4) = _hour / 10) то выберется элемент таблицы с порядковым номером 0+1=1 т.е первый элемент &HEF.
'If X = 2 Then Set Portd.2 Else Reset Portd.2                'включаем точку на втором сегменте для моего индикатора нужно закоментировать
Reset Portb.x                                               'поскольку индикатор у меня подключен с общим минусом то выше мы его погасили подав на все общие провода плюс ( логическую единицу в строкеPortb = &HFF) теперь мы зажигаем сегмент с порядковым номером Х который сейчас равен 1
Return                                                      '  возвращаемся на место откуда прервали программу
       Dta:                                                 '  таблица с данными о цифрах зажигает по порядку : 0123456789. Порядковый номер столбцов таблицы начинается с 1... т.е 1,2,3,4,5,6,7,8,9,10
       Data &HEF , &H8C , &HB7 , &HBE , &HDC , &H7E , &H7F , &HAC , &HFF , &HFE
'               0      1      2      3     4       5     6      7      8      9 то что отображается на семисегментнике

Sleeps:
'Set Флаг_sleeps                                            'программа режима работы от батареек
Stop Timer0 : Timer0 = 0 : Portb = 0 : Portd = 0 : Wait 2  ' отключаем индикатор, ждем 2 секунды чтоб успеть отпустить кнопки
  Do                                                        'Начало бесконечного цикла этого режима
  If Pinc.4 = 0 Then : Start Timer0 : Wait 2 : Stop Timer0 : End If       ' при нажатой кнопке "минуты" включаем индикатор и отображаем текущее время
  If Pinc.4 = 1 Then : Stop Timer0 : Timer0 = 0 : Portb = 0 : Portd = 0 : End If       ' если кнопку отпустили то отключаем индикатор путем остановки таймера и отключения питания семисегментника
  If Pinc.5 = 0 Then : Start Timer0 : Wait 2 : Goto Nachalo : End If       ' Если Нажали Кнопку "Часы то включаем индикатор, ждем 2 секунды чтобы успеть отпустить кнопку и возвращаемся в основной цикл где индикатор всегда горит и можно настроить время."
  Power Powersave                                           ' погружаемся в сон для уменьшения энергопотребления
  Loop                                                      'конец бесконечного цикла
Return

Battery:                                                    ' программа работы при пропадании сетевого питания. В ней гасятся индикаторы и она ждет появления питания
Stop Timer0 : Timer0 = 0 : Portb = 0 : Portd = 0 : Wait 2  ' отключаем индикатор, ждем 2 секунды чтоб успеть отпустить кнопки
  Do
  If Pinc.4 = 0 Then : Start Timer0 : Wait 2 : Stop Timer0 : End If       ' при нажатой кнопке "минуты" включаем индикатор и отображаем текущее время
  If Pinc.4 = 1 Then : Stop Timer0 : Timer0 = 0 : Portb = 0 : Portd = 0 : End If       ' если кнопку отпустили то отключаем индикатор
  If Pinc.3 = 1 Then : Start Timer0 : Wait 2 : Goto Nachalo : End If ' Если Нажали Кнопку "Часы" Или Появилось Питание На Pinc.3 То Включаем Индикатор , Ждем 2 Секунды Чтобы Успеть Отпустить Кнопку И Возвращаемся В Основной Цикл Где Индикатор Всегда Горит И Можно Настроить Время. "
  If Pinc.5 = 0 Then : Start Timer0 : Reset Charge : Wait 2 : Goto Nachalo : End If
  Power Powersave                                           ' погружаемся в сон для уменьшения энергопотребления
  Loop
Return

' Подпрограмма обработки прерывания TIMER2, происходит 1 или 2 раза в секунду, в зависимости от настроек TIMER2
  Обработка_прерывания_timer2:
'-------------------------------------------------------------------------------

    Pushall

    Incr Секунды : If Секунды > 59 Then : Секунды = 0 : Incr Минуты : If Минуты > 59 Then : Минуты = 0 : Incr Часы : If Часы > 23 Then Часы = 0 : End If : End If

    Incr Счетчик_прерываний_timer2

    If Счетчик_прерываний_timer2 < 1 Then
        Goto Выход_прерывание_timer2
    End If

    Счетчик_прерываний_timer2 = 0
    Флаг_обновить_данные_времени = 1

     Выход_прерывание_timer2:

   Popall

'-------------------------------------------------------------------------------
  Return

Отредактировано sasha_1973 (2016-01-25 20:27:31)

+1

66

Уменьшение потребления МК

+1

67

Ув. форумчане не могу сделать корректировку времени. Мне нужно корректировать к примеру - 0,2 секунды в сутки.
Условия: часы тикают от внешнего часового кварца 32768 Гц. Часы настроенны софтово командой:
config clock=soft Эта команда автоматом настраивает таймер2 на асинхронный режим и подсчет внешних импульсов также сама созает переменные и инкреминирует их _sec, _min ... и т.д Причем это все от пользователя скрыто в в этой команде. Пользователю остается припаять часовой кварц и пользоваться переменными например print _sec
Теперь в час ночи мне нужно откорректировать часы на -0,2 сек
Вот что я придумал:

1. Проверяем что наступил новый день и что сейчас час ночи (сравниваем переменную с текущим днем месяца...)
2. Останавливаем таймер 2
3.ждем 0,8 секунд
4. Запускаем таймер 2
5.увеличиваем _sec на единицу
6. Присваиваем переменной нового дня текущий день месяца.
Но беда алгоритма в том что он неточный, т.к ждем мы 0,8 секунд которые считаются внутренним RC генератором с нестабильной частотой. В случае "Идеального" генератора тоже будет неточность т.к я понимаю остановка и старт таймера тоже требуют времени.

Вот теперь момент в котором не соображу:
Делитель кварца на втором таймере 32768ГЦ  / 128 (делитель таймера) / 256 (отсчетов таймера до срабатываеия прерывания) и того прерывание 1 раз в секунду.
Таким образом 256 отсчетов таймер делает за 1 сек.
0,1 сек = 25,6 отсчетов. Хреново.
Целое число выходит только при корректировке в пол секунды 0,5 сек = 128 отсчетов.
Таким образом добавив Timer2=Timer2+26 отсчетов я скорректирую время не на 0,1 сек а на 0,1015625 сек т.е с погрешностью +1,5 %.
Вопрос, может ли сработать прерывание или инкременироваться таймер2 в момент выполнения команды Timer2=Timer2+26 в основном цикле программы? Ведь таймер то у нас в асинхронном режиме! Опять таки если таймер остановить то задержка будет при выполнении корректировки.

Еще момент будет ли работать вот такая корректировка на +0,5 сек:
do ' основной цикл (таймер тикает)
if Timer2 >= 128 Then incr_sec
Timer2=Timer2+128 ' что произойдет в случае если таймер равен к примеру 200? Он станет равным 73 или 72 или 0 или 255?
loop

В общем главный вопрос как прецизионно скоректировать совтовые часы на 0,1 сек?

Добавлено: Только что осенило как можно сделать более точную корректировку:
1. Спрашиваем у юзера как часто делать корректировку.
2. Юзер выставляет к примеру +1с кждые 10 дней.
Таким образом точность 0,1 секунда в сутки. Если юзер выставит +1сек раз в 100 дней то точность будет 0,01 секунда в сутки, но на 99 день часы уйдут в минус 0,99 Секунд а на сотый снова будут идти точно.

Отредактировано Pasha (2016-01-28 21:54:49)

0

68

sasha_1973 скажи пожалуйста о следующем коде:

Код:
$regfile = "m8def.dat"       ' Используемый контроллер
$crystal = 1000000
Mcucr = &B10110000       ' Разрешаем режим пониженного энергопотребления  Power Save
config clock = soft 'таймер2 считает тики часового кварца в асинхронном режиме
dim i as byte, y as byte

Do
Incr i
Power Powersave 'глубоко спим
incr y
loop

Девайс некоторое время работает и в данный момент спит выполнив команду Power Powersave.
Теперь срабатывает прерывание таймера 2 и мы сделаем incr y потом incr i и уснем. так?

Отредактировано Pasha (2016-01-28 22:16:25)

0

69

Pasha написал(а):

Теперь срабатывает прерывание таймера 2 и мы сделаем incr y потом incr i и уснем. так?

И не проснёмся!

Прерывания сами не включатся!

Enable Interrupts  -  перед  Do -- Loop

0

70

sasha_1973 написал(а):

Прерывания сами не включатся!

Ничего не пойму. Тогда как это работает в железе? Кнопки опрашиваются нормально, правда с небольшой задержкой. Мне интересно в каком месте продолжается программа после прерывания таймер2, а в железе она продолжается.

Код:
Sleeps:
  Do                                                        'Начало бесконечного цикла этого режима
  If Pinc.4 = 0 Then : Start Timer0 : Wait 2 : Stop Timer0 : End If       ' при нажатой кнопке "минуты" включаем индикатор и отображаем текущее время
  If Pinc.4 = 1 Then : Stop Timer0 : Timer0 = 0 : Portb = 0 : Portd = 0 : End If       ' если кнопку отпустили то отключаем индикатор путем остановки таймера и отключения питания семисегментника
  If Pinc.5 = 0 Then : Start Timer0 : Wait 2 : Goto Nachalo : End If       ' Если Нажали Кнопку "Часы то включаем индикатор, ждем 2 секунды чтобы успеть отпустить кнопку и возвращаемся в основной цикл где индикатор всегда горит и можно настроить время."
  Power Powersave                                           ' погружаемся в сон для уменьшения энергопотребления
  Loop                                                      'конец бесконечного цикла
Return

Как я понимаю, после пробуждения мы попадаем на loop.
Обработчика других таймеров нет. Он спрятан в config clock = soft. Никакие другие прерывания кроме таймера 0, а он в этом цикле остановлен не задействованы.

Отредактировано Pasha (2016-01-30 06:23:42)

0

71

Pasha написал(а):

config clock = soft


используется TIMER2, что-бы заработало, надо включить прерывания

Pasha написал(а):

$regfile = "m8def.dat"       ' Используемый контроллер
$crystal = 1000000
Mcucr = &B10110000       ' Разрешаем режим пониженного энергопотребления  Power Save
config clock = soft 'таймер2 считает тики часового кварца в асинхронном режиме
dim i as byte, y as byte

Do
Incr i
Power Powersave 'глубоко спим
incr y
loop


Где тут кнопки?

0

72

Понял, сонный просто. Enable interrupts ты имел ввиду. да, забыл я их тут прописать.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » совтовые часы сбрасываются на ноль. Почему?