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

 
 
> 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
 
Start new topic
Ответов
AndryG
сообщение Jul 10 2007, 05:28
Сообщение #2


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

Группа: Свой
Сообщений: 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
prottoss
сообщение Jul 10 2007, 10:27
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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
=GM=
сообщение Jul 10 2007, 11:21
Сообщение #4


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(prottoss @ Jul 10 2007, 09:27) *
Че то я совсем запутался 07.gif Как из 8.000.000 Гц получить 125 Гц штатным прескалером счетчика ТС0 ??? Если учесть, что в первом посте чел поставил прескалер на 256, то имеем частоту входных импульсов ТС0 - 31.250 Гц. Далее, раз выбрано прерывание по переполнению и Output Compare Unit c OCR0A не задействован, следовательно прерывание вызывается с частотой 31250/256 = 122,0307 Гц 07.gif (Здесь бы я поставил смайлик с пистолетом у виска)

Вы сами себя запутали. Чел пишет, что выбрано "прерывание по совпадению и автоматическая очистка счетчика при условии сравнения. С предделителем 256 получаю частоту прерывания ровно 125 Гц (64000 тактов). И в прерывании делитель ставлю на 125"

Чтобы получить 125 Гц ему надо поставить счётчик на 31250/125=250. А вот дальше начинаются непонятки. Из приведенного фрагмента видно, где сбрасывается переменная times, но не видно, где она инкрементируется. То есть непонятно, на сколько делится 125-ти герцовое прерывание - на 125 или 126, чтобы инкрементировать секундный счетчик. На мой взгляд, данная неточность вкупе с неточностью кварца даёт искомую ошибку.

И не надо так шутить "с пистолетом у виска", вы ещё не на все вопросы по программатору ответили(:-).


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 10 2007, 11:31
Сообщение #5


Гуру
******

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



Цитата(=GM= @ Jul 10 2007, 19:21) *
Вы сами себя запутали.
Я сам себя не путал. biggrin.gif Чел пишет, что
Цитата
...прерывание по совпадению и автоматическая очистка...
Это наводит на мысли об использовании Output Compare Unit и OCR0B регистре. Следующим постом демонстрируется код, в котором используется прерывание, повторюсь еще раз ПО ПЕРЕПОЛНЕНИЮ счетчика ТС0. В теле прерывания видна переменная time, которая неизвестно где инкрементируется, но проверяется, и "автоматически" обнуляется smile.gif Так что я не запутался, просто Вы, уважаемый, посты через строчку читаете



Цитата(=GM= @ Jul 10 2007, 19:21) *
И не надо так шутить "с пистолетом у виска", вы ещё не на все вопросы по программатору ответили(:-).
По программатору предлагаю ехидничать в соответсвующей ветке, дабы не засорять топик smile.gif


--------------------
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 10 2007, 12:07
Сообщение #6


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(prottoss @ Jul 10 2007, 10:31) *
...Следующим постом демонстрируется код, в котором используется прерывание, повторюсь еще раз ПО ПЕРЕПОЛНЕНИЮ счетчика ТС0

Вы хотите сказать, что при использовании Output Compare Unit не возникает флага переполнения?
Цитата(prottoss @ Jul 10 2007, 10:31) *
Так что я не запутался, просто Вы, уважаемый, посты через строчку читаете

Ну положим, уважаемый, вы сами сказали, что запутались, я вас за язык не тянул(:-). А посты я читаю как надо, не волнуйтесь за меня.
Цитата(prottoss @ Jul 10 2007, 10:31) *
По программатору предлагаю ехидничать в соответствующей ветке, дабы не засорять топик smile.gif

И не думал ехидничать, прошу прощения, если обидел. Хотел просто обратить внимание, что не следует шутить на тему смерти.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 10 2007, 12:29
Сообщение #7


Гуру
******

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



Цитата(=GM= @ Jul 10 2007, 20:07) *
Вы хотите сказать, что при использовании Output Compare Unit не возникает флага переполнения?
Я хочу сказать, что человек не использует Output Compare Unit, а использует переполнение счетчика ТС0, неужели это не понятно??? Таким образом у него получается частота 8.000.000 / 256 (прескалер) / 256 (переполняемый ТС0) = 122, .... Гц. Я сделал такой вывод, потому что человек привел код с прерыванием по переполнению.



А если бы он использовал OCR0A = 250 и использовал прерывание по совпадению, то у него бы получилось 8.000.000 / 256 (прескалер) / 250 (ТС0 == OCR0A?) = 125 Гц. Вот тут, пожалуйста, инкрементируй переменную time и проверяй ее на меньше 125



Точнее OCR0A = 249 smile.gif


--------------------
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 10 2007, 12:40
Сообщение #8


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(prottoss @ Jul 10 2007, 11:29) *
Я хочу сказать, что человек не использует Output Compare Unit, а использует переполнение счетчика ТС0, неужели это не понятно???

Да откуда вы взяли, что он не использует Output Compare Unit? При его использовании установка флага переполнения счетчика ТС0 (и соответственно, возникновение прерывания по переполнению) возможна, например, когда биты WGM=001 или 101 (см. с. 79 документа 2543i).


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 10 2007, 13:14
Сообщение #9


Гуру
******

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



Цитата(=GM= @ Jul 10 2007, 20:40) *
Да откуда вы взяли, что он не использует Output Compare Unit? При его использовании установка флага переполнения счетчика ТС0 (и соответственно, возникновение прерывания по переполнению) возможна, например, когда биты WGM=001 или 101 (см. с. 79 документа 2543i).
Ну про такие извраты (извиняюсь) для получения одной секунды я вообще не думал. То что Вы привели относится к Fase Correct PWM mode - флаг переполнения возникает каждые 512 входных импульсов - интересно было бы увидеть Ваши мысли по тому, как парень в таком режиме счетчика считает 1 Гц...

Цитата(defunct @ Jul 10 2007, 20:54) *
Флаг TOVF устанавливается при достижении максимального значения в режиме CTC
Я не говорил, что флаг TOVF не установится вообще в режиме СТС, но это возможно если OCR1A = 0xFF.

Тогда не будет нужных 125 Гц, В режиме PWM Fase correct, так как период переполнений равен 512-и входным импульсам (256 - ++ и 256 --) тоже нет возможности получить 125 Гц. По этому я эти режимы и возможности не привел - для меня это было очевидно. smile.gif

ИМХО парень просто ошибся в расчетах. Будем ждать, что он скажет...


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


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(prottoss @ Jul 10 2007, 12:14) *
Ну про такие извраты (извиняюсь) для получения одной секунды я вообще не думал. То что Вы привели относится к Phase Correct PWM mode - флаг переполнения возникает каждые 512 входных импульсов - интересно было бы увидеть Ваши мысли по тому, как парень в таком режиме счетчика считает 1 Гц...

Лехко. Ставите прескалер на 256, WGM=5 и OCR0A=125, тогда каждые 250 импульсов входной частоты будет возникать прерывание TOV0. Ну и поскольку входная частота для этого режима равна 8000/256=31.25 кГц, то прерывания по переполнению таймера0 будут возникать каждые 125 Гц, никаких чудес.

Такая мысль возникла. Если частота кварца у чела равна 7999 кГц вместо 8000, то за 8.5 часов набежит ошибка (1-256*250*125/7999000)*30600=4 секунды. Вот так, так что зря мы тут копья ломаем(:-).


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- AndryG   Tiny2313 нужна 1 сек. на таймер 0   Jul 8 2007, 19:46
- - AndreyKeil   Цитата(AndryG @ Jul 9 2007, 01:46) Реж...   Jul 8 2007, 20:09
|- - defunct   Цитата(AndreyKeil @ Jul 8 2007, 23:09) Кв...   Jul 8 2007, 21:18
|- - singlskv   Цитата(defunct @ Jul 9 2007, 01:18) Это т...   Jul 8 2007, 22:12
- - GetSmart   Тоже думаю, что виновата не программа, а точность ...   Jul 8 2007, 22:18
|- - singlskv   Цитата(GetSmart @ Jul 9 2007, 02:18) Прич...   Jul 8 2007, 22:27
- - prottoss   Мдя... И никто не сказал, что уход то из-за того, ...   Jul 9 2007, 00:09
|- - singlskv   Цитата(prottoss @ Jul 9 2007, 04:09) Мдя....   Jul 9 2007, 00:39
|- - ae_   Цитата(prottoss @ Jul 9 2007, 09:09) Мдя....   Jul 9 2007, 00:47
|- - prottoss   Цитата(ae_ @ Jul 9 2007, 08:47) Начал отв...   Jul 9 2007, 10:42
|- - defunct   Цитата(prottoss @ Jul 10 2007, 13:27) Как...   Jul 10 2007, 10:44
||- - prottoss   Цитата(defunct @ Jul 10 2007, 18:44) OCR0...   Jul 10 2007, 10:49
|- - defunct   Цитата(prottoss @ Jul 10 2007, 16:14) Я н...   Jul 10 2007, 13:19
||- - prottoss   Цитата(defunct @ Jul 10 2007, 21:19) Это ...   Jul 10 2007, 13:31
||- - defunct   Цитата(prottoss @ Jul 10 2007, 16:31) Да ...   Jul 10 2007, 14:20
||- - prottoss   Цитата(defunct @ Jul 10 2007, 22:20) В те...   Jul 10 2007, 15:05
||- - defunct   Цитата(prottoss @ Jul 10 2007, 18:05) Из...   Jul 10 2007, 16:09
||- - =GM=   Цитата(prottoss @ Jul 10 2007, 14:05) ДА ...   Jul 10 2007, 16:13
||- - prottoss   Цитата(=GM= @ Jul 11 2007, 00:13) А як же...   Jul 10 2007, 16:15
||- - defunct   Цитата(=GM= @ Jul 10 2007, 19:13) Не сбра...   Jul 10 2007, 16:21
||- - prottoss   Цитата(=GM= @ Jul 11 2007, 00:13) Не сбра...   Jul 10 2007, 16:38
||- - =GM=   Цитата(prottoss @ Jul 10 2007, 16:38) Бли...   Jul 10 2007, 22:35
||- - prottoss   Цитата(=GM= @ Jul 11 2007, 06:35) Здравст...   Jul 11 2007, 11:06
||- - SasaVitebsk   Цитата(=GM= @ Jul 11 2007, 01:35) Ну тепе...   Jul 12 2007, 22:30
||- - defunct   Цитата(SasaVitebsk @ Jul 13 2007, 01:30) ...   Jul 12 2007, 22:40
||- - =GM=   Цитата(SasaVitebsk @ Jul 12 2007, 21:30) ...   Jul 13 2007, 10:31
||- - SasaVitebsk   Цитата(=GM= @ Jul 13 2007, 13:31) Саша, у...   Jul 13 2007, 16:18
|- - =GM=   Цитата(prottoss @ Jul 10 2007, 12:14) Ну ...   Jul 10 2007, 15:10
|- - prottoss   Цитата(=GM= @ Jul 10 2007, 23:10) Про изв...   Jul 10 2007, 15:15
- - defunct   Цитата(AndryG @ Jul 10 2007, 08:28) Вот с...   Jul 10 2007, 09:59
- - defunct   ЦитатаНо у парня прерывание не по совпадению с OCR...   Jul 10 2007, 12:54
- - Elegorod   ЦитатаПосмотрите же даташит на t2313 наконец. Всем...   Jul 10 2007, 14:17
|- - prottoss   Цитата(Elegorod @ Jul 10 2007, 22:17) Все...   Jul 10 2007, 14:22
|- - defunct   Цитата(Elegorod @ Jul 10 2007, 17:17) В к...   Jul 10 2007, 14:28
|- - prottoss   Цитата(defunct @ Jul 10 2007, 22:28) Это ...   Jul 10 2007, 14:33
|- - defunct   Цитата(prottoss @ Jul 10 2007, 17:33) Oxo...   Jul 10 2007, 14:38
- - Elegorod   Тогда и в тексте описания ошибки, и во всем раздел...   Jul 10 2007, 14:34
- - kada   Вполне возможно, что дело в кварце. Столкнулись с ...   Jul 10 2007, 14:39
- - AndryG   Почитал я ветку ... и понял, что сейчас мне на оре...   Jul 11 2007, 05:25
- - олесь   Все верно,если на кварце 8.000, то частотомер, нап...   Jul 12 2007, 19:31
|- - singlskv   Цитата(олесь @ Jul 12 2007, 23:31) Все ве...   Jul 12 2007, 20:59
- - defunct   ЦитатаА вот всем вам вопрос на засыпку: зачем введ...   Jul 13 2007, 10:44
|- - =GM=   Цитата(defunct @ Jul 13 2007, 09:44) ЧИМ ...   Jul 13 2007, 11:31
|- - prottoss   Цитата(=GM= @ Jul 13 2007, 19:31) Это как...   Jul 13 2007, 11:53
|- - =GM=   Цитата(prottoss @ Jul 13 2007, 10:53) ШИМ...   Jul 13 2007, 15:23
|- - prottoss   Цитата(=GM= @ Jul 13 2007, 23:23) Мне каз...   Jul 13 2007, 15:38
|- - =GM=   Цитата(prottoss @ Jul 13 2007, 14:38) Я п...   Jul 13 2007, 16:33
|- - prottoss   Цитата(=GM= @ Jul 14 2007, 00:33) Ну хотя...   Jul 13 2007, 16:45
|- - =GM=   Цитата(prottoss @ Jul 13 2007, 15:45) Это...   Jul 13 2007, 21:38
|- - defunct   Цитата(=GM= @ Jul 14 2007, 00:38) 2) Где ...   Jul 13 2007, 22:27
|- - =GM=   Цитата(defunct @ Jul 13 2007, 22:27) Реги...   Jul 14 2007, 21:03
|- - defunct   Цитата(=GM= @ Jul 15 2007, 00:03) Ерунду ...   Jul 14 2007, 22:39
|- - =GM=   To defunct. Кажется понял наконец корень всех затр...   Jul 15 2007, 10:45
|- - prottoss   Цитата(=GM= @ Jul 15 2007, 18:45) то не в...   Jul 15 2007, 12:33
|- - =GM=   Цитата(prottoss @ Jul 15 2007, 12:33) При...   Jul 15 2007, 13:34
|- - defunct   Цитата(=GM= @ Jul 15 2007, 16:34) Слова в...   Jul 15 2007, 15:53
|- - =GM=   Цитата(defunct @ Jul 15 2007, 15:53) Пере...   Jul 15 2007, 16:43
|- - defunct   Цитата(=GM= @ Jul 15 2007, 19:43) Перечит...   Jul 15 2007, 22:04
- - GetSmart   Цитата(=GM=)Саша, у меня пара вопросов к вам, не з...   Jul 13 2007, 13:53


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

 


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


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