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

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.

Reply to
Serge Bryxin
Loading thread data ...

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, Юрий.

Reply to
Yuriy K

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

Reply to
Anatoly Mashanov

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.

Reply to
Serge Bryxin

Хелло 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

Reply to
Tim N. Tashpulatov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.