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