У меня всего один USB удлинитель, эталон так же как и МК(прошивка) управляется по UART, эталон не запоминает установленную частоту и начинает после включения частоту гнать 1Гц.
Так вот, либо управляю МК либо эталоном.
100011 мкс это частота эталона, производитель уверяет 10 минус 12 степени.
Как вам такой вариант:
На вывод XCK T0 подаем наш эталонный 1Гц, это будет калибровочный интервал.
100 раз в секунду вызывается прерывание по таймера T1.
В прерывании производим сам отсчёт времени и отсчёт длительности калибровочного интервала T0.
Так как прерывание T1 будет вызываться 100 раз в секунду, соответственно и будет проверять состояние T0.
По прошествии какого-то времени останавливаем процесс и записываем разницу в еепром или еще куда.
Благодаря делителю в T0 это время можно увеличить.
Чисто теоретически время в T1 должно совпасть с T0.
а я бы сделал так:
пусть таймер0 считает свои тактовые импульсы. плюс счетчик переполнений таймера0.
а на вход Т1 подал бы эталонную частоту. в принципе - любую частоту. и настроил таймер1 делить по совпадению до интервала 1 секунда.
получим "окно для измерения собственной частоты в 1 секунду.
и в прерывании по сравнению считываем счетчик таймера0 и счетчик переполнений.
но проверяемое устройство должно иметь экран для вывода посчитанных импульсов таймером0. и сразу увидим собственную частоту.
Добавлено after 3 minutes 49 seconds:
получим частотомер наоборот.
частотомер формирует собственное "окно" и считает внешние импульсы, а тут "окно" формируется внешними импульсами, а считает собственную частоту.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
чтобы меньше потерять импульсов между чтением регистра TCNT0 и его обнулением.
а еще лучше сделать это на ассемблере, чтобы еще меньше было потерь времени между чтением и обнулением.
в протеусе у тебя получилась частота 15999986. потеряно 14 импульсов.
переделай, как я предложил, потерь должно стать меньше. ну, это я так думаю ...
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
А так кварц дерьмо, палец на кварц ложишь число hast0=101 лезет вверх, долезло до 159, при холодном старте начало с 80. После 10 минут работы находится в диапазоне 99-104.
Не поленился, паяльник включил, нагрел до hast0=239, потом какой-то сбой пошел, спустя 5 минут остывания в норму вошел 101-102.
А вы хотите стабильность? В термокамеру его надо сувать, может тогда и будет стабильность.
Dimon456 писал(а):Если в друг произошел запрос на прерывание Т0, обнулить его
если произошел запрос на прерывание Т0, то нужно не только сбросить флаг, но и сделать инкремент hast_t, так как переполнение уже наступило.
ну вот, в протеусе теперь потерялось всего 3 импульса вместо 14 импульсов.
в реальности тоже "нашлось" 12-13 импульсов.
то есть, стало гораздо точнее.
потерей 3 импульсов на частоте 16 МГц, я думаю, уже можно пренебречь.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
в протеусе частоты идеальные.
а в реальности кварцы имеют отклонение от номинала.
можно с достаточной уверенностью утверждать, что и в реальности мы теряем те же 3 импульса на частоте 16 МГц. поэтому я и сказал, что тремя импульсами можно пренебречь.
если измерять меньшую частоту, например, 1 МГц, то потерь вообще может не быть.
для интереса можешь у себя в протеусе это проверить, задав частоту МК 1 МГц.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
кстати, и простой расчет дает потерю 3 импульсов.
1. прочитали счетчик - счетчик стал +1.
2. загрузили регистр (например, R16) нулем - счетчик стал +2.
3. отправили в счетчик ноль - счетчик должен стать +3, а там оказался ноль.
вот эти +3 мы и теряем.
у меня есть подобные проекты, где желательно считать без потерь.
в данном случае я бы записал в счетчик 3, а не 0.
выполнили 3 операции - поставили счетчик в тройку.
тогда потерь не должно быть вообще.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Чтобы не мучаться с потерями в счетчике можно воспользоваться входом ICP1, на который подается эталонный период. Активным перепадом запоминается состояние T1 и очищается счетчик переполнений. Следующим активным перепадом значение ICR1 считывается, добавляется к счетчику переполнений. Вычитается начальное значение.
с таймером1 тут другая проблема. и дело даже хуже, чем с таймером0.
от момента захвата (фиксации в регистре ICR1) до входа в прерывание проходит 7-8 машинных циклов.
плюс нужна добавка, о которой я сказал выше - учет выполнения сброса регистра TCNT1 в ноль.
я сделал себе проект в протеусе с таймером1.
мне пришлось записать в регистр TCNT1 число 10. только после этого я получил в захвате стабильно число 0х2400 = 9216.
а почему у тебя получилось потерять 24, пока не понятно.
скорее всего, это лишние потери времени при компиляции с языка Си.
а у меня сделано на ассемблере без лишних операций.
получился вот такой код: