Страница 1 из 2

Присвоение/чтение TCNT2 на Mega8

Добавлено: Сб сен 05, 2009 22:44:14
anco
Здравствуйте!
В прерывании по переполнению таймера 2 написал:

TCNT2=50;
display[0]=TCNT2;

переменная display[0] возвращает 1, т.е. значение 50 не присваивается. Чем такое объяснить?

Добавлено: Сб сен 05, 2009 23:01:36
Golosov_SA
даташит http://www.atmel.com/dyn/resources/prod ... oc2486.pdf стр 108 раздел Compare Match Blocking by TCNT2 Write

Re: Присвоение/чтение TCNT2 на Mega8

Добавлено: Сб сен 05, 2009 23:26:40
Meteor
anco писал(а):В прерывании по переполнению таймера 2 написал:
TCNT2=50;
display[0]=TCNT2;
переменная display[0] возвращает 1, т.е. значение 50 не присваивается. Чем такое объяснить?
А хотели то чего добиться?

Добавлено: Сб сен 05, 2009 23:28:42
anco
Перевод:
Результат сравнения блокируется записью в TCNT2

Если ЦПУ осуществляет запись в регистр TCNT2, то результат сравнения будет игнорироваться на следующем такте синхронизации таймера, даже если таймер остановлен. Данная функция позволяет установить в регистре OCR2 то же значение, что и в TCNT2 без генерации запроса на прерывание, если разрешено тактирование таймера-счетчика.


Можно объяснить на пальцах когда же TCNT2 станет равным 50 (если станет)? И за одно уж что такое "результат сравнения" и "следующий такт синхронизации".

Добавлено: Сб сен 05, 2009 23:37:56
Meteor
anco писал(а):Можно объяснить на пальцах когда же TCNT2 станет равным 50 (если станет)? И за одно уж что такое "результат сравнения" и "следующий такт синхронизации".
После настройки и запуска таймера (с предделителем) будет формироваться импульс счета. Период зависит от частоты ТИ и деления. Этот импульс и будет увеличивать значение счетного регистра. В случае если надо обработать факт поступления К импульсов (внешних или внутренних), вы можете записав предварительно желаемое число в регистр ОС получить прерывание на совпадение результатов подсчета с этим числом. Смена значения в регистрах ОС происходит во время переполнения счетного регистра. Следущим тактом будет новое переполнение счетного регистра

Добавлено: Сб сен 05, 2009 23:39:38
anco
Хотел корректировать точность часов. И она корректировалась. Нашел нужную поправку.

TCNT2=5; //Коррекция 1 раз в сек

Потом сделал программную корректировку

TCNT2=256+correct_ozu/60; //Коррекция 1 раз в сек

и задал по умолчанию найденное значение (correct_ozu=300), но часы начали отставать. Вот я и вывел вычисляемое значение поправки на индикатор, а оно оказалось равным 3 - не то что ожидал, а если присваивать как в первом случае без вычислений, то =1, т.е. часы тикают и пока ничего не присваивают. Вот и хочу узнать когда это произойдет.

Добавлено: Сб сен 05, 2009 23:47:07
Meteor
anco писал(а):Хотел корректировать точность часов. И она корректировалась. Нашел нужную поправку...Потом сделал программную корректировку...и задал по умолчанию найденное значение (correct_ozu=300)
Это в таймер который считает до 255, заносите 300?
anco писал(а):...но часы начали отставать. Вот я и вывел вычисляемое значение поправки на индикатор, а оно оказалось равным 3 - не то что ожидал, а если присваивать как в первом случае без вычислений, то =1, т.е. часы тикают и пока ничего не присваивают. Вот и хочу узнать когда это произойдет.
Мда без кода тут ничего не понять... Первое что напрашивается а не перевести ли таймер в режим СТС? Там можно будет опрокидывать его с коэф меньше 255.

Добавлено: Сб сен 05, 2009 23:49:22
anco
Meteor писал(а): В случае если надо обработать факт поступления К импульсов (внешних или внутренних), вы можете записав предварительно желаемое число в регистр ОС получить прерывание на совпадение результатов подсчета с этим числом. Смена значения в регистрах ОС происходит во время переполнения счетного регистра. Следущим тактом будет новое переполнение счетного регистра
Я же использую прерывание по переполнению, а не по совпадению. Я спрашиваю о моменте изменения регистра TCNT, а не OCR.

Добавлено: Сб сен 05, 2009 23:59:44
anco
Meteor писал(а): Это в таймер который считает до 255, заносите 300?
TCNT2=256+correct_ozu/60;

Не 300, а 5. TCNT2=256+300/60=5.
Meteor писал(а): Мда без кода тут ничего не понять... Первое что напрашивается а не перевести ли таймер в режим СТС? Там можно будет опрокидывать его с коэф меньше 255.
Кода 2 строки: присвоение первая и чтение вторая (см. первый пост). Смотрим то что прочитали и не понимаем почему присваивали одно, а прочиталось другое. Вот в чем вопрос.

Можно конечно и в CTC, но вопрос не отпадет о моменте изменения TCNT2, а останется и не будет мне давать спать :)
Так все таки когда?

Добавлено: Вс сен 06, 2009 00:01:30
Meteor
anco писал(а):Я же использую прерывание по переполнению, а не по совпадению. Я спрашиваю о моменте изменения регистра TCNT, а не OCR.
Давайте по порядку. Откуда берется тактовый сигнал на вход таймера? Как настроен предделитель? Регистр счета увеличивается в тот момент, когда будет сформирован импульс, частота которого меньше частоты тактового сигнала в число раз равное коэффициенту деления предделителя. Прерывание по переполнению формируется в момент перехода значения счетного регистра с максимального(0xFF) в минимальное (0x00)значение.

Добавлено: Вс сен 06, 2009 00:29:15
Golosov_SA
прошу прощения, невнимательно прочитал топик.

Итак, счетный регистр TCNT2 (8ми разрядный, максимальное значение 0xff = 255) входит в состав блока реверсивного счетчика. В зависимости от режима работы модуля содержимое счетного регистра сбрасывается, инкрементируется или декрементируется по каждому импульсу тактового сигнала CLKt2. Независимо от того присутствует сигнал или нет, регистр доступен для чтения и записи в любой момент времени. Единственное что надо помнить, это то, что любая операция записи в счетный регистр блокирует работу блока совпадения на время одного периода тактового сигнала таймера.

В вашем случае используется так называемый режим "Normal" работы таймера/счетчика "сброс при переполнении".

Вывод - неправильно сконфигурирован таймер.

п.с.: я бы рекомендовал для ваших целей использовать режим CTC

Добавлено: Вс сен 06, 2009 00:36:42
anco
Meteor писал(а): Откуда берется тактовый сигнал на вход таймера?
ассинхронный режим, часовой кварц 32768Гц
Как настроен предделитель?
1:1
Регистр счета увеличивается в тот момент, когда будет сформирован импульс, частота которого меньше частоты тактового сигнала в число раз равное коэффициенту деления предделителя. Прерывание по переполнению формируется в момент перехода значения счетного регистра с максимального(0xFF) в минимальное (0x00)значение.
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
char j, overflov_timer;
if (correct_ozu<0) overflov_timer=129; else overflov_timer=128;
if (++oft==overflov_timer)
{
// TCNT2=256+correct_ozu/60; //Коррекция 1 раз в сек
TCNT2=50; //Коррекция 1 раз в сек
display[0]=TCNT2;
...далее прибавление секунд, мин, час, дней и т.д.
}
}
В зависимости от того спешат или отстают переполнения до 128 или до 129
Если досчитали до overflov_timer (прошла 1 сек), делаем коррекцию 1 раз в сек. посредством задания начального значения TCNT2. Потом читаем TCNT2 и видим на индикаторе, что в TCNT2 на данный момент не то что мы туда записывали. Далее прибавляем к счетчику времени 1 сек и т.д.

Вся проблема в ДВУХ строчках: записать в TCNT2 и прочитать из него. Напишите ТОЛЬКО ИХ в прерывании и посмотрите что получиться.

Добавлено: Вс сен 06, 2009 01:14:10
Golosov_SA
в асинхронном режиме запись в регистр TCNT2 синхронизируется с тактовым сигналом таймера/счетчика. При записи числа в TCNT2, оно сохраняется в специальном временном регистре, а пересылка содержимого временного регистра в рабочий регистр осуществляется по третьему после записи положительному фронту сигнала на выводе TOSC1. Соответственно запись нового значения можно производить только после пересылки содержимого временного регистра в регистр таймера/счетчика. Для определения действительного изменения регистров таймера предназначен регистр ASSR, бит TCN2UB.

источник - дш стр 119-121

Добавлено: Вс сен 06, 2009 01:24:36
anco
В общем вот проект в CVAVR, там есть и проект для протеуса.
Все лишнее не касающееся данного вопроса я удалил, так что проще уже некуда.
Переменная display[0] выводится на 7-ми сегментный индикатор.
а) в камне горит 1 индикатор равный значению 1. :cry:
б) в протеусе горят 3 индикатора 2+16+32=50 :shock:

Где правда?

Добавлено: Вс сен 06, 2009 01:35:05
Golosov_SA
протеус, по всей видимости, не полностью эмулирует работу таймера в асинхронном режиме... читай дш стр 120

• When writing to one of the registers TCNT2, OCR2, or TCCR2, the value is transferred to a
temporary register, and latched after two positive edges on TOSC1. The user should not
write a new value before the contents of the temporary register have been transferred to its
destination. Each of the three mentioned registers have their individual temporary register,
which means that e.g. writing to TCNT2 does not disturb an OCR2 write in progress. To
detect that a transfer to the destination register has taken place, the Asynchronous Status
Register – ASSR has been implemented.

Добавлено: Вс сен 06, 2009 01:39:34
anco
Golosov_SA писал(а):сохраняется в специальном временном регистре, а пересылка содержимого временного регистра в рабочий регистр осуществляется по третьему после записи положительному фронту сигнала на выводе TOSC1.
Воо-т оно наверно! :))
Значит так
1) Переполнение таймера TCNT2 стало=0
2) Присваиваем TCNT2=50*a+b-c; //Получилось например 60
3) Вычисление формулы заняло 4 тика на TOSC1
4) 3 импульса на пересылку
5) итого хотел что бы до переполнения таймера осталось 256-60=196, а фактически осталось 256-60+4+3=203. То есть таймер тикает, а желаемое сейчас значение запишется только через 7 тиков.

Спасибо!

Добавлено: Вс сен 06, 2009 01:46:42
Golosov_SA
сомневаюсь по поводу п3-5. еще немаловажно то, что частота тактирования cpu была МИНИМУМ в 4 раза БОЛЬШЕ частоты на TOSC1 (читай тот-же дш)
осуществляется по третьему после записи
это мой перевод. в дш написано "после двух..."

Добавлено: Вс сен 06, 2009 08:35:13
Meteor
anco писал(а):В общем вот проект в CVAVR, там есть и проект для протеуса.
Где правда?
Осмелюсь предположить, что правда будет в железе. Там и только там надо смотреть работу. И не надеяться на всяческих помощников типа протеуса. Когда пару раз зашьете и с сотню раз потыкаете осциллографом - разбираться будет намного легче(даже Вам самому) :))

Добавлено: Вс сен 06, 2009 13:34:53
anco
Golosov_SA писал(а):сомневаюсь по поводу п3-5.
В смысле? То что так долго формулу считает? или то что появляется ошибка в связи с вычислением формулы + задержка в 2 периода?

Когда присваивал TCNT=50 и сразу читал, то на индикаторе показывало 1, а когда те же 50 но вычисляемые в формуле, то 3. Т.е. значение вычислялось за 2 тика или за 2/32768=0,061 мс
еще немаловажно то, что частота тактирования cpu была МИНИМУМ в 4 раза БОЛЬШЕ частоты на TOSC1 (читай тот-же дш)
4Мгц против 0,032768МГц

Добавлено: Вс сен 06, 2009 14:18:03
Golosov_SA
понял вашу идею, до установки нового значения можно подождать:

Код: Выделить всё

***************************
while (ASSR & (1<<TCN2UB));  // ждем пока регистр TCNT2 не изменится
***************************