|
|
  |
Tiny2313 нужна 1 сек. на таймер 0, "Уходит" время :( |
|
|
|
Jul 8 2007, 19:46
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317

|
Доброго времени суток. Контроллер - Tiny2313 Частота - 8МГц Компилятор - CVAVR 1.25.2b1 Одна из функций устройства - подсчет текущего времени. Используется таймер 0 (второй уже недоступен). Прерывание по совпадению и автоматическая очистка счетчика при условии сравнения. С предделителем 256 получаю частоту прерыания ровно 125Гц (64000 тактов) И в прерывании делитель ставлю на 125. Вроде всё верно, но за 8,5 часов часики удрали на 4 секунды  Устройство активно работает с внутренней EEPROM. Вот тут и начинаются вопросы ... - если прерывание таймера возникает при их глобальном запрещении, или выполнении "длинных" команд, то прерывание вызовется с задержкой ... сбивается ли при этом счетчик циклов в таймере? - кто что может посоветовать? _____ P.S. Запскал HEX в Студии ... ставлю точку останова на вектор прерывания ... прерывание вызывается каждые 64000 такта ... почти всегда, иногда выскакивает 64001 или 64002 - видать из-за длительных команд ... но потом всё выравнимается. Правда симуляцию я запускал максимум на секунду - на моем компе на это около 30 минут :-) А может это такая точность кварца? Слабо верится. Да! фузы верно настроены - проверял уже.
|
|
|
|
|
Jul 8 2007, 20:09
|
Частый гость
 
Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930

|
Цитата(AndryG @ Jul 9 2007, 01:46)  Режим работы таймера "Сброс по совпадению" использует значение, которое записано в регистре захвата или в регистре сравнения. Уточните значение этого регистра. Далее, непонятно значение фразы "...делитель ставлю на 125". Делителя на 125 вообще нет. Есть на 8, 32, 64, .. и т.д. Отвечу на вопрос о сбивании таймера - если таймер не останавливать, то значение счета в нем не сбивается. Запрет/разрешение прерываний здесь не влияет. Кварц какой используете - внутренний или внешний?
|
|
|
|
|
Jul 8 2007, 21:18
|

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

|
Цитата(AndreyKeil @ Jul 8 2007, 23:09)  Кварц какой используете - внутренний или внешний? Кварц разве внутренний бывает? Цитата(AndryG @ Jul 8 2007, 22:46)  Контроллер - Tiny2313 Частота - 8МГц Одна из функций устройства - подсчет текущего времени. Вроде всё верно, но за 8,5 часов часики удрали на 4 секунды  А может это такая точность кварца? Слабо верится. Да! фузы верно настроены - проверял уже. Это такая точность кварца. Часовые кварцы иногда уходят также, а то и больше, а у вас обычный... 8.5 часов = 3600s * 8.5 = 30600 sec погрешность счета 4/30600 = 0.00013 если кварц у вас маркирован как 8.000Mhz - то погрешность в пределах нормы. Цитата - кто что может посоветовать? На мой взгляд проще всего сделать программную коррекцию часов. Тобиш, если 4 секунды теряется за ~8 часов, вы можете каждые два часа подводить часы на 1 секунду в сторону противоположную уходу времени. Цитата Устройство активно работает с внутренней EEPROM. Вот тут и начинаются вопросы ... - если прерывание таймера возникает при их глобальном запрещении, или выполнении "длинных" команд, то прерывание вызовется с задержкой ... сбивается ли при этом счетчик циклов в таймере? задержка обработки прерывания не важна, важно - не пропустить прерывание. Если у вас в системе прерывания запрещаются на время большее чем интервал между прерываниями от T0 (1/125 sec) - то тогда счетчик циклов будет сбиваться (опаздывать), т.к. некоторые прерывания будут пропущены. Если у вас прерывания запрещаются ненадолго (много меньше чем 1/125 сек), то тогда можете быть спокойны - программных сбоев быть не должно.
|
|
|
|
|
Jul 8 2007, 22:12
|
дятел
    
Группа: Свой
Сообщений: 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. Ну или у Вас там не кварц вобще... (иногда в малогабаритных девайсах используют другие материалы с худшей точностью)
|
|
|
|
|
Jul 8 2007, 22:18
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Тоже думаю, что виновата не программа, а точность кварца. Я бы попробовал исправить положение конденсаторами на кварце. Увеличить или уменьшить, один или оба. Была у меня ситуация, тока с часовым кварцем. Убегал на несколько секунд в день. Около него стояли кондёры где-то на 12 или 15 пф. После перепайки обоих на 22 пф разбег уменьшился раз в десять. Цитата(singlskv) А откуда такая информация что у них точность выраженная в ppm лучше чем у обычных ? Причём тут ppm? Речь о начальной точности кварца.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 8 2007, 22:27
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(GetSmart @ Jul 9 2007, 02:18)  Причём тут ppm? Речь о начальной точности кварца. Начальная тоже в ppm указывается (допустимый разброс). И насколько я ничего не знаю, у часовых кварцев при прочих равных этот параметр хуже чем у "обычных"...
|
|
|
|
|
Jul 9 2007, 00:39
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(prottoss @ Jul 9 2007, 04:09)  Мдя... И никто не сказал, что уход то из-за того, что делитель надо ставить не на 125, а на 124 - нулевой импульс тоже надо учитывать, так счетчик досчитывает до 125, включая 125-ый такт, в итоге - 126 реально посчитанных тактов и уход частоты  Ну кода то мы не видели, но ИМХО дело не в 124-125, иначе после такого изменения ошибка будет ~1/125=0,008 - а это ну очень много...
|
|
|
|
|
Jul 9 2007, 00:47
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Цитата(prottoss @ Jul 9 2007, 09:09)  Мдя... И никто не сказал, что уход то из-за того, что делитель надо ставить не на 125, а на 124 - нулевой импульс тоже надо учитывать, так счетчик досчитывает до 125, включая 125-ый такт, в итоге - 126 реально посчитанных тактов и уход частоты  Начал отвечать про 124-125, но singlskv опередил Да и автор вопроса сообщил, что прогонял на симуляторе - всё нормально, 64000 тактов.
|
|
|
|
|
Jul 10 2007, 05:28
|
Частый гость
 
Группа: Свой
Сообщений: 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 кГц -- сам не помню откуда он. На счет конденсаторов идею подали -- поколупаю .. вот только бы знать в какую сторону ... может ссылка у кого есть? И опять я уезжаю на весь день -- завтра обязательно подключусь.
|
|
|
|
|
Jul 10 2007, 09:59
|

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

Гуру
     
Группа: Свой
Сообщений: 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++; ... Че то я совсем запутался  Как из 8.000.000 Гц получить 125 Гц штатным прескалером счетчика ТС0 ??? Если учесть, что в первом посте чел поставил прескалер на 256, то имеем частоту входных импульсов ТС0 - 31.250 Гц. Далее, раз выбрано прерывание по переполнению и Output Compare Unit c OCR0A не задействован, следовательно прерывание вызывается с частотой 31250/256 = 122,0307 Гц  (Здесь бы я поставил смайлик с пистолетом у виска)
--------------------
|
|
|
|
|
Jul 10 2007, 11:21
|

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

|
Цитата(prottoss @ Jul 10 2007, 09:27)  Че то я совсем запутался  Как из 8.000.000 Гц получить 125 Гц штатным прескалером счетчика ТС0 ??? Если учесть, что в первом посте чел поставил прескалер на 256, то имеем частоту входных импульсов ТС0 - 31.250 Гц. Далее, раз выбрано прерывание по переполнению и Output Compare Unit c OCR0A не задействован, следовательно прерывание вызывается с частотой 31250/256 = 122,0307 Гц  (Здесь бы я поставил смайлик с пистолетом у виска) Вы сами себя запутали. Чел пишет, что выбрано "прерывание по совпадению и автоматическая очистка счетчика при условии сравнения. С предделителем 256 получаю частоту прерывания ровно 125 Гц (64000 тактов). И в прерывании делитель ставлю на 125" Чтобы получить 125 Гц ему надо поставить счётчик на 31250/125=250. А вот дальше начинаются непонятки. Из приведенного фрагмента видно, где сбрасывается переменная times, но не видно, где она инкрементируется. То есть непонятно, на сколько делится 125-ти герцовое прерывание - на 125 или 126, чтобы инкрементировать секундный счетчик. На мой взгляд, данная неточность вкупе с неточностью кварца даёт искомую ошибку. И не надо так шутить "с пистолетом у виска", вы ещё не на все вопросы по программатору ответили(:-).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 10 2007, 11:31
|

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

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

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)  По программатору предлагаю ехидничать в соответствующей ветке, дабы не засорять топик  И не думал ехидничать, прошу прощения, если обидел. Хотел просто обратить внимание, что не следует шутить на тему смерти.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 10 2007, 12:29
|

Гуру
     
Группа: Свой
Сообщений: 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
--------------------
|
|
|
|
|
Jul 10 2007, 12:40
|

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).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 10 2007, 12:54
|

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

Гуру
     
Группа: Свой
Сообщений: 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 Гц. По этому я эти режимы и возможности не привел - для меня это было очевидно. ИМХО парень просто ошибся в расчетах. Будем ждать, что он скажет...
--------------------
|
|
|
|
|
Jul 10 2007, 13:19
|

кекс
     
Группа: Свой
Сообщений: 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 происходят синхронно. Можете и на эмуляторе проверить заодно. Цитата ИМХО парень просто ошибся в расчетах. Будем ждать, что он скажет... всяко может быть.
|
|
|
|
|
Jul 10 2007, 14:17
|
Участник

Группа: Новичок
Сообщений: 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. Непонятно, каким образом прерывание вообще вызывается. Может, компилятор оптимизирует
|
|
|
|
|
Jul 10 2007, 14:20
|

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

Гуру
     
Группа: Свой
Сообщений: 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.
--------------------
|
|
|
|
|
Jul 10 2007, 14:28
|

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

|
Цитата(Elegorod @ Jul 10 2007, 17:17)  В конце секции читаем:
MAX = 255 Это опечатка в даташите. Там должно быть: TOP = 255 BOTTOM = 0 MAX = максимально достижимое значение определяемое OCR0A
|
|
|
|
|
Jul 10 2007, 14:34
|
Участник

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

|
Тогда и в тексте описания ошибки, и во всем разделе "Таймеры" десятки ошибок. В ATmega8 datasheet все написано точно также. Не может такого быть. MAX=255, TOP = OCR0A
|
|
|
|
|
Jul 10 2007, 14:55
|

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 секунды. Вот так, так что зря мы тут копья ломаем(:-).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 10 2007, 15:05
|

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

|
Цитата(defunct @ Jul 10 2007, 22:20)  В тесте установлен режим CTC, OCR0A установлен в 250. TOVF устанавливается в 1 непосредственно в момент сброса TCNT в 0. (иначе и быть не может, т.к. раз сбросился - значит переполнился)  Извините, милейший, но я в Вашем проекте ни слова, пардон, ни кода про СТС... Ерунда какая то - загрузили OCR1A значением - понятно, дальше в TCCR0B кинули (1 << WGM02)|1 - ???????? Вы сами даташит хоть одним глазом смотрели????????? Для СТС надо чтоб WGM01 = 1, WGM00 == 0 (это вообще в TCCR0А находится) WGM02 = 0 (А вот это находится в TCCR0B ) тогда все работает как надо. А у Вас, как у того парня, счетчик досчитывает до OCR0A, генерит прерывание, едет дальше, переполняется, генерит переполнение, ну и так далее Вот Вам НАСТОЯЩИЙ ЦТС Цитата(=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, просто фаза выходного сигнала меняется
Прикрепленные файлы
Test.rar ( 839 байт )
Кол-во скачиваний: 33
--------------------
|
|
|
|
|
Jul 10 2007, 16:09
|

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

|
Цитата(prottoss @ Jul 10 2007, 18:05)   Извините, милейший, но я в Вашем проекте ни слова, пардон, ни кода про СТС... Ерунда какая то - загрузили OCR1A значением - понятно, дальше в TCCR0B кинули (1 << WGM02)|1 - ???????? Вы сами даташит хоть одним глазом смотрели?????????  Да... уж.. действительно Ок, это я переел или недоспал ... Остается только сказать - nice catch  Гм.. похоже вы нашли очень вероятную причину глюка - ошибка-то примерно совпадает с изначально зарепорченной 6/ (256 * 256) = 0.000091. Цитата TCCR0B кинули (1 << WGM02)|1 это не по злому умыслу было, просто въелось что CTC - 3й бит TCCRxB как во многих других девайсах.
|
|
|
|
|
Jul 10 2007, 16:13
|

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

|
Цитата(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, просто фаза выходного сигнала меняется  Не сбрасывается, ну и что? Он считает сначала вверх, потом вниз и устанавливает TOV0, который вы как раз и оспариваете, утверждая, что автор не может использовать прерывание по переполнению, поскольку он использует режим сравнения.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 10 2007, 16:38
|

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

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

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

|
Цитата(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)
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 11 2007, 05:25
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317

|
Почитал я ветку ... и понял, что сейчас мне на орехи достанется :-) Меня в командировку сорвали - вот и не смог участвовать ... и кусок кода я с старой версии взял да поправил ... и предназначался он для ответа, "что такое делитель на 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: } Почитав ветку, увидел такие точки зрения, которые мне бы и в голову никогда не пришли ... спасибо вам всем ... сейчас буду вчитываться, да пробовать. Прошу прощения за созданные неоднозначности.
|
|
|
|
|
Jul 11 2007, 11:06
|

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

|
Цитата(=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) Да уж, погорячился я маненько  Сорри. Почему то забыл что PHASE Correct PWM есть двух типов - первый (PWM = 1), при котором счетчик считает от 0 до МАХ и далее от МАХ и до 0; второй (PWM = 5) соответсвенно от 0 до OCRnA до и далее от OCRnA до 0. Да и не подумал я, что человек таким хитрым способом будет получать 1 секунду. Зачем PWM c возможностью изменения частоты, если есть простой СТС. Вот о чем я думал, когда спорил...
--------------------
|
|
|
|
|
Jul 12 2007, 20:59
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(олесь @ 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С) Так что Ваш резонатор, впрочем как и генератор, вполне прошли тест Посчитаем что получится для Вашего кварца за сутки: 60*60*24*122/8 000 000 = 1,3176 сек Если не устраивает, пытайтесь подобрать емкости, только имейте в виду, если для задачи нужна реально большая точность, то тогда однозначно начинаем смотреть в сторону термостабилизированных, состаренных и тд кварцев(а лучше готовых генераторов). Только стоить это будет .... Вот для примера ссылка по параметрам отечественных кварцев (простых): http://www.symmetron.ru/suppliers/resonators/rezonator.pdfУ импортных(простых) все примерно так же.
|
|
|
|
|
Jul 12 2007, 22:30
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(=GM= @ Jul 11 2007, 01:35)  Ну теперь-то согласны, что можно (но не обязательно нужно) легко, непринуждённо и без всяких извратов получить 125-ти герцовое прерывание по переполнению, используя Output Compare Unit в режиме Phase Correct PWM? С удовольствием почитал Ваши изыски. Хочется отметить, что Вы безусловно знаете толк в извращениях. Ну я в э.... хорошем смысле этого слова. Я бы не додумался. Всё таки чёткое знание работы переферии помогает ... выкрутится из любой ситуации. А парень, как и следовало ожидать, ответил просто - блин, я ж не ту программу вам послал.  Поздно, она уже у нас заработала! Фактически можно послать любой кусок старой программы и, подписавшись чужим именем, с помощью провокаций, умело поддерживать тему. Ч/з две недели искомая программа будет написана. prottoss-а нужно сильно разозлить, высказать неуважение к его знаниям. Если удастся задеть за живое - он к вечеру проект готовый и отлаженный выложит. Всю работу закинет, а это сделает!
|
|
|
|
|
Jul 13 2007, 10:31
|

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

|
Цитата(SasaVitebsk @ Jul 12 2007, 21:30)  С удовольствием почитал Ваши изыски. Хочется отметить, что Вы безусловно знаете толк в извращениях. Ну я в э.... хорошем смысле этого слова.  (С)Француженка, быть может, мать твоя...(:-) Ну я б чё-нибудь другое сказал про извраты, но модераторы у нас строгие, пришли на ум слова из песни, Гарик Сукачёв поёт. Цитата(SasaVitebsk @ Jul 12 2007, 21:30)  Я бы не додумался. Всё таки чёткое знание работы переферии помогает ... выкрутится из любой ситуации. А парень, как и следовало ожидать, ответил просто - блин, я ж не ту программу вам послал.  Поздно, она уже у нас заработала!  Ну, разработчик систем с встроенным микроконтроллером (или имбеддер на англицкий манер) волей-неволей должен знать оборудование, с которым он работает, и вдумчиво его использовать, иначе это будет не езда, а ёрзанье(:-). Последних надо бы называть ёрзальщиками(:-). А вот всем вам вопрос на засыпку: зачем введён такой режим WGM=5? Цитата(SasaVitebsk @ Jul 12 2007, 21:30)  prottoss'а нужно сильно разозлить, высказать неуважение к его знаниям. Если удастся задеть за живое - он к вечеру проект готовый и отлаженный выложит. Всю работу закинет, а это сделает!  Ну prottoss'а никто не злил, по крайней мере не с моей стороны, на мой взгляд, его есть за что уважать. Проттосс, не злись, денег не будет(:-). Саша, у меня пара вопросов к вам, не знаю, может новую ветку открыть, ну как получится. Какие сейчас модны (и востребованы) драйверы для светодиодов для панно, ну и цены тоже интересно...Никогда этим не занимался, а тут нашёл интересное (и дешёвое, вроде бы) решение - один чип управляет током 8-16 диодов со средним током до 70 мА на диод и никаких внешних элементов...Что скажете? Цитата(defunct @ Jul 12 2007, 21:40)  "я злой и страшный, серый волк, я в ИзвращеньЯх знаю толк" © Мурзилка из Красная Шапочка (приключения Кати Очкаревой) Мне больше нравится из Красной Пашечки: ...вдали проковылял хромой заяц с явными признаками цирроза печени, волк привалился к березе и дал дуба.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 13 2007, 11:53
|

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

|
Цитата(=GM= @ Jul 13 2007, 19:31)  Это как? оччччччь просто ШИМ (широтно-импульсная модуляция) aka WGM = 0x01: Меняется длительность импульса при неизменной частоте - производится при помощи изменения содержимого регистра OCRnx ЧИМ (частотно-импульсная модуляция) aka WGM = 0x05: Меняется длительность импульса пропорционально частоте - так же при помощи OCRnx
--------------------
|
|
|
|
|
Jul 13 2007, 13:53
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(=GM=) Саша, у меня пара вопросов к вам, не знаю, может новую ветку открыть, ну как получится. Какие сейчас модны (и востребованы) драйверы для светодиодов для панно, ну и цены тоже интересно...Никогда этим не занимался, а тут нашёл интересное (и дешёвое, вроде бы) решение - один чип управляет током 8-16 диодов со средним током до 70 мА на диод и никаких внешних элементов...Что скажете? MBI5016, MBI5026, MBI5168
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 13 2007, 15:23
|

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

|
Цитата(prottoss @ Jul 13 2007, 10:53)  ШИМ (широтно-импульсная модуляция) aka WGM = 0x01: Меняется длительность импульса при неизменной частоте - производится при помощи изменения содержимого регистра OCRnx Здесь вроде бы ясно. А вот здесь непонятно. Цитата(prottoss @ Jul 13 2007, 10:53)  ЧИМ (частотно-импульсная модуляция) aka WGM = 0x05: Меняется длительность импульса пропорционально частоте - так же при помощи OCRnx Мне казалось, что будут генерироваться короткие импульсы неизменной ширины в два такта (может в один), а период будет меняться с помощью OCR0А. Т.е. длительность импульсов неизменна, а частота импульсов меняется. Легко убедиться в этом, если постепенно приближать значение OCR0А к 0xFF, скажем, при OCR0А=0xFЕ импульсы будут шириной 4 такта, а при OCR0А=0xFF импульсы будут шириной 2 такта.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 13 2007, 15:38
|

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

|
Цитата(=GM= @ Jul 13 2007, 23:23)  Мне казалось... Я поражаюсь  Парень убедил всех и меня... В итоге он сам не знает того, в чем он всех победил... Еще раз: PWM = 0x005: 1. Цикл счета есть количество импульсов TCn от OCRnx ...0 + 0 ... OCRnx 2. Фаза сигнала меняется при переходе значения счетчика через 0 3. Меняя значение OCRnx мы, соответсвенно меняем частоту изменения фазы, при этом длительность импульса тоже меняется...
--------------------
|
|
|
|
|
Jul 13 2007, 16:18
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(=GM= @ Jul 13 2007, 13:31)  Саша, у меня пара вопросов к вам, не знаю, может новую ветку открыть, ну как получится. Какие сейчас модны (и востребованы) драйверы для светодиодов для панно, ну и цены тоже интересно...Никогда этим не занимался, а тут нашёл интересное (и дешёвое, вроде бы) решение - один чип управляет током 8-16 диодов со средним током до 70 мА на диод и никаких внешних элементов...Что скажете? Самые распространённые похоже MBI. Они и найболее гуманные по цене. есть на 8 и 16 светодиодов. 70ма это норма для данных корпусов. Хотя тема сейчас популярная и выпускаются драйвера многими фирмами. Например TI. Вот здесь, к примеру http://www.e-neon.ru/ интересные предложения. Походу какая то новая контора открылась. Есть драйвера на 24 светодиода (8RGB), а также готовые драйвера для полноцветных матриц с динамической индикацией. Вопрос цены в данном секторе весьма любопытный. Лучше поговорить с EXeGLuMATOR или ещё с кем нибудь из тех кто экранами занят. Я только бегущие строки и табло делаю пока. Экранов даже в проекте нет. Смысл в том, что они берут всё это миллионами и десятками миллионов штук. В связи с этим цена у них раза в два меньше чем у меня. Так я ещё и жду по 3 месяца заказ. Но, в принципе, цены сейчас существенно упали. Если буквально 3 года назад светодиодная моно матрица 8х8 стоила 5$, то теперь 1.5$. Появились светодиоды 18W.  Прайс тут обзорный прислали.
|
|
|
|
|
Jul 13 2007, 16:33
|

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

|
Цитата(prottoss @ Jul 13 2007, 14:38)  Я поражаюсь  Парень убедил всех и меня... В итоге он сам не знает того, в чем он всех победил...  Чудак, вы рrottoss. не собирался я никого ни побеждать, ни злить. Истина, как говорится, мне дороже. По тому делу, которое мы обсуждали раньше. Вы так ничего и не поняли(:-). Говорю последний раз. Представьте себе, при WGM=5 счётчик считает вверх. 0, 1, 2, 249. Следующее значение счетчика будет 250, и оно совпадёт с содержимым OCR0А, которое равно 250 (на самом деле 249, ну да ладно, оставим так). Что произойдёт? А вот что. Направление счёта счетчика сменится на обратное, затем произойдёт обновление регистра OCR0А, в него перепишется ТО ЖЕ САМОЕ ЗНАЧЕНИЕ 250. Со следующего такта счетчик начнёт считать вниз. Когда счётчик дойдёт до 0, возникнет прерывание таймера по переполнению TOV0. Далее весь цикл повторится, надеюсь, теперь вы это поняли? Ну а прерывания (125 штук в секунду) можно использовать для организации текущего времени. Теперь по вашему сегодняшнему заявлению. Цитата(prottoss @ Jul 13 2007, 14:38)  Еще раз: PWM = 0x005: prottoss, это уже не смешно, ну не PWM=5, а WGM=5. Цитата(prottoss @ Jul 13 2007, 14:38)  1. Цикл счета есть количество импульсов TCn от OCRnx ...0 + 0 ... OCRnx 2. Фаза сигнала меняется при переходе значения счетчика через 0 3. Меняя значение OCRnx мы, соответственно меняем частоту изменения фазы, при этом длительность импульса тоже меняется... 1) Ну хорошо, согласен. 2) О, боги! Ну откуда вы взяли, что фаза OCR0 будет меняться при переходе значения счетчика через 0? Ну хотя бы взгляните на график на рис.32. Где там меняется фаза выходного сигнала? 3) Где по-вашему будет происходить сравнение содержимого счётчика и OCR0? Если в нуле, тогда у вас всегда будет меандр переменной частоты.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 13 2007, 21:38
|

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

|
Цитата(prottoss @ Jul 13 2007, 15:45)  Это про FAST PWM MODE...  Стоит ли дальше продолжать диалог? RE: Мы сдеся про ФАЗЕ КОРРЕКТ ПВМ МОДЕЕЕ... Аууу... Поправлю, график на рис.33. Хорошо бы вы "здеся" ответили на 2 вопроса по существу. 1) Откуда вы взяли, что фаза OCR0 будет меняться при переходе значения счетчика через ноль? Ну хотя бы взгляните на график на рис.33. Где там меняется фаза выходного сигнала? 2) Где по-вашему будет происходить сравнение содержимого счётчика и OCR0? Если в нуле, тогда у вас всегда будет меандр переменной частоты, зависящей от содержимого OCR0.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 14 2007, 21:03
|

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

|
Цитата(defunct @ Jul 13 2007, 22:27)  Регистра OCR0 вообще-то 2. OCR0A - задает частоту, OCR0B - "ширину" импульса Ерунду говорите, в атмеге2313 два независимых Output Compare Units А и В ассоциированных с таймером0. Регистр OCR0A используется одним блоком, регистр OCR0A - другим. Вот ссылка: Timer/Counter0 is a general purpose 8-bit Timer/Counter module, with two independent Output Compare Units, с.66, документ 2543i. Отличие двух блоков в том, что для блока А может использоваться фиксированное значение TOP=0xFF в режиме Phase Correct PWM, а для блока В - не может. Естественно, мы говорим о блоке А.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 14 2007, 22:39
|

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

|
Цитата(=GM= @ Jul 15 2007, 00:03)  Ерунду говорите, в атмеге2313 два независимых Output Compare Units А и В ассоциированных с таймером0. Регистр OCR0A используется одним блоком, регистр OCR0A - другим. Вот ссылка: Timer/Counter0 is a general purpose 8-bit Timer/Counter module, with two independent Output Compare Units, с.66, документ 2543i.
Отличие двух блоков в том, что для блока А может использоваться фиксированное значение TOP=0xFF в режиме Phase Correct PWM, а для блока В - не может. Естественно, мы говорим о блоке А. Сами вы ерунду говорите. Если счетчик (TCNT) начнет считать в обратную сторону при достижении OCR0A, то - во-первых значения OCR0B >= OCR0A дадут константу на выходе OC0B, - а во-вторых вывод OC0A нет смысла применять (кроме случая когда нужен строго ЧИМ). ЧИМ + ШИМ можно получить естесственно только на выводе OC0B. Если же я действительно говорю ерунду, и если TCNT не начинает считать в обратную сторону при достижении OCR0A, тогда то что вы раньше говорили - насчет TOVF - чушь, т.к. частота следования TOVF будет неизменной. Так что определитесь уж.
|
|
|
|
|
Jul 15 2007, 10:45
|

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

|
To defunct. Кажется понял наконец корень всех затруднений, как всегда, это недоговоренность. Я говорил про блок А (пост #54) и его выход OCR0A, который в режиме WGM=5 даёт строгий ЧИМ - короткие импульсы постоянной длительности с переменным периодом. А вы начали говорить об использовании блока В, непонятно кстати по какой причине и не указывая этого. Ну здесь я согласен, с выхода блока В можно получить ИЛИ ЧИМ, с заданной длительностью импульса (регистр OCR0B=const) и переменным периодом (регистр OCR0A=var) ИЛИ ШИМ, с переменной скважностью (регистр OCR0B=var) и постоянным периодом (регистр OCR0A=const). Что касается вот этого, Цитата(defunct @ Jul 14 2007, 22:39)  Если же я действительно говорю ерунду, и если TCNT не начинает считать в обратную сторону при достижении OCR0A, тогда то что вы раньше говорили - насчет TOVF - чушь, т.к. частота следования TOVF будет неизменной. Так что определитесь уж. то не врубаюсь. Могу только подтвердить, что при WGM=5 таймер0 считает в двух направлениях, при достижении нуля устанавливается флаг TOV0. Если не менять содержимое OCR0A, то частота прерываний будет неизменна.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 15 2007, 12:33
|

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

|
Цитата(=GM= @ Jul 15 2007, 18:45)  то не врубаюсь. Могу только подтвердить, что при WGM=5 таймер0 считает в двух направлениях, при достижении нуля устанавливается флаг TOV0. Если не менять содержимое OCR0A, то частота прерываний будет неизменна. Так врубитесь же наконец  При WGM = 1, если менять содержимое OCRnx - частота выходных импульсов OCnx НЕ МЕНЯЕТСЯ и равна частоте входных импульсов TC, деленной на 510 (для 8-и битных счетчиков, два прохода, с инкрементом и декрементом, от 0 и до максимума, т.e. 255), меняется длительность импульсов При WGM = 5, практически тоже самое, НО, максимум равен НЕ 255, а числу в OCRnA, при этом не зависит, какое число сидит в OCRnB. НО, с помощью OCRnA мы можем менять частоту выходных импульсов, а спомощью OCRnB их ширину Частота прерываний от TOVF будет в первом случае равна частоте входных импульсов ТС, деленной на 510, во втором, как Вы уже говорили зависит от значения OCRnA, подробнее можете посмотреть в любимом  даташите
--------------------
|
|
|
|
|
Jul 15 2007, 13:34
|

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

|
Цитата(prottoss @ Jul 15 2007, 12:33)  При WGM = 1, если менять содержимое OCRnx - частота выходных импульсов OCnx НЕ МЕНЯЕТСЯ и равна частоте входных импульсов TC, деленной на 510 (для 8-и битных счетчиков, два прохода, с инкрементом и декрементом, от 0 и до максимума, т.e. 255), меняется длительность импульсов При WGM = 5, практически тоже самое, НО, максимум равен НЕ 255, а числу в OCRnA, при этом не зависит, какое число сидит в OCRnB. НО, с помощью OCRnA мы можем менять частоту выходных импульсов, а спомощью OCRnB их ширину Частота прерываний от TOVF будет в первом случае равна частоте входных импульсов ТС, деленной на 510, во втором, как Вы уже говорили зависит от значения OCRnA, подробнее можете посмотреть в любимом  даташите Всё это я вам уже раз десять говорил разными словами, а ВЫ мне говорили, что так не бывает. Теперь вы повторяете мне мои слова. Зачем? Я вам вопросы по существу задал, а вы их замотали. Вопросы-то простые. 1) Откуда вы взяли, что фаза OCR0А будет меняться при переходе значения счетчика через ноль? Взгляните на график на рис.33. Где там меняется фаза выходного сигнала? 2) Где на временной шкале, по-вашему, будет происходить сравнение содержимого счётчика и OCR0А? 3) какова форма выходного сигнала на выходе ОС0А в режиме WGM=5? Не врубаюсь я вот в эти фразы defunct...если TCNT не начинает считать в обратную сторону при достижении OCR0A, тогда то что вы раньше говорили - насчет TOVF - чушь, т.к. частота следования TOVF будет неизменной. Так что определитесь ужСлова все знакомые, но ничегошеньки не понимаю, смысл какой-то мутный - ...если TCNT не начинает считать в обратную сторону при достижении OCR0AПочему не начинает? Начинает, читайте все мои посты. Зачем вы об этом вообще говорите? - тогда то что вы раньше говорили - насчет TOVF - чушьКакую чушь я раньше говорил о TOVF? Что вы тут плетёте? - т.к. частота следования TOVF будет неизменнойБудет неизменной, 125 Гц для оговоренных выше условий, подтверждаю. Ну и что? Что вы всем этим хотите сказать? - Так что определитесь ужС чем определиться? Постарайтесь яснее выразить свои мысли.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 15 2007, 22:04
|

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

|
Цитата(=GM= @ Jul 15 2007, 19:43)  Перечитал два раза. Смысл вашего поста всё равно мутный, ничего личного. Ок, не мутно не я уже говорил ЧИМ+ШИМ получается на выводе OC0B WGM2..0 = 5: OCR0A - задает частоту OCR0B - ширину импульса. OCR0B должен быть строго меньше OCR0A. и вы тоже: Цитата с выхода блока В можно получить ИЛИ ЧИМ, с заданной длительностью импульса (регистр OCR0B=const) и переменным периодом (регистр OCR0A=var) ИЛИ ШИМ, с переменной скважностью (регистр OCR0B=var) и постоянным периодом (регистр OCR0A=const). но Цитата А вы начали говорить об использовании блока В, непонятно кстати по какой причине и не указывая этого. Дело в том, что WGM2..0 = 5 в отрыве от блока B нет смысла рассматривать.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|