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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
anco
Открыл глаза
Сообщения: 57
Зарегистрирован: Вс фев 15, 2009 21:12:36

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

Сообщение anco »

Здравствуйте!
В прерывании по переполнению таймера 2 написал:

TCNT2=50;
display[0]=TCNT2;

переменная display[0] возвращает 1, т.е. значение 50 не присваивается. Чем такое объяснить?
Реклама
Golosov_SA
Родился
Сообщения: 13
Зарегистрирован: Сб сен 05, 2009 14:45:39
Откуда: Рыбинск, Ярославская область

Сообщение Golosov_SA »

даташит http://www.atmel.com/dyn/resources/prod ... oc2486.pdf стр 108 раздел Compare Match Blocking by TCNT2 Write
Реклама
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

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

Сообщение Meteor »

anco писал(а):В прерывании по переполнению таймера 2 написал:
TCNT2=50;
display[0]=TCNT2;
переменная display[0] возвращает 1, т.е. значение 50 не присваивается. Чем такое объяснить?
А хотели то чего добиться?
anco
Открыл глаза
Сообщения: 57
Зарегистрирован: Вс фев 15, 2009 21:12:36

Сообщение anco »

Перевод:
Результат сравнения блокируется записью в TCNT2

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


Можно объяснить на пальцах когда же TCNT2 станет равным 50 (если станет)? И за одно уж что такое "результат сравнения" и "следующий такт синхронизации".
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Сообщение Meteor »

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

Сообщение anco »

Хотел корректировать точность часов. И она корректировалась. Нашел нужную поправку.

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

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

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

и задал по умолчанию найденное значение (correct_ozu=300), но часы начали отставать. Вот я и вывел вычисляемое значение поправки на индикатор, а оно оказалось равным 3 - не то что ожидал, а если присваивать как в первом случае без вычислений, то =1, т.е. часы тикают и пока ничего не присваивают. Вот и хочу узнать когда это произойдет.
Реклама
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Сообщение Meteor »

anco писал(а):Хотел корректировать точность часов. И она корректировалась. Нашел нужную поправку...Потом сделал программную корректировку...и задал по умолчанию найденное значение (correct_ozu=300)
Это в таймер который считает до 255, заносите 300?
anco писал(а):...но часы начали отставать. Вот я и вывел вычисляемое значение поправки на индикатор, а оно оказалось равным 3 - не то что ожидал, а если присваивать как в первом случае без вычислений, то =1, т.е. часы тикают и пока ничего не присваивают. Вот и хочу узнать когда это произойдет.
Мда без кода тут ничего не понять... Первое что напрашивается а не перевести ли таймер в режим СТС? Там можно будет опрокидывать его с коэф меньше 255.
anco
Открыл глаза
Сообщения: 57
Зарегистрирован: Вс фев 15, 2009 21:12:36

Сообщение anco »

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

Сообщение anco »

Meteor писал(а): Это в таймер который считает до 255, заносите 300?
TCNT2=256+correct_ozu/60;

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

Можно конечно и в CTC, но вопрос не отпадет о моменте изменения TCNT2, а останется и не будет мне давать спать :)
Так все таки когда?
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Сообщение Meteor »

anco писал(а):Я же использую прерывание по переполнению, а не по совпадению. Я спрашиваю о моменте изменения регистра TCNT, а не OCR.
Давайте по порядку. Откуда берется тактовый сигнал на вход таймера? Как настроен предделитель? Регистр счета увеличивается в тот момент, когда будет сформирован импульс, частота которого меньше частоты тактового сигнала в число раз равное коэффициенту деления предделителя. Прерывание по переполнению формируется в момент перехода значения счетного регистра с максимального(0xFF) в минимальное (0x00)значение.
Golosov_SA
Родился
Сообщения: 13
Зарегистрирован: Сб сен 05, 2009 14:45:39
Откуда: Рыбинск, Ярославская область

Сообщение Golosov_SA »

прошу прощения, невнимательно прочитал топик.

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

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

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

п.с.: я бы рекомендовал для ваших целей использовать режим CTC
anco
Открыл глаза
Сообщения: 57
Зарегистрирован: Вс фев 15, 2009 21:12:36

Сообщение 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 и прочитать из него. Напишите ТОЛЬКО ИХ в прерывании и посмотрите что получиться.
Golosov_SA
Родился
Сообщения: 13
Зарегистрирован: Сб сен 05, 2009 14:45:39
Откуда: Рыбинск, Ярославская область

Сообщение Golosov_SA »

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

источник - дш стр 119-121
anco
Открыл глаза
Сообщения: 57
Зарегистрирован: Вс фев 15, 2009 21:12:36

Сообщение anco »

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

Где правда?
Вложения
a.rar
(65.22 КБ) 169 скачиваний
Golosov_SA
Родился
Сообщения: 13
Зарегистрирован: Сб сен 05, 2009 14:45:39
Откуда: Рыбинск, Ярославская область

Сообщение 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.
Последний раз редактировалось Golosov_SA Вс сен 06, 2009 01:39:48, всего редактировалось 1 раз.
anco
Открыл глаза
Сообщения: 57
Зарегистрирован: Вс фев 15, 2009 21:12:36

Сообщение 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 тиков.

Спасибо!
Golosov_SA
Родился
Сообщения: 13
Зарегистрирован: Сб сен 05, 2009 14:45:39
Откуда: Рыбинск, Ярославская область

Сообщение Golosov_SA »

сомневаюсь по поводу п3-5. еще немаловажно то, что частота тактирования cpu была МИНИМУМ в 4 раза БОЛЬШЕ частоты на TOSC1 (читай тот-же дш)
осуществляется по третьему после записи
это мой перевод. в дш написано "после двух..."
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Сообщение Meteor »

anco писал(а):В общем вот проект в CVAVR, там есть и проект для протеуса.
Где правда?
Осмелюсь предположить, что правда будет в железе. Там и только там надо смотреть работу. И не надеяться на всяческих помощников типа протеуса. Когда пару раз зашьете и с сотню раз потыкаете осциллографом - разбираться будет намного легче(даже Вам самому) :))
anco
Открыл глаза
Сообщения: 57
Зарегистрирован: Вс фев 15, 2009 21:12:36

Сообщение anco »

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

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

Сообщение Golosov_SA »

понял вашу идею, до установки нового значения можно подождать:

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

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

Вернуться в «Микроконтроллеры и ПЛИС»