Приветствую всех .
Возник один (пока один) вопрос. Собственно вопрос будет в конце.А пока предыстория. Есть у меня частотомер ,он же измеритель периодов, длитель-ностей и пауз импульсов , секундомер и др.
Сделал я его лет 20 назад на МС TTL и на рассыпухе. И эти 20 лет он прекрасно работает - стабильно и точно.Но захотелось сделать нечто более совершенное и современное,например на МК AVR - именно на AVR . Что-то Pic-и мне не очень нравятся.
И еще одно отступление. Никогда слепо не повторяю ни чьих конструк-ций.Всегда досконально разбираюсь и обычно переделываю (что-то добавляю или выбрасываю) как надо мне , из той конструкции ,которую беру за основу.
После того , как за пару месяцев я перелопатил наверное почти все, что имелось в интернете по вопросам частотомеростроения не только на русском , но и на английском языке ; стало понятно , что сделать хороший прибор только на микроконтроллере гораздо сложнее , чем на рассыпухе. По причине внутренних особенностей МК . Но об этом в следующий раз.
Внизу приложены 2 файла. Это 2 программы частотомера на ATtiny2313 с измеряемой частотой до 4 МГц ( тактовая частота МК - 10 МГц ). Собственно это всего лишь 2 варианта одной программы. Отличия в назначении таймеров/счетчиков.
В текстовой части alp.- alg.- файлов все подробно описано.
1). 3_частотомер : T/C 0 - счет импульсов
T/C 1 - формирование интервала измерения
2). 4_частотомер : T/C 0 - формирование интервала измерения
T/C 1 - счет импульсов
Вот сейчас я начинаю подходить к своему вопросу.
Почему 2 варианта ?
Теоретически разница большая и более правильный и точный это
второй вариант. По крайней мере мне казалось вначале.
Например считаем до числа N в самом старшем счетном трехбайтном регистре.
------------------------------------------------------------------------------
В первом случае T/C 0 считает до 256 дальше прерывание по
переполнению и увеличение на единицу двухбайтного регистра,
который фиксирует число этих переполнений .
В первом случае число вызовов п/п обработчика прерываний Timer_0_overflow
в 256 раз больше чем во втором случае, а каждый вызов п/п обработчика
прерываний занимает 4 такта а не 1 такт при обычном счете( это если
подпрограмма написана очень кратко :
| Timer_0_overflow
count2 ++
reti )
итого лишние N * 256 * (4-1) = тактов.
Измеряемая частота 2,5 МГц - индикатор показывает 2 500 000 (+/-1).
Измеряемая частота 5 МГц - индикатор показывает 5 000 002.
А если п/п Timer_0_overflow написать правильно (как положено) :
| Timer_0_overflow
r16 ->
r17->
sreg->
count2 ++
->sreg
->r17
->r16
reti
То каждый вызов п/п обработчика прерываний занимает 18 тактов
итого лишние N * 256 * (18-1) = тактов.
Измеряемая частота 2,5 МГц - индикатор показывает 2 500 000 (+/-1).
Измеряемая частота 5 МГц - индикатор показывает 5 000 008 .
-------------------------------------------------------------------------------
Во втором случае T/C 1 считает до 65536 дальше прерывание по
переполнению и увеличение на единицу однобайтного регистра,
который фиксирует число этих переполнений .
Каждый вызов п/п обработчика прерываний занимает 3 такта
а не 1 такт при обычном счете ( это если подпрограмма написана
очень кратко :
| Timer_1_overflow
count2 ++
reti )
итого лишние N * (3-1) = тактов.
Измеряемая частота 2,5 МГц - индикатор показывает 2 500 000 (+1).
Измеряемая частота 5 МГц - индикатор показывает 5 000 002 (+/-1).
А если п/п Timer_1_overflow написать правильно (как положено) :
| Timer_1_overflow
r16 ->
r17->
sreg->
count2 ++
->sreg
->r17
->r16
reti
То каждый вызов п/п обработчика прерываний занимает 17 тактов
итого лишние N * (17-1) = тактов.
Измеряемая частота 625 000 Гц - индикатор показывает 625 000 (+/-1).
Измеряемая частота 1,25 МГц - индикатор показывает 1 250 002.
Измеряемая частота 2,5 МГц - индикатор показывает 2 500 004 .
Измеряемая частота 5 МГц - индикатор показывает 2 500 008 .
Оба варианта программы с разным написанием п/п обработчика прерываний
проверены в симуляторе и железе . Измеряемая частота бралась с тактового
генератора МК через двоичный счетчик 1533ИЕ5 , т.е. я проверяю математическую правильность программы . Может быть не правильно было пытаться измерять 5 МГц , но меряет. Там где результаты измерения меньших частот не показаны - там все ОК (+/-1) .
Так вот вопрос : Удивительно , но почему разница в показаниях
индикатора оказалась столь небольшая , особенно
при правильном написании п/п прерывания ?
Помогите пожалуйста разобраться , кто знает.
Присоединённый файл ( Кол-во скачиваний: 287 )
4___________.rar