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

 
 
5 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Tiny2313 нужна 1 сек. на таймер 0, "Уходит" время :(
=GM=
сообщение Jul 10 2007, 11:21
Сообщение #16


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
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #18


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
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #20


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
defunct
сообщение Jul 10 2007, 12:54
Сообщение #21


кекс
******

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



Цитата
Но у парня прерывание не по совпадению с OCR0, а ПО ПЕРЕПОЛНЕНИЮ.

Флаг TOVF устанавливается при достижении максимального значения в режиме CTC
Смотреть даташит таблица 40

Код
Mode    TOP       Update      TOVF
CTC   OCR0A   Immediate   MAX



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


Можно использовать любое прерывание из OCA / TOVF - результат будет одинаковым в режиме CTC.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 10 2007, 13:14
Сообщение #22


Гуру
******

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


кекс
******

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



Цитата(prottoss @ Jul 10 2007, 16:14) *
Я не говорил, что флаг TOVF не установится вообще в режиме СТС, но это возможно если OCR1A = 0xFF.

Это происходит при любом значении OCR0A.
В CTC режиме TOVF устанавливается при TCNT == OCR0A
Посмотрите же даташит на t2313 наконец.
В CTC режиме события OCA и OVF происходят синхронно. Можете и на эмуляторе проверить заодно.

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

всяко может быть.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 10 2007, 13:31
Сообщение #24


Гуру
******

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



Цитата(defunct @ Jul 10 2007, 21:19) *
Это происходит при любом значении OCR0A.
В CTC режиме TOVF устанавливается при TCNT == OCR0A
Посмотрите же даташит на t2313 наконец.
В CTC режиме события OCA и OVF происходят синхронно. Можете и на эмуляторе проверить заодно.
Да ни в жисть не поверю пока носом не ткнете - еще раз утверждаю флаг TOVF = 1, только если ТС0 = 0xFF!!!


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


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 2-02-07
Пользователь №: 24 993



Цитата
Посмотрите же даташит на t2313 наконец.

Всем еще раз нужно заглянуть в datasheet на ATtiny2313.
На рисунке "Figure 31. CTC Mode, Timing Diagram" видно, когда "OCnx Interrupt Flag Set." Надписи "TOVn Interrupt Flag Set" вообще нет, так как прерывание по переполнению никогда не срабатывает.
В конце секции читаем:
Цитата
As for the Normal mode of operation, the TOV0 Flag is set in the same timer clock cycle that the counter counts from MAX to 0x00.

MAX = 255
Если OCR0A < 255, счетчик никогда не досчитывает до 255.

Непонятно, каким образом прерывание вообще вызывается. Может, компилятор оптимизирует
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 10 2007, 14:20
Сообщение #26


кекс
******

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



Цитата(prottoss @ Jul 10 2007, 16:31) *
Да ни в жисть не поверю пока носом не ткнете - еще раз утверждаю флаг TOVF = 1, только если ТС0 = 0xFF!!!

В прикрепленном архиве проект avr-studio для эмуляции поведения TOVF.
Загрузите test.aps в Avr-Studio, в открышемся ASM файле должны быть расставлены точки останова на строки

rjmp TIM0_OVF ; Timer0 Overflow Handler
и
rjmp TIM0_COMPA ; Timer0 Compare A Handler

если точки останова почему-то потерялись - поставьте их вручную.

Откомпилируйте проект и запустите. Сработает первая точка останова (на строке COMPA), после этого идите по шагам, и внимательно проследите за TOVF таймера 0. Если облом следить - то просто запустите тест дальше - и вы попадете во вторую точку останова - прерывание по OVF.

В тесте установлен режим CTC, OCR0A установлен в 250.
TOVF устанавливается в 1 непосредственно в момент сброса TCNT в 0. (иначе и быть не может, т.к. раз сбросился - значит переполнился)
Прикрепленные файлы
Прикрепленный файл  Test.zip ( 1.87 килобайт ) Кол-во скачиваний: 29
 
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 10 2007, 14:22
Сообщение #27


Гуру
******

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



Цитата(Elegorod @ Jul 10 2007, 22:17) *
Всем еще раз нужно заглянуть в datasheet на ATtiny2313.
На рисунке "Figure 31. CTC Mode, Timing Diagram" видно, когда "OCnx Interrupt Flag Set." Надписи "TOVn Interrupt Flag Set" вообще нет, так как прерывание по переполнению никогда не срабатывает.
В конце секции читаем:

MAX = 255
Если OCR0A < 255, счетчик никогда не досчитывает до 255.
Вот вот, и я о том же. В PWM mode, такое будет, так как счетик в любом случае достигнет MAX, то бишь 0xFF (как и указано в даташите). В СТС режиме только если OCR0A = 0xFF.


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


кекс
******

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



Цитата(Elegorod @ Jul 10 2007, 17:17) *
В конце секции читаем:

MAX = 255

Это опечатка в даташите. Там должно быть:

TOP = 255
BOTTOM = 0
MAX = максимально достижимое значение определяемое OCR0A
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 10 2007, 14:33
Сообщение #29


Гуру
******

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



Цитата(defunct @ Jul 10 2007, 22:28) *
Это опечатка в даташите. Там должно быть:

TOP = 255
BOTTOM = 0
MAX = максимально достижимое значение определяемое OCR0A
Oxo smile.gif Это кто кроме Вас сказал? Во всех даташитах чтоль???


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


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 2-02-07
Пользователь №: 24 993



Тогда и в тексте описания ошибки, и во всем разделе "Таймеры" десятки ошибок. В ATmega8 datasheet все написано точно также.
Не может такого быть. MAX=255, TOP = OCR0A
Go to the top of the page
 
+Quote Post

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

 


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


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