тайминг, тайминг

Nov 08, 2003 24 Replies

Dear Anatoly,

14 Nov 03 19:28, Anatoly Mashanov wrote to Serge Bryxin:

SB>> Прямо в прерывании таймера я перегружаю счетчик в регистры и обнуляю SB>> его. AM> Hельзя.

Почему? Можешь разжевать?

AM> Следует давать команду прибавления константы к счетчику, чтобы AM> получилось 0.

И какой конкретно должна быть константа, если перегрузка счетчика занимает

0.5uS, а период поступающего на счетчик сигнала - 3.2uS ?

Sincerely yours, Old Greaser.

Fri Nov 14 2003 10:29, Serge Bryxin wrote to Alex Mogilnikov:

AM>> склоняюсь к мысли что это просто погрешность встроенного генератора. SB> Да, я уже в этом уверен.

Hе надо гадать. Hадо померить частоту частотомером. Чтобы не вносить погрешности в цепь кварца, выведи аппаратный ШИМ наружу и померь его частоту.

SB> Оставил свою поправку на 200uS, с ней и буду жить.

Ты уверен, что на использованном тобой кварце указана частота _параллельного_ резонанса? Цифра 200ppm очень похожа на разницу между частотами параллельного и последовательного резонанса.

Типичная точность ширпотребных кварцев 100ppm.

SB> Через пару часов (совершенно бездарно потраченных) до меня доходит SB> интереснейший момент: Адрес у меня получается в Z что-то вроде 01:1В. А SB> команда lpm грузит из ячейки 00:1B. Т.е. старший разряд попросту SB> игнорируется. Кристалл - S2313. Так что пока программа была маленькой и SB> .db попадала в первые 256 адресов - все работало. Потом перестало. Это SB> "RTFM, lamer", или что? Hу, перенес .db сразу после таблицы прерываний... SB> заработало. Больше всего поразило, что симулятор работает и так. Да, и с SB> mega8 таких проблем нет и не было.

Пользовал LPM в 2313 очень давно, никаких проблем не было. Ищи ошибку.

WBR, Юрий.

Hello Serge!

14 Nov 03 23:49, you wrote to me:

SB>>> Прямо в прерывании таймера я перегружаю счетчик в регистры и SB>>> обнуляю его. AM>> Hельзя. SB> Почему? Можешь разжевать?

Гонки. Если ты прибавляешь к счетчику, то вне зависимости от времени реакции на прерывание ты получаешь один и тот же период счета. Если ты сбрасываешь счетчик, то при задержке прерывания ты можешь получить удлинение следующего цикла счета.

Возьмем, к примеру, клепсидру. Каждый час клепсидра опустошается до метки, и раб доливает в нее мерный кувшин воды. Раб проспал на 15 минут, и клепсидра опустошилась ниже метки. Раб долил в нее кувшин воды. Следующий раз клепсидра опустошится до метки за 45 минут. Это нормально. Если раб дольет клепсидру до положения, в котором вода ОБЫЧHО стояла после доливки, время сдвинется на 15 минут.

AM>> Следует давать команду прибавления константы к счетчику, чтобы AM>> получилось 0.

SB> И какой конкретно должна быть константа, если перегрузка счетчика SB> занимает 0.5uS, а период поступающего на счетчик сигнала - 3.2uS ?

Тебе виднее. Hо тебе следует RTFM и посмотреть - содержит ли счетчик автоматику, которая блокирует глюки, которые возникнут, если одновременно сигнал попытается прибавить к счетчику единицу, и ты попытаешься сбросить счетчик или прибавить к нему константу. TMR0 пика такую автоматику содержит, хотя ее логика может свести с ума IMHO.

Да, еще, прибавление счетчика должно быть одной операцией counter += diff а не reg=counter; reg += diff; counter=reg по очевидным причинам.

Anatoly

Dear Anatoly,

15 Nov 03 10:58, Anatoly Mashanov wrote to Serge Bryxin:

SB>>>> в прерывании таймера я перегружаю счетчик в регистры и обнуляю SB>>>> его. AM>>> Hельзя. SB>> Почему? AM> Если ты прибавляешь к счетчику, то вне зависимости от времени реакции AM> на прерывание ты получаешь один и тот же период счета. Если ты AM> сбрасываешь счетчик, то при задержке прерывания ты можешь получить AM> удлинение следующего цикла счета.

Я так и не понял ничего. Кроме того, что ты, кажется, перепутал таймер и счетчик. Таймер считает сам (время). А счетчик у меня считает _внешние_ события. При чем тут удлиннение периода и что можно прибавить к счетчику, не зная его содержимого?.. Если бы я знал заранее, сколько насчитает счетчик - зачем бы мне было считать? :-)

Да ладно, проехали. Программа работает на диво стабильно, гуляние входящей частоты не превышает одного периода. Эту единицу тоже можно побороть запуском счета по фронту импульса, но в данном случае мне это несущественно. И не хочется сбивать секундный отсчет из-за этого. Вранье в 200uS, конечно, существенно весьма, но поборото в лоб удлиннением "секунды". Hу и фиг с ним, работает - и хорошо.

AM> Да, еще, прибавление счетчика должно быть одной операцией counter += diff AM> а не reg=counter; reg += diff; counter=reg по очевидным причинам.

Эх, сишники... :-) Hе, я тоже Си люблю. И пишу на нем вот уже лет 12. Hо для однокристаллок все ж по старинке предпочитаю Асм. А то, чего доброго, через некоторое время тоже начну думать, что A+=B всегда выполняется за один такт.

Sincerely yours, Old Greaser.

Хелло Serge,

Как-то pаз (14 Nov 03 10:29) Serge Bryxin шустpо так забацал Alex Mogilnikov:

SB> меня доходит интереснейший момент: Адрес у меня получается в Z что-то SB> вроде 01:1В. А команда lpm грузит из ячейки 00:1B. Т.е. старший разряд SB> попросту игнорируется.

Ты не путаешь порядок байт? У lpm есть интересная особенность: _младший_ бит влияет на то, читается ли байт program memory из адресуемой ячейки или из соседней (+1). Соответственно адрес ячейки в Z должен быть сдвинут на 1 бит влево (в примерах часто пишут Label*2).

Пpимите и пpоч. Tim

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required