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

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


кекс
******

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



Цитата(prottoss @ Jul 10 2007, 17:33) *
Oxo smile.gif Это кто кроме Вас сказал? Во всех даташитах чтоль???

Вы уже посмотрели прикрепленный тест?
В железе он ведет себя точно также как в симуляторе.
Go to the top of the page
 
+Quote Post
kada
сообщение Jul 10 2007, 14:39
Сообщение #32


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

Группа: Свой
Сообщений: 106
Регистрация: 23-05-05
Из: Ташкент
Пользователь №: 5 324



Вполне возможно, что дело в кварце.
Столкнулись с этим однажды. В итоге поставили микросхему часов реального времени со встроенным кварцем.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 10 2007, 14:55
Сообщение #33


Ambidexter
*****

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



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

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

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


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


Гуру
******

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



Цитата(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
Прикрепленные файлы
Прикрепленный файл  Test.rar ( 839 байт ) Кол-во скачиваний: 33
 


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


Ambidexter
*****

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



Цитата(prottoss @ Jul 10 2007, 12:14) *
Ну про такие извраты (извиняюсь) для получения одной секунды я вообще не думал

Про извраты. Вот когда в Phase Correct PWM mode по каждому прерыванию TOV0 будете писать число 6 в таймер0, а потом в регистр OCR0A - число 5, вот тогда будет изврат с большой буквы. И вы будете смеяться, но работать-таки будет...


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


Гуру
******

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



Цитата(=GM= @ Jul 10 2007, 23:10) *
Про извраты. Вот когда в Phase Correct PWM mode по каждому прерыванию TOV0 будете писать число 6 в таймер0, а потом в регистр OCR0A - число 5, вот тогда будет изврат с большой буквы. И вы будете смеяться, но работать-таки будет...
Нуну, Вы еще не рассказали про цикл с NOP для получения ровно одной секунды


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


кекс
******

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



Цитата(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 как во многих других девайсах.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 10 2007, 16:13
Сообщение #38


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, просто фаза выходного сигнала меняется smile.gif

Не сбрасывается, ну и что? Он считает сначала вверх, потом вниз и устанавливает TOV0, который вы как раз и оспариваете, утверждая, что автор не может использовать прерывание по переполнению, поскольку он использует режим сравнения.


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


Гуру
******

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



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


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


кекс
******

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



Цитата(=GM= @ Jul 10 2007, 19:13) *
Не сбрасывается, ну и что? Он считает сначала вверх, потом вниз и устанавливает TOV0, который вы как раз и оспариваете, утверждая, что автор не может использовать прерывание по переполнению, поскольку он использует режим сравнения.

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

Цитата
Прерывание по совпадению и автоматическая очистка счетчика при условии сравнения.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 10 2007, 16:38
Сообщение #41


Гуру
******

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



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



Самое главное, что завтра, по прочтенни данного топика автор многое узнает smile.gif ... Во первых узнает, как люди ломают копья над неосвещенными вопросами. Во вторых ознакомится с режимами работы ТС0 и , думаю, для него много прояснится. smile.gif


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


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)


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


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

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


Почитав ветку, увидел такие точки зрения, которые мне бы и в голову никогда не пришли ... спасибо вам всем ... сейчас буду вчитываться, да пробовать.
Прошу прощения за созданные неоднозначности.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 11 2007, 11:06
Сообщение #44


Гуру
******

Группа: Свой
Сообщений: 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)
Да уж, погорячился я маненькоsmile.gif Сорри. Почему то забыл что PHASE Correct PWM есть двух типов - первый (PWM = 1), при котором счетчик считает от 0 до МАХ и далее от МАХ и до 0; второй (PWM = 5) соответсвенно от 0 до OCRnA до и далее от OCRnA до 0.

Да и не подумал я, что человек таким хитрым способом будет получать 1 секунду. Зачем PWM c возможностью изменения частоты, если есть простой СТС. Вот о чем я думал, когда спорил... smile.gif


--------------------
Go to the top of the page
 
+Quote Post
oles_k76
сообщение Jul 12 2007, 19:31
Сообщение #45


RF
***

Группа: Свой
Сообщений: 321
Регистрация: 12-04-06
Из: Berlin
Пользователь №: 16 046



Все верно,если на кварце 8.000, то частотомер, например Ч3-66 покажет 8 000 122Гц, сам вот вожус с подобной проблеммой.
Купили кварцевый генератор,без даташита, на нем было написано 10.0000
Оказалось что при 5в питании частотомер показал 10 000 146Гц а вот при 3В 10 000 081Гц
опытным путем проверил всю партию. Оказалось все параметры оптимизированы на 3В-3.3В


--------------------
теперь питание компьютера можно отключить
Go to the top of the page
 
+Quote Post

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

 


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


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