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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Модератор форума: demanik, ivan_fd  
Подстройка таймера Т1
DAlexV Дата: Вс, 08.05.2011, 22:02  |                                                                                                                Сообщение # 16
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (mikhail09p)
А где смотреть это сАмое время А и время пробуждения? В даташит?

Боюсь что даташит не поможет. Так как барсик это уже компилятор. Есть вариант посмотреть скомпилированный ASM код и анализируя его попробовать вычислить(если конечно крыша не поедет от внешнего вида кода). Второй вариант это Осцилограф. Вставить после обновления значений таймера изменение состояния какого нибудь пина и играясь со значениями добиться нужного результата. Или загнать в Шпротеус, выставить точки останова и в нем подгонять. Последний вариант самый простой.

Успехов wink


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
mikhail09p Дата: Ср, 01.06.2011, 14:18  |                                                                                                                Сообщение # 17
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

С точностью разобрался. В программе создал переменную для младшего регистра Т1. TMR1L = KORR Изменяется как надо.
Проблема вылезла другая - во сне не всегда идёт отсчёт времени. Раз считает, раз нет...
Кварц менял, конденсаторы тоже. Напряжение резервное - 4.1 В.
Отчего бы?
Проэкт прилагается полностью.

Добавлено (01.06.2011, 14.18.32)
---------------------------------------------
Вроде разобрался! smile
Уменьшил SLEEP 0.1 и работает! Я так понял, при 4 сек сна не происходило проверки сек=60 и счёт шёл до 255, а это уже 4 мин. потерянных.

Прикрепления: 7940138.rar (147.3 Kb)

Сообщение отредактировал mikhail09p - Вт, 31.05.2011, 18:22
Alexej79 Дата: Чт, 30.06.2011, 23:30  |                                                                                                                Сообщение # 18
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 71
Репутация: 0   ±
Замечания:   ±
На сайте с 16.08.2010

Статус: Offline

Я тоже собираю часы на 16F628. Возник вопрос как работают установочные коэфициенты регистров TMR1Н и TMR1L ?
Посмотрел несколько примеров и тупо скопировал а принцип так мне и не понятен.
mikhail09p Дата: Вт, 05.07.2011, 23:07  |                                                                                                                Сообщение # 19
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Quote (Alexej79)
вопрос как работают установочные коэфициенты регистров TMR1Н и TMR1L ?

Поточнее вопрос. Что вы имеете ввиду?
Alexej79 Дата: Ср, 06.07.2011, 13:18  |                                                                                                                Сообщение # 20
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 71
Репутация: 0   ±
Замечания:   ±
На сайте с 16.08.2010

Статус: Offline

Попытаюсь куточнить вопрос.
Используя програму PIC Timer Calculator 0.9.2 Подсчитал что при раскладе что в PIC 16F628A используя внутренний кварц на 4 Мгц таймер 1 при коофиценте 1:8 переполнение таймера будет происходить каждые 0.5 сек. при неком числе (не знаю как правильно назвать) 3036.
При этом TMR1H = 189 a TMR1L = 220.
Вот сдесь не понятен момент как срабатывает переполнение таймера? При его запуске идёт отсчёт TMR1 Preload от нуля до 3036 после чего происходит переполнение и прерывание. После того как флаг сброшен начинается отсчёт сначала. Как указать в програме что отсчёт должен идти до 3036 то есть периуд пол секунды?
Или же TMR1H = 189 и TMR1L = 220 и есть это число 3036.
Тогда как я прочитал, в верхних постах, надо после каждого переполнения сбрасывать эти данные, но в примере было что не приравнивать эти коэфициенты к нулю а установить заного значение. Вот тут то мне и не совсем понятен процесс?
ADMIN Дата: Ср, 06.07.2011, 13:34  |                                                                                                                Сообщение # 21
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

1). При загрузке в TMR1 числа 3036 и запуске его на отсчет, счет идет именно с этого числа(а не до него) и до переполнения - а именно до 65536, после чего происходит прерывание по этому переполннению. Чтобы следующий интервал также был равен 0.5 сек, нужно в прерывании загрузить в таймер опять это значение, иначе он будет считать с нуля, поскольку после переполнения таймера (в 16-ричном формате - $FFFF) он не может дальше считать.
2). 3036 в десятичном формате - это в 16-ричном - TMR1H = $DC и TMR1H = $B, или в десятичном TMR1H = 220 и TMR1H = 11!
189 - непонятное число, откуда?
ЯНДЕКС Дата: 06.07.2011
Alexej79 Дата: Ср, 06.07.2011, 14:01  |                                                                                                                Сообщение # 22
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 71
Репутация: 0   ±
Замечания:   ±
На сайте с 16.08.2010

Статус: Offline

Quote (ADMIN)
189 - непонятное число, откуда?


Это показала программа калькулятор
Прикрепления: PIC_Timer_Calcu.exe (220.0 Kb)
ivan_fd Дата: Ср, 06.07.2011, 14:58  |                                                                                                                Сообщение # 23
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

При инициализации TMR1, записываете в него, для 500 мс,

TMR1H = $B
TMR1L =$DC

программа немного не верно написала ---->

TMR1H = $BD; ; preset for timer1 MSB register --- здесь не верно.
TMR1L = $DC; ; preset for timer1 LSB register

Теперь при каждом прерывании, сбрасываете флаг прерывания и записываете в TMR1 снова 3036.
Alexej79 Дата: Ср, 06.07.2011, 18:15  |                                                                                                                Сообщение # 24
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 71
Репутация: 0   ±
Замечания:   ±
На сайте с 16.08.2010

Статус: Offline

Чтоб записать в tmr1 3036 надо переменую tmr1 обозначить как tmr1h и tmr1l вместе, я так понимаю? Как это сделать?
И получается так что tmr1h и tmrql в суме (или вместе как это будет верно) дают число 3036?
ADMIN Дата: Ср, 06.07.2011, 18:37  |                                                                                                                Сообщение # 25
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Регистр TMR1 длиной в два байта, состоит из 8-битных регистров - TMR1L - первый(младший) регистр, и TMR1H - старший регистр. Соответственно , если TMR1 равен 3036 (или $BDC), то каждый из подрегистров принимает соответствующее значение - TMR1H=$B, TMR1L=$DC. В Picbasic, а также в Proton есть такая возможность - загружать число сразу в 16-разрядную переменную(или регистр). Или же можно присвоить каждому из подрегистров соответствующее значение.
Alexej79 Дата: Ср, 06.07.2011, 22:51  |                                                                                                                Сообщение # 26
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 71
Репутация: 0   ±
Замечания:   ±
На сайте с 16.08.2010

Статус: Offline

Уважаемый, ADMIN, а можно пожалуиста пример привести про возможность "загружать число сразу в 16-разрядную переменную(или регистр). Или же можно присвоить каждому из подрегистров соответствующее значение."
Что б мне было понятне как это реализовать.
Заране благодарен с уважением Alexej79
mikhail09p Дата: Ср, 06.07.2011, 23:16  |                                                                                                                Сообщение # 27
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Quote (ADMIN)
Или же можно присвоить каждому из подрегистров соответствующее значение.


Именно так я и поступил.
Dim HOUR As Byte ; для счета часов
Dim KORR As Byte ' коррекция

'-------------------------- Настройка TMR1 для прерываний --------------------
TMR1H = $7F; ; preset for timer1 MSB register
TMR1L = $FD; ; preset for timer1 LSB register 1 Гц

'-------------------------- Прерывания--------------------------

Int_Label:
Context Save
TMR1IF = 0
TMR1H = KORRh; ; preset for timer1 MSB register
TMR1L = KORR; ; preset for timer1 LSB register

Изменяю младший байт
Korecz:
tte = 0
If PORTB.0 = 0 Then
Inc KORR: Seca = 0
ElseIf PORTB.1 = 0 Then
Dec KORR: Seca = 0
EndIf

Это кусочки из моей программы часов.
Скачайте архив и запустите симуляцию в Протеусе - увидите, как изменяются значения переменных при настройке.
Из моим кварцем получилось - старший регистр 124, младший 240.
Но ещё немножко подстраиваю
Прикрепления: 2862989.rar (147.3 Kb)

Сообщение отредактировал mikhail09p - Ср, 06.07.2011, 23:19
ADMIN Дата: Чт, 07.07.2011, 16:21  |                                                                                                                Сообщение # 28
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

TMR1 = 3036
Alexej79 Дата: Чт, 07.07.2011, 18:11  |                                                                                                                Сообщение # 29
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 71
Репутация: 0   ±
Замечания:   ±
На сайте с 16.08.2010

Статус: Offline

Как я понял, то после срабатывания прерывания по переполнению таймера надо сбросить флаг и по новой прописать значения. Можно это сделать двумя способами
1)
TMR1H =$B
TMR1L=$ DC
2)
TMR1=3036
оба варианта есть правильные.
ADMIN Дата: Чт, 07.07.2011, 18:23  |                                                                                                                Сообщение # 30
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Да, но, как я указывал выше, если хочешь, чтобы таймер был точным, нужно в прерываниях в таймер загружать такое значение, чтобы с учетом потраченного на обработку прерывания времени, опять получился интервал в 0,5 сек(или сколько надо)
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск: