реклама на сайте
подробности

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Tiny2313 нужна 1 сек. на таймер 0, "Уходит" время :(
AndryG
сообщение Jul 8 2007, 19:46
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



Доброго времени суток.

Контроллер - Tiny2313
Частота - 8МГц
Компилятор - CVAVR 1.25.2b1

Одна из функций устройства - подсчет текущего времени.
Используется таймер 0 (второй уже недоступен).
Прерывание по совпадению и автоматическая очистка счетчика при условии сравнения.
С предделителем 256 получаю частоту прерыания ровно 125Гц (64000 тактов)
И в прерывании делитель ставлю на 125.

Вроде всё верно, но за 8,5 часов часики удрали на 4 секунды sad.gif
Устройство активно работает с внутренней EEPROM.

Вот тут и начинаются вопросы ...
- если прерывание таймера возникает при их глобальном запрещении, или выполнении "длинных" команд,
то прерывание вызовется с задержкой ... сбивается ли при этом счетчик циклов в таймере?
- кто что может посоветовать?

_____
P.S.
Запскал HEX в Студии ... ставлю точку останова на вектор прерывания ...
прерывание вызывается каждые 64000 такта ... почти всегда, иногда выскакивает 64001 или
64002 - видать из-за длительных команд ... но потом всё выравнимается.
Правда симуляцию я запускал максимум на секунду - на моем компе на это около 30 минут :-)
А может это такая точность кварца? Слабо верится. Да! фузы верно настроены - проверял уже.
Go to the top of the page
 
+Quote Post
AndreyKeil
сообщение Jul 8 2007, 20:09
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930



Цитата(AndryG @ Jul 9 2007, 01:46) *



Режим работы таймера "Сброс по совпадению" использует значение, которое записано в регистре захвата или в регистре сравнения. Уточните значение этого регистра.
Далее, непонятно значение фразы "...делитель ставлю на 125". Делителя на 125 вообще нет. Есть на 8, 32, 64, .. и т.д.

Отвечу на вопрос о сбивании таймера - если таймер не останавливать, то значение счета в нем не сбивается. Запрет/разрешение прерываний здесь не влияет.

Кварц какой используете - внутренний или внешний?
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 8 2007, 21:18
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(AndreyKeil @ Jul 8 2007, 23:09) *
Кварц какой используете - внутренний или внешний?

Кварц разве внутренний бывает?

Цитата(AndryG @ Jul 8 2007, 22:46) *
Контроллер - Tiny2313
Частота - 8МГц

Одна из функций устройства - подсчет текущего времени.

Вроде всё верно, но за 8,5 часов часики удрали на 4 секунды sad.gif

А может это такая точность кварца? Слабо верится. Да! фузы верно настроены - проверял уже.

Это такая точность кварца. Часовые кварцы иногда уходят также, а то и больше, а у вас обычный...

8.5 часов = 3600s * 8.5 = 30600 sec

погрешность счета
4/30600 = 0.00013

если кварц у вас маркирован как 8.000Mhz - то погрешность в пределах нормы.

Цитата
- кто что может посоветовать?

На мой взгляд проще всего сделать программную коррекцию часов. Тобиш, если 4 секунды теряется за ~8 часов, вы можете каждые два часа подводить часы на 1 секунду в сторону противоположную уходу времени.

Цитата
Устройство активно работает с внутренней EEPROM.
Вот тут и начинаются вопросы ...
- если прерывание таймера возникает при их глобальном запрещении, или выполнении "длинных" команд,
то прерывание вызовется с задержкой ... сбивается ли при этом счетчик циклов в таймере?

задержка обработки прерывания не важна, важно - не пропустить прерывание.

Если у вас в системе прерывания запрещаются на время большее чем интервал между прерываниями от T0 (1/125 sec) - то тогда счетчик циклов будет сбиваться (опаздывать), т.к. некоторые прерывания будут пропущены. Если у вас прерывания запрещаются ненадолго (много меньше чем 1/125 сек), то тогда можете быть спокойны - программных сбоев быть не должно.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jul 8 2007, 22:12
Сообщение #4


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(defunct @ Jul 9 2007, 01:18) *
Это такая точность кварца. Часовые кварцы иногда уходят также, а то и больше, а у вас обычный...
Часовой это который 32768 ?
А откуда такая информация что у них точность выраженная в ppm лучше чем у обычных ?
Цитата
8.5 часов = 3600s * 8.5 = 30600 sec
погрешность счета
4/30600 = 0.00013

130ppm многовато для обычного "кварца", должно быть не больше 30ppm.
Может быть конденсаторы на землю неправильные ?
Или кварц не расчитан например на 3V а только на 5.
Ну или у Вас там не кварц вобще... (иногда в малогабаритных девайсах используют
другие материалы с худшей точностью)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2007, 22:18
Сообщение #5


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Тоже думаю, что виновата не программа, а точность кварца. Я бы попробовал исправить положение конденсаторами на кварце. Увеличить или уменьшить, один или оба.

Была у меня ситуация, тока с часовым кварцем. Убегал на несколько секунд в день. Около него стояли кондёры где-то на 12 или 15 пф. После перепайки обоих на 22 пф разбег уменьшился раз в десять.

Цитата(singlskv)
А откуда такая информация что у них точность выраженная в ppm лучше чем у обычных ?
Причём тут ppm? Речь о начальной точности кварца.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jul 8 2007, 22:27
Сообщение #6


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(GetSmart @ Jul 9 2007, 02:18) *
Причём тут ppm? Речь о начальной точности кварца.

Начальная тоже в ppm указывается (допустимый разброс).
И насколько я ничего не знаю, у часовых кварцев при прочих равных
этот параметр хуже чем у "обычных"...
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 9 2007, 00:09
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Мдя... И никто не сказал, что уход то из-за того, что делитель надо ставить не на 125, а на 124 - нулевой импульс тоже надо учитывать, так счетчик досчитывает до 125, включая 125-ый такт, в итоге - 126 реально посчитанных тактов и уход частотыsmile.gif


--------------------
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jul 9 2007, 00:39
Сообщение #8


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(prottoss @ Jul 9 2007, 04:09) *
Мдя... И никто не сказал, что уход то из-за того, что делитель надо ставить не на 125, а на 124 - нулевой импульс тоже надо учитывать, так счетчик досчитывает до 125, включая 125-ый такт, в итоге - 126 реально посчитанных тактов и уход частотыsmile.gif

Ну кода то мы не видели, но ИМХО дело не в 124-125, иначе после такого изменения
ошибка будет ~1/125=0,008 - а это ну очень много...
Go to the top of the page
 
+Quote Post
ae_
сообщение Jul 9 2007, 00:47
Сообщение #9


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Цитата(prottoss @ Jul 9 2007, 09:09) *
Мдя... И никто не сказал, что уход то из-за того, что делитель надо ставить не на 125, а на 124 - нулевой импульс тоже надо учитывать, так счетчик досчитывает до 125, включая 125-ый такт, в итоге - 126 реально посчитанных тактов и уход частотыsmile.gif

Начал отвечать про 124-125, но singlskv опередил smile.gif
Да и автор вопроса сообщил, что прогонял на симуляторе - всё нормально, 64000 тактов.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 9 2007, 10:42
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(ae_ @ Jul 9 2007, 08:47) *
Начал отвечать про 124-125, но singlskv опередил smile.gif
Да и автор вопроса сообщил, что прогонял на симуляторе - всё нормально, 64000 тактов.
тада точно кварц... наверное... a14.gif


--------------------
Go to the top of the page
 
+Quote Post
AndryG
сообщение Jul 10 2007, 05:28
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



Спасибо всем за ответы. Вчера весь день был на объекте - не смог поучаствовать ...

"Делитель на 125" ... это я про такой код:
Код
interrupt [TIM0_OVF] void timer0_ovf_isr(void){ //вызывается 125 Гц
if (times < 125)
  goto tim0_ovf_ret;
times = 0x00;  
realtime.s++;
...


Вот сам теперь сижу и думаю, а правильно ли тут 125 стоит ... хотя тоже считал .. ошибка должна быть больше тогда... (хотя может наложилось это и кварц)
И по Студии я не проверял работу делителя - точку останова ставил на прерывание, а не на строку после "делителя на 125" - у меня комп секунду эту гонять сутки будет.

Кварц маркирован .... 8 000 кГц -- сам не помню откуда он.

На счет конденсаторов идею подали -- поколупаю .. вот только бы знать в какую сторону ... может ссылка у кого есть?

И опять я уезжаю на весь день -- завтра обязательно подключусь.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 10 2007, 09:59
Сообщение #12


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(AndryG @ Jul 10 2007, 08:28) *
Вот сам теперь сижу и думаю, а правильно ли тут 125 стоит ... хотя тоже считал .. ошибка должна быть больше тогда...

Посмотрите в даташите как работает CTC. В некоторых процах (например AT90S2313) таймер при достижении установленного числа сбрасывает и предделитель (т.о. 1 такт выпадет).

Хотя маловероятно, в t2313 это должно было быть пофикшено, да и ошибка была бы меньше - 3*10(-5).

Цитата
Кварц маркирован .... 8 000 кГц

с такой маркировкой частота стабилизации кварца может быть в пределах

от
8, 000.000 Mhz
до
8, 000.999 Mhz

Стабильность частоты как отмечали выше - 30 ppm
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 10 2007, 10:27
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(AndryG @ Jul 10 2007, 13:28) *
Спасибо всем за ответы. Вчера весь день был на объекте - не смог поучаствовать ...

"Делитель на 125" ... это я про такой код:
Код
interrupt [TIM0_OVF] void timer0_ovf_isr(void){ //вызывается 125 Гц
if (times < 125)
  goto tim0_ovf_ret;
times = 0x00;  
realtime.s++;
...
Че то я совсем запутался 07.gif Как из 8.000.000 Гц получить 125 Гц штатным прескалером счетчика ТС0 ??? Если учесть, что в первом посте чел поставил прескалер на 256, то имеем частоту входных импульсов ТС0 - 31.250 Гц. Далее, раз выбрано прерывание по переполнению и Output Compare Unit c OCR0A не задействован, следовательно прерывание вызывается с частотой 31250/256 = 122,0307 Гц 07.gif (Здесь бы я поставил смайлик с пистолетом у виска)


--------------------
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 10 2007, 10:44
Сообщение #14


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(prottoss @ Jul 10 2007, 13:27) *
Как из 8.000.000 Гц получить 125 Гц штатным прескалером счетчика ТС0 ???

OCR0 = 250
предделитель 256
имеем 8000000 / (250 * 256 ) = 125
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 10 2007, 10:49
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(defunct @ Jul 10 2007, 18:44) *
OCR0 = 250
предделитель 256
имеем 8000000 / (250 * 256 ) = 125
Но у парня прерывание не по совпадению с OCR0, а ПО ПЕРЕПОЛНЕНИЮ.

Цитата(AndryG @ Jul 10 2007, 13:28) *
Код
interrupt [TIM0_OVF] void timer0_ovf_isr(void){ //вызывается 125 Гц
if (times < 125)
  goto tim0_ovf_ret;
times = 0x00;  
realtime.s++;
...


--------------------
Go to the top of the page
 
+Quote Post

5 страниц V   1 2 3 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 09:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01513 секунд с 7
ELECTRONIX ©2004-2016