Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Tiny2313 нужна 1 сек. на таймер 0
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2
AndryG
Доброго времени суток.

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

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

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

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

_____
P.S.
Запскал HEX в Студии ... ставлю точку останова на вектор прерывания ...
прерывание вызывается каждые 64000 такта ... почти всегда, иногда выскакивает 64001 или
64002 - видать из-за длительных команд ... но потом всё выравнимается.
Правда симуляцию я запускал максимум на секунду - на моем компе на это около 30 минут :-)
А может это такая точность кварца? Слабо верится. Да! фузы верно настроены - проверял уже.
AndreyKeil
Цитата(AndryG @ Jul 9 2007, 01:46) *



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

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

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

130ppm многовато для обычного "кварца", должно быть не больше 30ppm.
Может быть конденсаторы на землю неправильные ?
Или кварц не расчитан например на 3V а только на 5.
Ну или у Вас там не кварц вобще... (иногда в малогабаритных девайсах используют
другие материалы с худшей точностью)
GetSmart
Тоже думаю, что виновата не программа, а точность кварца. Я бы попробовал исправить положение конденсаторами на кварце. Увеличить или уменьшить, один или оба.

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

Цитата(singlskv)
А откуда такая информация что у них точность выраженная в ppm лучше чем у обычных ?
Причём тут ppm? Речь о начальной точности кварца.
singlskv
Цитата(GetSmart @ Jul 9 2007, 02:18) *
Причём тут ppm? Речь о начальной точности кварца.

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

Ну кода то мы не видели, но ИМХО дело не в 124-125, иначе после такого изменения
ошибка будет ~1/125=0,008 - а это ну очень много...
ae_
Цитата(prottoss @ Jul 9 2007, 09:09) *
Мдя... И никто не сказал, что уход то из-за того, что делитель надо ставить не на 125, а на 124 - нулевой импульс тоже надо учитывать, так счетчик досчитывает до 125, включая 125-ый такт, в итоге - 126 реально посчитанных тактов и уход частотыsmile.gif

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

"Делитель на 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 кГц -- сам не помню откуда он.

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

И опять я уезжаю на весь день -- завтра обязательно подключусь.
defunct
Цитата(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
prottoss
Цитата(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 (Здесь бы я поставил смайлик с пистолетом у виска)
defunct
Цитата(prottoss @ Jul 10 2007, 13:27) *
Как из 8.000.000 Гц получить 125 Гц штатным прескалером счетчика ТС0 ???

OCR0 = 250
предделитель 256
имеем 8000000 / (250 * 256 ) = 125
prottoss
Цитата(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++;
...
=GM=
Цитата(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, чтобы инкрементировать секундный счетчик. На мой взгляд, данная неточность вкупе с неточностью кварца даёт искомую ошибку.

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



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

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

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

И не думал ехидничать, прошу прощения, если обидел. Хотел просто обратить внимание, что не следует шутить на тему смерти.
prottoss
Цитата(=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
=GM=
Цитата(prottoss @ Jul 10 2007, 11:29) *
Я хочу сказать, что человек не использует Output Compare Unit, а использует переполнение счетчика ТС0, неужели это не понятно???

Да откуда вы взяли, что он не использует Output Compare Unit? При его использовании установка флага переполнения счетчика ТС0 (и соответственно, возникновение прерывания по переполнению) возможна, например, когда биты WGM=001 или 101 (см. с. 79 документа 2543i).
defunct
Цитата
Но у парня прерывание не по совпадению с 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.
prottoss
Цитата(=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

ИМХО парень просто ошибся в расчетах. Будем ждать, что он скажет...
defunct
Цитата(prottoss @ Jul 10 2007, 16:14) *
Я не говорил, что флаг TOVF не установится вообще в режиме СТС, но это возможно если OCR1A = 0xFF.

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

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

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

Непонятно, каким образом прерывание вообще вызывается. Может, компилятор оптимизирует
defunct
Цитата(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. (иначе и быть не может, т.к. раз сбросился - значит переполнился)
prottoss
Цитата(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.
defunct
Цитата(Elegorod @ Jul 10 2007, 17:17) *
В конце секции читаем:

MAX = 255

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

TOP = 255
BOTTOM = 0
MAX = максимально достижимое значение определяемое OCR0A
prottoss
Цитата(defunct @ Jul 10 2007, 22:28) *
Это опечатка в даташите. Там должно быть:

TOP = 255
BOTTOM = 0
MAX = максимально достижимое значение определяемое OCR0A
Oxo smile.gif Это кто кроме Вас сказал? Во всех даташитах чтоль???
Elegorod
Тогда и в тексте описания ошибки, и во всем разделе "Таймеры" десятки ошибок. В ATmega8 datasheet все написано точно также.
Не может такого быть. MAX=255, TOP = OCR0A
defunct
Цитата(prottoss @ Jul 10 2007, 17:33) *
Oxo smile.gif Это кто кроме Вас сказал? Во всех даташитах чтоль???

Вы уже посмотрели прикрепленный тест?
В железе он ведет себя точно также как в симуляторе.
kada
Вполне возможно, что дело в кварце.
Столкнулись с этим однажды. В итоге поставили микросхему часов реального времени со встроенным кварцем.
=GM=
Цитата(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 секунды. Вот так, так что зря мы тут копья ломаем(:-).
prottoss
Цитата(defunct @ Jul 10 2007, 22:20) *
В тесте установлен режим CTC, OCR0A установлен в 250.
TOVF устанавливается в 1 непосредственно в момент сброса TCNT в 0. (иначе и быть не может, т.к. раз сбросился - значит переполнился)
07.gif Извините, милейший, но я в Вашем проекте ни слова, пардон, ни кода про СТС... Ерунда какая то - загрузили OCR1A значением - понятно, дальше в TCCR0B кинули (1 << WGM02)|1 - ???????? Вы сами даташит хоть одним глазом смотрели????????? lol.gif

Для СТС надо чтоб WGM01 = 1, WGM00 == 0 (это вообще в TCCR0А находится) WGM02 = 0 (А вот это находится в TCCR0B ) тогда все работает как надо.



А у Вас, как у того парня, счетчик досчитывает до OCR0A, генерит прерывание, едет дальше, переполняется, генерит переполнение, ну и так далее biggrin.gif



Вот Вам НАСТОЯЩИЙ ЦТС biggrin.gif biggrin.gif biggrin.gif



Цитата(=GM= @ Jul 10 2007, 22:55) *
Лехко. Ставите прескалер на 256, WGM=5 и OCR0A=125, тогда каждые 250 импульсов входной частоты будет возникать прерывание TOV0. Ну и поскольку входная частота для этого режима равна 8000/256=31.25 кГц, то прерывания по переполнению таймера0 будут возникать каждые 125 Гц, никаких чудес.
ДА УЖЖЖЖЖ..... Вы читали про WGM=5, то бишь PWM fase correct Mode? За 512 тактов счетчика у Вас будет ровно ДВА прерывания от OCR0A - разделите 512 на 2 и получите коэффициент деления счетчика 256... ГДЕ ТУТ ДЕЛЕНИЕ НА СТО ДВАДЦАТЬ ПЯТЬ??????????????

Дорогой мой друг, в PWM fase correct ТС не сбрасывается по совпадению с OCR, просто фаза выходного сигнала меняется smile.gif
=GM=
Цитата(prottoss @ Jul 10 2007, 12:14) *
Ну про такие извраты (извиняюсь) для получения одной секунды я вообще не думал

Про извраты. Вот когда в Phase Correct PWM mode по каждому прерыванию TOV0 будете писать число 6 в таймер0, а потом в регистр OCR0A - число 5, вот тогда будет изврат с большой буквы. И вы будете смеяться, но работать-таки будет...
prottoss
Цитата(=GM= @ Jul 10 2007, 23:10) *
Про извраты. Вот когда в Phase Correct PWM mode по каждому прерыванию TOV0 будете писать число 6 в таймер0, а потом в регистр OCR0A - число 5, вот тогда будет изврат с большой буквы. И вы будете смеяться, но работать-таки будет...
Нуну, Вы еще не рассказали про цикл с NOP для получения ровно одной секунды
defunct
Цитата(prottoss @ Jul 10 2007, 18:05) *
07.gif Извините, милейший, но я в Вашем проекте ни слова, пардон, ни кода про СТС... Ерунда какая то - загрузили OCR1A значением - понятно, дальше в TCCR0B кинули (1 << WGM02)|1 - ???????? Вы сами даташит хоть одним глазом смотрели????????? lol.gif

Да... уж.. действительно lol.gif
Ок, это я переел или недоспал ...

Остается только сказать - nice catch smile.gif

Гм.. похоже вы нашли очень вероятную причину глюка - ошибка-то примерно совпадает с изначально зарепорченной 6/ (256 * 256) = 0.000091.

Цитата
TCCR0B кинули (1 << WGM02)|1

это не по злому умыслу было, просто въелось что CTC - 3й бит TCCRxB как во многих других девайсах.
=GM=
Цитата(prottoss @ Jul 10 2007, 14:05) *
ДА УЖЖЖЖЖ..... Вы читали про WGM=5, то бишь PWM fase correct Mode? За 512 тактов счетчика у Вас будет ровно ДВА прерывания от OCR0A - разделите 512 на 2 и получите коэффициент деления счетчика 256...

А як жеж, читал два раза(:-)! Вам бы тоже не мешало, заодно и слово Fase подправили бы.

Я ж вам объясняю...популярно..., как работает Phase Correct PWM mode при WGM=5. Счётчик считает от BOTTOM=0 до TOP=OCR0A, потом направление счёта аппаратно меняется и он считает от TOP=OCR0A до BOTTOM=0, направление счёта опять меняется (взято прямо из описания doc2543i, с.73). При достижении BOTTOM=0 устанавливается флаг переполнения TOV0 и возникает ОДНО прерывание по переполнению таймера0.

При WGM=1 устройство работает точно так же, только TOP=0xFF. Действительно, в таком режиме будет деление на 256+256=512. Вы различие двух режимов WGM=1 и WGM=5 понимаете?

Я-то вам толкую про режим WGM=5 и TOP=125 (число, записанное в OCR0A). В этом случае TOV0 будет появляться каждые 125+125=250 импульсов входной частоты 31,25 кГц, т.е. TOV0 будет возникать с частотой 125 Гц.

Цитата(prottoss @ Jul 10 2007, 14:05) *
ГДЕ ТУТ ДЕЛЕНИЕ НА СТО ДВАДЦАТЬ ПЯТЬ??????????????

Да ёлы-палы, какие 125? Чтобы получить 125 Гц=8000000/256/250 прерывания, надо прескалер установить на 256, а таймер на 250, но никак на 125.

Цитата(prottoss @ Jul 10 2007, 14:05) *
Дорогой мой друг, в PWM fase correct ТС не сбрасывается по совпадению с OCR, просто фаза выходного сигнала меняется smile.gif

Не сбрасывается, ну и что? Он считает сначала вверх, потом вниз и устанавливает TOV0, который вы как раз и оспариваете, утверждая, что автор не может использовать прерывание по переполнению, поскольку он использует режим сравнения.
prottoss
Цитата(=GM= @ Jul 11 2007, 00:13) *
А як жеж, читал два раза(:-)! Вам бы тоже не мешало, заодно и слово Fase подправили бы.
Сорриsmile.gif Исправлюсь
defunct
Цитата(=GM= @ Jul 10 2007, 19:13) *
Не сбрасывается, ну и что? Он считает сначала вверх, потом вниз и устанавливает TOV0, который вы как раз и оспариваете, утверждая, что автор не может использовать прерывание по переполнению, поскольку он использует режим сравнения.

Сорри что влажу в ваш спор, приведу только цитату из самого первого поста:

Цитата
Прерывание по совпадению и автоматическая очистка счетчика при условии сравнения.
prottoss
Цитата(=GM= @ Jul 11 2007, 00:13) *
Не сбрасывается, ну и что? Он считает сначала вверх, потом вниз и устанавливает TOV0, который вы как раз и оспариваете, утверждая, что автор не может использовать прерывание по переполнению, поскольку он использует режим сравнения.
Блин... Вы опять все сног на голову. Я ничего не утверждал. Я просто прицепился к тому, что в маленькой песчинке smile.gif исходного кода было показано прерывание по переполнению, при этом говорилось, что прескалер = 256, счетчик автоматически сбрасывается при достижении значения 125. По коду я понял, что счетчик, это переменная time, которая и сбрасывается "автоматически"...Хоят по коду соооовсем не видно, где эта переменная делает ++.



Самое главное, что завтра, по прочтенни данного топика автор многое узнает smile.gif ... Во первых узнает, как люди ломают копья над неосвещенными вопросами. Во вторых ознакомится с режимами работы ТС0 и , думаю, для него много прояснится. smile.gif
=GM=
Цитата(prottoss @ Jul 10 2007, 16:38) *
Блин... Вы опять все с ног на голову. Я ничего не утверждал

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

Вам было сказано, что вывод неверен, что Output Compare Unit МОЖНО использовать вместе с прерыванием TOV0, при этом частота прерываний таймера0 по переполнению будет 125 Гц.

Далее вам было показано, что нужно сделать (пост #33)
Цитата(=GM= @ Jul 10 2007, 14:55) *
Лехко. Ставите прескалер на 256, WGM=5 и OCR0A=125, тогда каждые 250 импульсов входной частоты будет возникать прерывание TOV0. Ну и поскольку входная частота для этого режима равна 8000/256=31.25 кГц, то прерывания по переполнению таймера0 будут возникать каждые 125 Гц, никаких чудес


И после этого говорить, что ничего не утверждали? Ну теперь-то согласны, что можно (но не обязательно нужно) легко, непринуждённо и без всяких извратов получить 125-ти герцовое прерывание по переполнению, используя Output Compare Unit в режиме Phase Correct PWM?

(Для ссылок см. посты #13, #17, #19, #22, #33, #34, #38, #41)
AndryG
Почитал я ветку ... и понял, что сейчас мне на орехи достанется :-)
Меня в командировку сорвали - вот и не смог участвовать ... и кусок кода я с старой версии взял да поправил ... и предназначался он для ответа, "что такое делитель на 125" ... а с прерыванием протупил.

Как тут писалось на форуме, тоже попался с "бит 3 & CTC" -> пришлось в даташит залазить.

Для ясности приведу куски с рабочего проекта.
Инициализация:
Код
TCCR0A=0x02;
TCCR0B=0x04;
TCNT0=0x00;
OCR0A=0xF9;
OCR0B=0x00;


И само прерывание
Код
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
times++;                        
if (times < 125)
  goto tim0_ovf_ret;
times = 0x00;
realtime.s++;
//--------------------------Секунда!            
new_second = 1;
//конец новой секунды
tim0_ovf_ret:
}


Почитав ветку, увидел такие точки зрения, которые мне бы и в голову никогда не пришли ... спасибо вам всем ... сейчас буду вчитываться, да пробовать.
Прошу прощения за созданные неоднозначности.
prottoss
Цитата(=GM= @ Jul 11 2007, 06:35) *
Здравствуйте вам! Как же вы ничего не утверждали, когда в посте #19 вы говорите
Вам было сказано, что вывод неверен, что Output Compare Unit МОЖНО использовать вместе с прерыванием TOV0, при этом частота прерываний таймера0 по переполнению будет 125 Гц.
Далее вам было показано, что нужно сделать (пост #33)
И после этого говорить, что ничего не утверждали? Ну теперь-то согласны, что можно (но не обязательно нужно) легко, непринуждённо и без всяких извратов получить 125-ти герцовое прерывание по переполнению, используя Output Compare Unit в режиме Phase Correct PWM?
(Для ссылок см. посты #13, #17, #19, #22, #33, #34, #38, #41)
Да уж, погорячился я маненькоsmile.gif Сорри. Почему то забыл что PHASE Correct PWM есть двух типов - первый (PWM = 1), при котором счетчик считает от 0 до МАХ и далее от МАХ и до 0; второй (PWM = 5) соответсвенно от 0 до OCRnA до и далее от OCRnA до 0.

Да и не подумал я, что человек таким хитрым способом будет получать 1 секунду. Зачем PWM c возможностью изменения частоты, если есть простой СТС. Вот о чем я думал, когда спорил... smile.gif
oles_k76
Все верно,если на кварце 8.000, то частотомер, например Ч3-66 покажет 8 000 122Гц, сам вот вожус с подобной проблеммой.
Купили кварцевый генератор,без даташита, на нем было написано 10.0000
Оказалось что при 5в питании частотомер показал 10 000 146Гц а вот при 3В 10 000 081Гц
опытным путем проверил всю партию. Оказалось все параметры оптимизированы на 3В-3.3В
singlskv
Цитата(олесь @ Jul 12 2007, 23:31) *
Все верно,если на кварце 8.000, то частотомер, например Ч3-66 покажет 8 000 122Гц, сам вот вожус с подобной проблеммой.
Купили кварцевый генератор,без даташита, на нем было написано 10.0000
Оказалось что при 5в питании частотомер показал 10 000 146Гц а вот при 3В 10 000 081Гц
опытным путем проверил всю партию. Оказалось все параметры оптимизированы на 3В-3.3В

Это Вы о чем ???
Если о этом:
Цитата
Цитата
Кварц маркирован .... 8 000 кГц

с такой маркировкой частота стабилизации кварца может быть в пределах
от
8, 000.000 Mhz
до
8, 000.999 Mhz
То ИМХО, это некоторое заблуждение считать, что чем больше нулей указанно после
запятой, тем кварц точнее.

Прикинем для Вашего случая:
8 000 122 при номинальной 8 000 000
итого ошибка 122 /8 000 000 = 15,25 * 10(-6)
то есть всего 15 ppm (15 милионных долей)
для стандартных(не термостабилизированных, состаренных, и тд) кварцев
нормальным является отклонение частоты от базовой <30ppm при нормальной температуре(25С)
Так что Ваш резонатор, впрочем как и генератор, вполне прошли тест smile.gif

Посчитаем что получится для Вашего кварца за сутки:
60*60*24*122/8 000 000 = 1,3176 сек
Если не устраивает, пытайтесь подобрать емкости,
только имейте в виду, если для задачи нужна реально большая точность,
то тогда однозначно начинаем смотреть в сторону термостабилизированных,
состаренных и тд кварцев(а лучше готовых генераторов). Только стоить это будет ....

Вот для примера ссылка по параметрам отечественных кварцев (простых):
http://www.symmetron.ru/suppliers/resonators/rezonator.pdf

У импортных(простых) все примерно так же.
SasaVitebsk
Цитата(=GM= @ Jul 11 2007, 01:35) *
Ну теперь-то согласны, что можно (но не обязательно нужно) легко, непринуждённо и без всяких извратов получить 125-ти герцовое прерывание по переполнению, используя Output Compare Unit в режиме Phase Correct PWM?


С удовольствием почитал Ваши изыски. Хочется отметить, что Вы безусловно знаете толк в извращениях. Ну я в э.... хорошем смысле этого слова. biggrin.gif

Я бы не додумался. Всё таки чёткое знание работы переферии помогает ... выкрутится из любой ситуации. А парень, как и следовало ожидать, ответил просто - блин, я ж не ту программу вам послал. smile.gif Поздно, она уже у нас заработала! smile.gif

Фактически можно послать любой кусок старой программы и, подписавшись чужим именем, с помощью провокаций, умело поддерживать тему. Ч/з две недели искомая программа будет написана. smile.gif prottoss-а нужно сильно разозлить, высказать неуважение к его знаниям. Если удастся задеть за живое - он к вечеру проект готовый и отлаженный выложит. Всю работу закинет, а это сделает! smile.gif

lol.gif
defunct
Цитата(SasaVitebsk @ Jul 13 2007, 01:30) *
(=GM= @ Jul 11 2007, 01:35)
С удовольствием почитал Ваши изыски. Хочется отметить, что Вы безусловно знаете толк в извращениях. Ну я в э.... хорошем смысле этого слова. biggrin.gif

lol.gif

"я злой и страшный, серый волк,
я в ИзвращеньЯх знаю толк"

© Мурзилка из Красная Шапочка (приключения Кати Очкаревой)
=GM=
Цитата(SasaVitebsk @ Jul 12 2007, 21:30) *
С удовольствием почитал Ваши изыски. Хочется отметить, что Вы безусловно знаете толк в извращениях. Ну я в э.... хорошем смысле этого слова. biggrin.gif

(С)Француженка, быть может, мать твоя...(:-) Ну я б чё-нибудь другое сказал про извраты, но модераторы у нас строгие, пришли на ум слова из песни, Гарик Сукачёв поёт.

Цитата(SasaVitebsk @ Jul 12 2007, 21:30) *
Я бы не додумался. Всё таки чёткое знание работы переферии помогает ... выкрутится из любой ситуации. А парень, как и следовало ожидать, ответил просто - блин, я ж не ту программу вам послал. smile.gif Поздно, она уже у нас заработала! smile.gif

Ну, разработчик систем с встроенным микроконтроллером (или имбеддер на англицкий манер) волей-неволей должен знать оборудование, с которым он работает, и вдумчиво его использовать, иначе это будет не езда, а ёрзанье(:-). Последних надо бы называть ёрзальщиками(:-).

А вот всем вам вопрос на засыпку: зачем введён такой режим WGM=5?

Цитата(SasaVitebsk @ Jul 12 2007, 21:30) *
prottoss'а нужно сильно разозлить, высказать неуважение к его знаниям. Если удастся задеть за живое - он к вечеру проект готовый и отлаженный выложит. Всю работу закинет, а это сделает! smile.gif

Ну prottoss'а никто не злил, по крайней мере не с моей стороны, на мой взгляд, его есть за что уважать.
Проттосс, не злись, денег не будет(:-).

Саша, у меня пара вопросов к вам, не знаю, может новую ветку открыть, ну как получится. Какие сейчас модны (и востребованы) драйверы для светодиодов для панно, ну и цены тоже интересно...Никогда этим не занимался, а тут нашёл интересное (и дешёвое, вроде бы) решение - один чип управляет током 8-16 диодов со средним током до 70 мА на диод и никаких внешних элементов...Что скажете?

Цитата(defunct @ Jul 12 2007, 21:40) *
"я злой и страшный, серый волк,
я в ИзвращеньЯх знаю толк"
© Мурзилка из Красная Шапочка (приключения Кати Очкаревой)

Мне больше нравится из Красной Пашечки: ...вдали проковылял хромой заяц с явными признаками цирроза печени, волк привалился к березе и дал дуба.
defunct
Цитата
А вот всем вам вопрос на засыпку: зачем введён такой режим WGM=5?

ЧИМ + ШИМ.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.