У меня всего один 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: получим частотомер наоборот. частотомер формирует собственное "окно" и считает внешние импульсы, а тут "окно" формируется внешними импульсами, а считает собственную частоту.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
чтобы меньше потерять импульсов между чтением регистра TCNT0 и его обнулением. а еще лучше сделать это на ассемблере, чтобы еще меньше было потерь времени между чтением и обнулением. в протеусе у тебя получилась частота 15999986. потеряно 14 импульсов. переделай, как я предложил, потерь должно стать меньше. ну, это я так думаю ...
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
А так кварц дерьмо, палец на кварц ложишь число hast0=101 лезет вверх, долезло до 159, при холодном старте начало с 80. После 10 минут работы находится в диапазоне 99-104. Не поленился, паяльник включил, нагрел до hast0=239, потом какой-то сбой пошел, спустя 5 минут остывания в норму вошел 101-102.
А вы хотите стабильность? В термокамеру его надо сувать, может тогда и будет стабильность.
Если в друг произошел запрос на прерывание Т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, пока не понятно. скорее всего, это лишние потери времени при компиляции с языка Си. а у меня сделано на ассемблере без лишних операций. получился вот такой код:
Код:
.include "m8def.inc" ; ATMega8
.def counter_ovf1 = R16
.cseg .org 0 rjmp nachalo_code
.org ICP1addr rjmp timer1_ICP
.org OVF1addr rjmp timer1_OVF
nachalo_code: ldi R26, low(RAMEND) out SPL, R26 ldi R26, high(RAMEND) out SPH, R26
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 30
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения