Подстройка таймера Т1 - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 3123»
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Подстройка таймера Т1 (Точная настройка коэфициента деленя регистров TMR1Н и TMR1L)
Подстройка таймера Т1
mikhail09p Дата: Пт, 06.05.2011, 10:42  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 504
Репутация: 10   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Изучая таймеры, решил сделать часы + терморегулятор с большим индикатором.
Получилось интересное устройство, которое работает не так, как в протеусе. При переборе режимов установки (нижняя кнопка) при установке температуры НЕ гаснет 3 разряд индикатора часов wacko , хотя в протеусе всё нормально wink
Но это мелочи, будем с этим боротся, протеус не идеален, наверное что-то я с конфигурацией портов намутил...

Вопрос в следующем: кварц генерит не 32678Гц, а много больше - часы спешат где-то на 3 минуты в час. Это когда настраиваю прерывания 1 сек. Так вот вопрос - как вычислить установочные коэфициенты регистров TMR1Н и TMR1L ?
Я вывел сигнал 1 секунды на порт С.5 , но как им воспользоватся? Не хочется 100 раз шить контроллер, измеряя период и подстраивая коэфициенты регистра. Он (микроконтроллер) и так страдалец biggrin
Между прочим - классно работает Sleep - контроллер потребляет 15 - 20 микроАмпер и часы идут cool
Сильно не пинайте - устройство ещё доводится до ума, на схеме нету эммитерных повторителей на порту D0-D3, в жизни они есть (выв. 27-30).

Прикрепления: 9864315.rar(134Kb)

Сообщение отредактировал mikhail09p - Пт, 06.05.2011, 10:44
ЯНДЕКС Дата: 06.05.2011
ivan_fd Дата: Пт, 06.05.2011, 12:31  |                                                                                                                Сообщение # 2
Группа: Модераторы
Ранг:  Специалист
Сообщений: 888
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Настройка таймера.
Code
TMR1H = $80;         ; 32768
TMR1L = $00;         ;

По поводу кварца. Что бы часы шли точно, на кварц нужно цеплять конденсаторы. И не какие попало, а какие должны быть по даташиту на кварц.


Меня все время преследуют умные мысли...но я быстрее!!!
mikhail09p Дата: Пт, 06.05.2011, 12:47  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 504
Репутация: 10   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Quote (ivan_fd)
Настройка таймера. CodeTMR1H = $80;         ; 32768 TMR1L = $00;         ; По поводу кварца. Что бы часы шли точно, на кварц нужно цеплять конденсаторы. И не какие попало, а какие должны быть по даташиту на кварц.

Ну я ж не... smile
Кварц и кодёры выпаяны из компьютерной мамки. На кварце пишет 32768.
Существует ли метода для перещёта коэфициентов делителя по измЕренной длительности импульса? Может, при известном предделителе измерить длительность ипульса и пересчитать частоту? Вообще, можно ли достоверно обычным осциллографом измерить частоту импульсов на выводе 15 пика? Я имею ввиду не повлияет ли ёмкость щупа на точность? cool

ivan_fd Дата: Пт, 06.05.2011, 13:25  |                                                                                                                Сообщение # 4
Группа: Модераторы
Ранг:  Специалист
Сообщений: 888
Репутация: 47   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 504
Репутация: 10   ±
Замечания:   ±
На сайте с 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
Группа: Модераторы
Ранг:  Специалист
Сообщений: 888
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Quote (mikhail09p)
Я думал, дабавлять или вычитать лишние или избыточные секунды каждый час.

Верно.

Еще, чисто мое мнение. Я бы лучше использовал внешние часы реального времени.
Почему, потому что контроллер может зависнуть или еще чего там, и все настраива по новой.


Меня все время преследуют умные мысли...но я быстрее!!!
mikhail09p Дата: Пт, 06.05.2011, 14:08  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 504
Репутация: 10   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Quote (ivan_fd)
Еще, чисто мое мнение. Я бы лучше использовал внешние часы реального времени. Почему, потому что контроллер может зависнуть или еще чего там, и все настраива по новой.

Моя первая цель - научится работать с таймером М1, тем более "во сне" smile
Ну и, как побочный эффект, часы. Помучаю, напишу, зависают ли или нет. cool
Ну а если часы реального времени, то и контроллер поменьше, а то этот по задумке будет ещё кое-чего делать, ведь у него и ШИМ и АЦП есть.
DAlexV Дата: Сб, 07.05.2011, 09:07  |                                                                                                                Сообщение # 8
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 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 то же нужно какое то время. Причем этот параметр может плавать как от температуры так и от кварца и даже от проца к процу.

Успехов wink


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)
mikhail09p Дата: Сб, 07.05.2011, 22:01  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 504
Репутация: 10   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Quote (DAlexV)
mikhail09p, предлагаю немного видоизменить обработчик прерывания, вставив проверку флагов от источников прерывания(т.к. по флагам указанным в начале программы будут еще прерывания от порта В

Погодите, DAlexV! Мне не нужны прерывания от порта В! В данном устройстве мне нужно только отсчитывать время в прерывании. Где исправить?
Quote (DAlexV)
И не стоит забывать что на выход из Sleep то же нужно какое то время.

Во время выхода из Sleep не будут происходить прерывания или останавливается генератор таймера 1 wacko
Этот момент совсем не понятаен...

Добавлено (07.05.2011, 22.01.57)
---------------------------------------------

Quote (DAlexV)
Операция сложения может занимать разное время

Это сложение Вы имели ввиду?
Inc SECONDS
Inc secb
DAlexV Дата: Сб, 07.05.2011, 23:46  |                                                                                                                Сообщение # 10
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Михаил !!! без паники !!!! biggrin
Все просто. Я примерно так же мучился только с 2 таймерами. Причем задачка была намного интереснее. 100 гц. нужно было поделить каждый период на 2024 без сдвига по фазе (это про 220 Вольт). Как я уже писал в посте 8 нужно соблюдать некоторую последовательность для обработчика прерывания. Тогда все пойдет по сценарию. Первое. Ловим в обработчике источник прерывания . В данном случае TMR1. Если произошло прерывание от TMR1, первым делом сбросили флаг прерывания, обновили значение таймера(что бы начался новый отсчет) а после уже выполнять все действия сложения(вычитания) какие требуются программе. Если что не понятно, в личку(вроде уже списывались). Все лишнее отфильтруем, остальное опубликуем.

Успехов !!!! wink


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)

Сообщение отредактировал DAlexV - Вс, 08.05.2011, 09:33
mikhail09p Дата: Вс, 08.05.2011, 09:48  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 504
Репутация: 10   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Quote (DAlexV)
первым делом сбросили флаг прерывания, обновили значение таймера(что бы начался новый отсчет) а после уже выполнять все действия

Пока понятно. smile
Но про время выхода из Sleep прошу поподробней, я думаю, это не только мне пригодится.
DAlexV Дата: Вс, 08.05.2011, 09:56  |                                                                                                                Сообщение # 12
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (mikhail09p)
Но про время выхода из Sleep прошу поподробней, я думаю, это не только мне пригодится.

Если прерывание происходит когда контроллер не находиться в режиме сна, то до обновления значений таймера пройдет время А. Если спит то прерывание его сначала будит(запускается кварцевый генератор и стабилизируется частота) и только потом уже входит в прерывание. Проще говоря время на пробуждение + время А.


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)
mikhail09p Дата: Вс, 08.05.2011, 12:38  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 504
Репутация: 10   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Quote (DAlexV)
Если прерывание происходит когда контроллер не находиться в режиме сна, то до обновления значений таймера пройдет время А. Если спит то прерывание его сначала будит(запускается кварцевый генератор и стабилизируется частота) и только потом уже входит в прерывание. Проще говоря время на пробуждение + время А.

Получается, во сне невозможен точный отсчёт времени? dry

DAlexV Дата: Вс, 08.05.2011, 18:16  |                                                                                                                Сообщение # 14
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 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 ; вышли из обработчика прерывания



Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)
mikhail09p Дата: Вс, 08.05.2011, 19:48  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 504
Репутация: 10   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Quote (DAlexV)
В зависимости от этого и выставлять новые значения для таймера.

А где смотреть это сАмое время А и время пробуждения?
В даташит?
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Подстройка таймера Т1 (Точная настройка коэфициента деленя регистров TMR1Н и TMR1L)
Страница 1 из 3123»
Поиск: