Подстройка таймера Т1
|
|
mikhail09p |
Дата: Пт, 06.05.2011, 10:42 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Изучая таймеры, решил сделать часы + терморегулятор с большим индикатором. Получилось интересное устройство, которое работает не так, как в протеусе. При переборе режимов установки (нижняя кнопка) при установке температуры НЕ гаснет 3 разряд индикатора часов , хотя в протеусе всё нормально Но это мелочи, будем с этим боротся, протеус не идеален, наверное что-то я с конфигурацией портов намутил... Вопрос в следующем: кварц генерит не 32678Гц, а много больше - часы спешат где-то на 3 минуты в час. Это когда настраиваю прерывания 1 сек. Так вот вопрос - как вычислить установочные коэфициенты регистров TMR1Н и TMR1L ? Я вывел сигнал 1 секунды на порт С.5 , но как им воспользоватся? Не хочется 100 раз шить контроллер, измеряя период и подстраивая коэфициенты регистра. Он (микроконтроллер) и так страдалец Между прочим - классно работает Sleep - контроллер потребляет 15 - 20 микроАмпер и часы идут Сильно не пинайте - устройство ещё доводится до ума, на схеме нету эммитерных повторителей на порту D0-D3, в жизни они есть (выв. 27-30).
Сообщение отредактировал
mikhail09p - Пт, 06.05.2011, 10:44
|
|
|
|
ivan_fd |
Дата: Пт, 06.05.2011, 12:31 | Сообщение # 2 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Настройка таймера. Code TMR1H = $80; ; 32768 TMR1L = $00; ; По поводу кварца. Что бы часы шли точно, на кварц нужно цеплять конденсаторы. И не какие попало, а какие должны быть по даташиту на кварц.
|
|
|
|
mikhail09p |
Дата: Пт, 06.05.2011, 12:47 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Quote (ivan_fd) Настройка таймера. CodeTMR1H = $80; ; 32768 TMR1L = $00; ; По поводу кварца. Что бы часы шли точно, на кварц нужно цеплять конденсаторы. И не какие попало, а какие должны быть по даташиту на кварц. Ну я ж не... Кварц и кодёры выпаяны из компьютерной мамки. На кварце пишет 32768. Существует ли метода для перещёта коэфициентов делителя по измЕренной длительности импульса? Может, при известном предделителе измерить длительность ипульса и пересчитать частоту? Вообще, можно ли достоверно обычным осциллографом измерить частоту импульсов на выводе 15 пика? Я имею ввиду не повлияет ли ёмкость щупа на точность?
|
|
|
|
ivan_fd |
Дата: Пт, 06.05.2011, 13:25 | Сообщение # 4 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Quote (mikhail09p) Ну я ж не... Это как понимать? У Вас же в программе написано: Code TMR1H = $79; ; preset for timer1 MSB register TMR1L = $9A; ; preset for timer1 LSB register 1,05 а это получается 1.05 сек. Как вы думаете, часы будут точно идти? Quote (mikhail09p) Существует ли метода для перещёта коэфициентов делителя по измЕренной длительности импульса? Может, при известном предделителе измерить длительность ипульса и пересчитать частоту? Вообще, можно ли достоверно обычным осциллографом измерить частоту импульсов на выводе 15 пика? Я имею ввиду не повлияет ли ёмкость щупа на точность? Я думаю, что лучше измерять, не осциллографом, а частотомером, при чем точным. Да и может повлиять емкость щупа. В Вашем случае, думаю будет лучше ввести програмную коррекцию хода часов. P.S: я уже об этом писал, но напишу еще раз. Я когда то тоже игрался с точностью хода часов, какие я только кварцы не ставил, и с компьютерной мамки с конденсаторами и ..., все равно, то спешил, то опаздывал. Потом взял кварц с кондерами от мобильного, и только тогда они начали ходить "тютелька в тютельку".
|
|
|
|
mikhail09p |
Дата: Пт, 06.05.2011, 13:35 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Quote (ivan_fd) Quote (mikhail09p)Ну я ж не... Это как понимать? У Вас же в программе написано: CodeTMR1H = $79; ; preset for timer1 MSB register TMR1L = $9A; ; preset for timer1 LSB register 1,05 а это получается 1.05 сек. Как вы думаете, часы будут точно идти? Вы невнимательно читали первый пост. Я же написАл: часы СПЕШАТ, потому период уже и увелИчивал в процессе отладки... Там и указано - 1.05 сек. Да ладно. Просто, хотелось хоть более-менее точно выйти на 1 сек в программе. А вот Quote (ivan_fd) В Вашем случае, думаю будет лучше ввести програмную коррекцию хода часов. это то! Можно поподробнее? Я думал, дабавлять или вычитать лишние или избыточные секунды каждый час. Верно ли?
|
|
|
|
ivan_fd |
Дата: Пт, 06.05.2011, 13:42 | Сообщение # 6 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Quote (mikhail09p) Я думал, дабавлять или вычитать лишние или избыточные секунды каждый час. Верно. Еще, чисто мое мнение. Я бы лучше использовал внешние часы реального времени. Почему, потому что контроллер может зависнуть или еще чего там, и все настраива по новой.
|
|
|
|
mikhail09p |
Дата: Пт, 06.05.2011, 14:08 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Quote (ivan_fd) Еще, чисто мое мнение. Я бы лучше использовал внешние часы реального времени. Почему, потому что контроллер может зависнуть или еще чего там, и все настраива по новой. Моя первая цель - научится работать с таймером М1, тем более "во сне" Ну и, как побочный эффект, часы. Помучаю, напишу, зависают ли или нет. Ну а если часы реального времени, то и контроллер поменьше, а то этот по задумке будет ещё кое-чего делать, ведь у него и ШИМ и АЦП есть.
|
|
|
|
DAlexV |
Дата: Сб, 07.05.2011, 09:07 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
mikhail09p, предлагаю немного видоизменить обработчик прерывания, вставив проверку флагов от источников прерывания(т.к. по флагам указанным в начале программы будут еще прерывания от порта В Code Int_Label: Context Save
if T1IF=1 then ; проверка на срабатывание от TMR1 T1IF=0 ; Сбросили флаг источника прерывания TMR1H = $79; ; обновили значения таймера TMR1L = $9A; ;
b = ~b ; далее остальные операции относящиеся к этому прерыванию Hz = b Inc SECONDS Inc secb
end if
If RBIF=1 then ; Проверка на прерывание от RB4-7 RBIF=0 ; Сбросили флаг
...... ; код для прерывания
end if
; Такой же блок для INTА (B.0)
Context Restore ; вышли из обработчика прерывания Плавает время по двум причинам. Операция сложения может занимать разное время и если изменить состояние порта, то то же произойдет вход в прерывание(таймер еще не переполнен, а ему уже новые значения подсовывают). И не стоит забывать что на выход из Sleep то же нужно какое то время. Причем этот параметр может плавать как от температуры так и от кварца и даже от проца к процу. Успехов
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
mikhail09p |
Дата: Сб, 07.05.2011, 22:01 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Quote (DAlexV) mikhail09p, предлагаю немного видоизменить обработчик прерывания, вставив проверку флагов от источников прерывания(т.к. по флагам указанным в начале программы будут еще прерывания от порта В Погодите, DAlexV! Мне не нужны прерывания от порта В! В данном устройстве мне нужно только отсчитывать время в прерывании. Где исправить? Quote (DAlexV) И не стоит забывать что на выход из Sleep то же нужно какое то время. Во время выхода из Sleep не будут происходить прерывания или останавливается генератор таймера 1 Этот момент совсем не понятаен...Добавлено (07.05.2011, 22.01.57) ---------------------------------------------
Quote (DAlexV) Операция сложения может занимать разное время Это сложение Вы имели ввиду? Inc SECONDS Inc secb
|
|
|
|
DAlexV |
Дата: Сб, 07.05.2011, 23:46 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Михаил !!! без паники !!!! Все просто. Я примерно так же мучился только с 2 таймерами. Причем задачка была намного интереснее. 100 гц. нужно было поделить каждый период на 2024 без сдвига по фазе (это про 220 Вольт). Как я уже писал в посте 8 нужно соблюдать некоторую последовательность для обработчика прерывания. Тогда все пойдет по сценарию. Первое. Ловим в обработчике источник прерывания . В данном случае TMR1. Если произошло прерывание от TMR1, первым делом сбросили флаг прерывания, обновили значение таймера(что бы начался новый отсчет) а после уже выполнять все действия сложения(вычитания) какие требуются программе. Если что не понятно, в личку(вроде уже списывались). Все лишнее отфильтруем, остальное опубликуем. Успехов !!!!
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Сообщение отредактировал
DAlexV - Вс, 08.05.2011, 09:33
|
|
|
|
mikhail09p |
Дата: Вс, 08.05.2011, 09:48 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Quote (DAlexV) первым делом сбросили флаг прерывания, обновили значение таймера(что бы начался новый отсчет) а после уже выполнять все действия Пока понятно. Но про время выхода из Sleep прошу поподробней, я думаю, это не только мне пригодится.
|
|
|
|
DAlexV |
Дата: Вс, 08.05.2011, 09:56 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (mikhail09p) Но про время выхода из Sleep прошу поподробней, я думаю, это не только мне пригодится. Если прерывание происходит когда контроллер не находиться в режиме сна, то до обновления значений таймера пройдет время А. Если спит то прерывание его сначала будит(запускается кварцевый генератор и стабилизируется частота) и только потом уже входит в прерывание. Проще говоря время на пробуждение + время А.
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
mikhail09p |
Дата: Вс, 08.05.2011, 12:38 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Quote (DAlexV) Если прерывание происходит когда контроллер не находиться в режиме сна, то до обновления значений таймера пройдет время А. Если спит то прерывание его сначала будит(запускается кварцевый генератор и стабилизируется частота) и только потом уже входит в прерывание. Проще говоря время на пробуждение + время А. Получается, во сне невозможен точный отсчёт времени?
|
|
|
|
DAlexV |
Дата: Вс, 08.05.2011, 18:16 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (mikhail09p) Получается, во сне невозможен точный отсчёт времени? Кто сказал что невозможно. Нужно учитыватьQuote (DAlexV) время на пробуждение + время А Для этого добавить битовую переменную(допустим SL_Mode) и с помощью ее проверять в прерывании был ли проц разбужен или нет. В зависимости от этого и выставлять новые значения для таймера. Например: Code '---------------------------------------------------------------------------------- ' кусок кода где уходит в сон Input PORTC.6
Sl_Mode=1 'перед входом в sleep меняем выставим 1
Sleep 3 GoTo MainProgram End If '---------------------------------------------------------------------------------- ' прерывание Int_Label: Context Save
if T1IF=1 then ; проверка на срабатывание от TMR1 T1IF=0 ; Сбросили флаг источника прерывания
if Sl_Mode=1 then TMR1H = $79; ; обновили значения таймера TMR1L = $AA; ; время на пробуждение + время А Sl_Mode=0 ; сбросили флаг else TMR1H = $79; ; обновили значения таймера TMR1L = $9A; ; время А end if
b = ~b ; далее остальные операции относящиеся к этому прерыванию Hz = b Inc SECONDS Inc secb end if
Context Restore ; вышли из обработчика прерывания
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
mikhail09p |
Дата: Вс, 08.05.2011, 19:48 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Quote (DAlexV) В зависимости от этого и выставлять новые значения для таймера. А где смотреть это сАмое время А и время пробуждения? В даташит?
|
|
|
|