|
|
  |
Tiny2313 нужна 1 сек. на таймер 0, "Уходит" время :( |
|
|
|
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 возможностью изменения частоты, если есть простой СТС. Вот о чем я думал, когда спорил...
--------------------
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|