Подстройка таймера Т1
|
|
DAlexV |
Дата: Вс, 08.05.2011, 22:02 | Сообщение # 16 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (mikhail09p) А где смотреть это сАмое время А и время пробуждения? В даташит? Боюсь что даташит не поможет. Так как барсик это уже компилятор. Есть вариант посмотреть скомпилированный ASM код и анализируя его попробовать вычислить(если конечно крыша не поедет от внешнего вида кода). Второй вариант это Осцилограф. Вставить после обновления значений таймера изменение состояния какого нибудь пина и играясь со значениями добиться нужного результата. Или загнать в Шпротеус, выставить точки останова и в нем подгонять. Последний вариант самый простой. Успехов
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
mikhail09p |
Дата: Ср, 01.06.2011, 14:18 | Сообщение # 17 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
С точностью разобрался. В программе создал переменную для младшего регистра Т1. TMR1L = KORR Изменяется как надо. Проблема вылезла другая - во сне не всегда идёт отсчёт времени. Раз считает, раз нет... Кварц менял, конденсаторы тоже. Напряжение резервное - 4.1 В. Отчего бы? Проэкт прилагается полностью.Добавлено (01.06.2011, 14.18.32) --------------------------------------------- Вроде разобрался! Уменьшил SLEEP 0.1 и работает! Я так понял, при 4 сек сна не происходило проверки сек=60 и счёт шёл до 255, а это уже 4 мин. потерянных.
Сообщение отредактировал
mikhail09p - Вт, 31.05.2011, 18:22
|
|
|
|
Alexej79 |
Дата: Чт, 30.06.2011, 23:30 | Сообщение # 18 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
71
Замечания:
±
На сайте с 16.08.2010
Статус:
Offline
|
Я тоже собираю часы на 16F628. Возник вопрос как работают установочные коэфициенты регистров TMR1Н и TMR1L ? Посмотрел несколько примеров и тупо скопировал а принцип так мне и не понятен.
|
|
|
|
mikhail09p |
Дата: Вт, 05.07.2011, 23:07 | Сообщение # 19 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Quote (Alexej79) вопрос как работают установочные коэфициенты регистров TMR1Н и TMR1L ? Поточнее вопрос. Что вы имеете ввиду?
|
|
|
|
Alexej79 |
Дата: Ср, 06.07.2011, 13:18 | Сообщение # 20 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
71
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
1). При загрузке в TMR1 числа 3036 и запуске его на отсчет, счет идет именно с этого числа(а не до него) и до переполнения - а именно до 65536, после чего происходит прерывание по этому переполннению. Чтобы следующий интервал также был равен 0.5 сек, нужно в прерывании загрузить в таймер опять это значение, иначе он будет считать с нуля, поскольку после переполнения таймера (в 16-ричном формате - $FFFF) он не может дальше считать. 2). 3036 в десятичном формате - это в 16-ричном - TMR1H = $DC и TMR1H = $B, или в десятичном TMR1H = 220 и TMR1H = 11! 189 - непонятное число, откуда?
|
|
|
|
Alexej79 |
Дата: Ср, 06.07.2011, 14:01 | Сообщение # 22 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
71
Замечания:
±
На сайте с 16.08.2010
Статус:
Offline
|
Quote (ADMIN) 189 - непонятное число, откуда?
Это показала программа калькулятор
|
|
|
|
ivan_fd |
Дата: Ср, 06.07.2011, 14:58 | Сообщение # 23 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 16.08.2010
Статус:
Offline
|
Чтоб записать в tmr1 3036 надо переменую tmr1 обозначить как tmr1h и tmr1l вместе, я так понимаю? Как это сделать? И получается так что tmr1h и tmrql в суме (или вместе как это будет верно) дают число 3036?
|
|
|
|
ADMIN |
Дата: Ср, 06.07.2011, 18:37 | Сообщение # 25 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 16.08.2010
Статус:
Offline
|
Уважаемый, ADMIN, а можно пожалуиста пример привести про возможность "загружать число сразу в 16-разрядную переменную(или регистр). Или же можно присвоить каждому из подрегистров соответствующее значение." Что б мне было понятне как это реализовать. Заране благодарен с уважением Alexej79
|
|
|
|
mikhail09p |
Дата: Ср, 06.07.2011, 23:16 | Сообщение # 27 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 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. Но ещё немножко подстраиваю
Сообщение отредактировал
mikhail09p - Ср, 06.07.2011, 23:19
|
|
|
|
ADMIN |
Дата: Чт, 07.07.2011, 16:21 | Сообщение # 28 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
TMR1 = 3036
|
|
|
|
Alexej79 |
Дата: Чт, 07.07.2011, 18:11 | Сообщение # 29 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
71
Замечания:
±
На сайте с 16.08.2010
Статус:
Offline
|
Как я понял, то после срабатывания прерывания по переполнению таймера надо сбросить флаг и по новой прописать значения. Можно это сделать двумя способами 1) TMR1H =$B TMR1L=$ DC 2) TMR1=3036 оба варианта есть правильные.
|
|
|
|
ADMIN |
Дата: Чт, 07.07.2011, 18:23 | Сообщение # 30 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Да, но, как я указывал выше, если хочешь, чтобы таймер был точным, нужно в прерываниях в таймер загружать такое значение, чтобы с учетом потраченного на обработку прерывания времени, опять получился интервал в 0,5 сек(или сколько надо)
|
|
|
|