Присвоение/чтение TCNT2 на Mega8
Присвоение/чтение TCNT2 на Mega8
Здравствуйте!
В прерывании по переполнению таймера 2 написал:
TCNT2=50;
display[0]=TCNT2;
переменная display[0] возвращает 1, т.е. значение 50 не присваивается. Чем такое объяснить?
В прерывании по переполнению таймера 2 написал:
TCNT2=50;
display[0]=TCNT2;
переменная display[0] возвращает 1, т.е. значение 50 не присваивается. Чем такое объяснить?
- Реклама
-
Golosov_SA
- Родился
- Сообщения: 13
- Зарегистрирован: Сб сен 05, 2009 14:45:39
- Откуда: Рыбинск, Ярославская область
даташит 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
А хотели то чего добиться?anco писал(а):В прерывании по переполнению таймера 2 написал:
TCNT2=50;
display[0]=TCNT2;
переменная display[0] возвращает 1, т.е. значение 50 не присваивается. Чем такое объяснить?
Перевод:
Результат сравнения блокируется записью в TCNT2
Если ЦПУ осуществляет запись в регистр TCNT2, то результат сравнения будет игнорироваться на следующем такте синхронизации таймера, даже если таймер остановлен. Данная функция позволяет установить в регистре OCR2 то же значение, что и в TCNT2 без генерации запроса на прерывание, если разрешено тактирование таймера-счетчика.
Можно объяснить на пальцах когда же TCNT2 станет равным 50 (если станет)? И за одно уж что такое "результат сравнения" и "следующий такт синхронизации".
Результат сравнения блокируется записью в TCNT2
Если ЦПУ осуществляет запись в регистр TCNT2, то результат сравнения будет игнорироваться на следующем такте синхронизации таймера, даже если таймер остановлен. Данная функция позволяет установить в регистре OCR2 то же значение, что и в TCNT2 без генерации запроса на прерывание, если разрешено тактирование таймера-счетчика.
Можно объяснить на пальцах когда же TCNT2 станет равным 50 (если станет)? И за одно уж что такое "результат сравнения" и "следующий такт синхронизации".
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
После настройки и запуска таймера (с предделителем) будет формироваться импульс счета. Период зависит от частоты ТИ и деления. Этот импульс и будет увеличивать значение счетного регистра. В случае если надо обработать факт поступления К импульсов (внешних или внутренних), вы можете записав предварительно желаемое число в регистр ОС получить прерывание на совпадение результатов подсчета с этим числом. Смена значения в регистрах ОС происходит во время переполнения счетного регистра. Следущим тактом будет новое переполнение счетного регистраanco писал(а):Можно объяснить на пальцах когда же TCNT2 станет равным 50 (если станет)? И за одно уж что такое "результат сравнения" и "следующий такт синхронизации".
Последний раз редактировалось Meteor Сб сен 05, 2009 23:40:52, всего редактировалось 1 раз.
- Реклама
Хотел корректировать точность часов. И она корректировалась. Нашел нужную поправку.
TCNT2=5; //Коррекция 1 раз в сек
Потом сделал программную корректировку
TCNT2=256+correct_ozu/60; //Коррекция 1 раз в сек
и задал по умолчанию найденное значение (correct_ozu=300), но часы начали отставать. Вот я и вывел вычисляемое значение поправки на индикатор, а оно оказалось равным 3 - не то что ожидал, а если присваивать как в первом случае без вычислений, то =1, т.е. часы тикают и пока ничего не присваивают. Вот и хочу узнать когда это произойдет.
TCNT2=5; //Коррекция 1 раз в сек
Потом сделал программную корректировку
TCNT2=256+correct_ozu/60; //Коррекция 1 раз в сек
и задал по умолчанию найденное значение (correct_ozu=300), но часы начали отставать. Вот я и вывел вычисляемое значение поправки на индикатор, а оно оказалось равным 3 - не то что ожидал, а если присваивать как в первом случае без вычислений, то =1, т.е. часы тикают и пока ничего не присваивают. Вот и хочу узнать когда это произойдет.
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Это в таймер который считает до 255, заносите 300?anco писал(а):Хотел корректировать точность часов. И она корректировалась. Нашел нужную поправку...Потом сделал программную корректировку...и задал по умолчанию найденное значение (correct_ozu=300)
Мда без кода тут ничего не понять... Первое что напрашивается а не перевести ли таймер в режим СТС? Там можно будет опрокидывать его с коэф меньше 255.anco писал(а):...но часы начали отставать. Вот я и вывел вычисляемое значение поправки на индикатор, а оно оказалось равным 3 - не то что ожидал, а если присваивать как в первом случае без вычислений, то =1, т.е. часы тикают и пока ничего не присваивают. Вот и хочу узнать когда это произойдет.
Я же использую прерывание по переполнению, а не по совпадению. Я спрашиваю о моменте изменения регистра TCNT, а не OCR.Meteor писал(а): В случае если надо обработать факт поступления К импульсов (внешних или внутренних), вы можете записав предварительно желаемое число в регистр ОС получить прерывание на совпадение результатов подсчета с этим числом. Смена значения в регистрах ОС происходит во время переполнения счетного регистра. Следущим тактом будет новое переполнение счетного регистра
TCNT2=256+correct_ozu/60;Meteor писал(а): Это в таймер который считает до 255, заносите 300?
Не 300, а 5. TCNT2=256+300/60=5.
Кода 2 строки: присвоение первая и чтение вторая (см. первый пост). Смотрим то что прочитали и не понимаем почему присваивали одно, а прочиталось другое. Вот в чем вопрос.Meteor писал(а): Мда без кода тут ничего не понять... Первое что напрашивается а не перевести ли таймер в режим СТС? Там можно будет опрокидывать его с коэф меньше 255.
Можно конечно и в CTC, но вопрос не отпадет о моменте изменения TCNT2, а останется и не будет мне давать спать
Так все таки когда?
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Давайте по порядку. Откуда берется тактовый сигнал на вход таймера? Как настроен предделитель? Регистр счета увеличивается в тот момент, когда будет сформирован импульс, частота которого меньше частоты тактового сигнала в число раз равное коэффициенту деления предделителя. Прерывание по переполнению формируется в момент перехода значения счетного регистра с максимального(0xFF) в минимальное (0x00)значение.anco писал(а):Я же использую прерывание по переполнению, а не по совпадению. Я спрашиваю о моменте изменения регистра TCNT, а не OCR.
-
Golosov_SA
- Родился
- Сообщения: 13
- Зарегистрирован: Сб сен 05, 2009 14:45:39
- Откуда: Рыбинск, Ярославская область
прошу прощения, невнимательно прочитал топик.
Итак, счетный регистр TCNT2 (8ми разрядный, максимальное значение 0xff = 255) входит в состав блока реверсивного счетчика. В зависимости от режима работы модуля содержимое счетного регистра сбрасывается, инкрементируется или декрементируется по каждому импульсу тактового сигнала CLKt2. Независимо от того присутствует сигнал или нет, регистр доступен для чтения и записи в любой момент времени. Единственное что надо помнить, это то, что любая операция записи в счетный регистр блокирует работу блока совпадения на время одного периода тактового сигнала таймера.
В вашем случае используется так называемый режим "Normal" работы таймера/счетчика "сброс при переполнении".
Вывод - неправильно сконфигурирован таймер.
п.с.: я бы рекомендовал для ваших целей использовать режим CTC
Итак, счетный регистр TCNT2 (8ми разрядный, максимальное значение 0xff = 255) входит в состав блока реверсивного счетчика. В зависимости от режима работы модуля содержимое счетного регистра сбрасывается, инкрементируется или декрементируется по каждому импульсу тактового сигнала CLKt2. Независимо от того присутствует сигнал или нет, регистр доступен для чтения и записи в любой момент времени. Единственное что надо помнить, это то, что любая операция записи в счетный регистр блокирует работу блока совпадения на время одного периода тактового сигнала таймера.
В вашем случае используется так называемый режим "Normal" работы таймера/счетчика "сброс при переполнении".
Вывод - неправильно сконфигурирован таймер.
п.с.: я бы рекомендовал для ваших целей использовать режим CTC
ассинхронный режим, часовой кварц 32768ГцMeteor писал(а): Откуда берется тактовый сигнал на вход таймера?
1:1Как настроен предделитель?
// Timer 2 overflow interrupt service routineРегистр счета увеличивается в тот момент, когда будет сформирован импульс, частота которого меньше частоты тактового сигнала в число раз равное коэффициенту деления предделителя. Прерывание по переполнению формируется в момент перехода значения счетного регистра с максимального(0xFF) в минимальное (0x00)значение.
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
- Откуда: Рыбинск, Ярославская область
в асинхронном режиме запись в регистр TCNT2 синхронизируется с тактовым сигналом таймера/счетчика. При записи числа в TCNT2, оно сохраняется в специальном временном регистре, а пересылка содержимого временного регистра в рабочий регистр осуществляется по третьему после записи положительному фронту сигнала на выводе TOSC1. Соответственно запись нового значения можно производить только после пересылки содержимого временного регистра в регистр таймера/счетчика. Для определения действительного изменения регистров таймера предназначен регистр ASSR, бит TCN2UB.
источник - дш стр 119-121
источник - дш стр 119-121
В общем вот проект в CVAVR, там есть и проект для протеуса.
Все лишнее не касающееся данного вопроса я удалил, так что проще уже некуда.
Переменная display[0] выводится на 7-ми сегментный индикатор.
а) в камне горит 1 индикатор равный значению 1.
б) в протеусе горят 3 индикатора 2+16+32=50
Где правда?
Все лишнее не касающееся данного вопроса я удалил, так что проще уже некуда.
Переменная display[0] выводится на 7-ми сегментный индикатор.
а) в камне горит 1 индикатор равный значению 1.
б) в протеусе горят 3 индикатора 2+16+32=50
Где правда?
- Вложения
-
- a.rar
- (65.22 КБ) 169 скачиваний
-
Golosov_SA
- Родился
- Сообщения: 13
- Зарегистрирован: Сб сен 05, 2009 14:45:39
- Откуда: Рыбинск, Ярославская область
протеус, по всей видимости, не полностью эмулирует работу таймера в асинхронном режиме... читай дш стр 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.
• 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 раз.
Воо-т оно наверно!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
- Откуда: Рыбинск, Ярославская область
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Осмелюсь предположить, что правда будет в железе. Там и только там надо смотреть работу. И не надеяться на всяческих помощников типа протеуса. Когда пару раз зашьете и с сотню раз потыкаете осциллографом - разбираться будет намного легче(даже Вам самому)anco писал(а):В общем вот проект в CVAVR, там есть и проект для протеуса.
Где правда?
В смысле? То что так долго формулу считает? или то что появляется ошибка в связи с вычислением формулы + задержка в 2 периода?Golosov_SA писал(а):сомневаюсь по поводу п3-5.
Когда присваивал TCNT=50 и сразу читал, то на индикаторе показывало 1, а когда те же 50 но вычисляемые в формуле, то 3. Т.е. значение вычислялось за 2 тика или за 2/32768=0,061 мс
4Мгц против 0,032768МГцеще немаловажно то, что частота тактирования cpu была МИНИМУМ в 4 раза БОЛЬШЕ частоты на TOSC1 (читай тот-же дш)
-
Golosov_SA
- Родился
- Сообщения: 13
- Зарегистрирован: Сб сен 05, 2009 14:45:39
- Откуда: Рыбинск, Ярославская область
понял вашу идею, до установки нового значения можно подождать:
Код: Выделить всё
***************************
while (ASSR & (1<<TCN2UB)); // ждем пока регистр TCNT2 не изменится
***************************


