CLR ZH
CLR YH
LDI ZL,LOW(CalibrE)
LDI YL,LOW(CalibrE+$60) ; нужно установить адрес в области RAM
OUT EECR,ZH
_E:
RCALL EEREAD
ST Y+,r18
INC ZL
CPI ZL,LOW(E_END)
BRNE _E
RJMP PC+0
EERead:
;SBIC EECR,EEPE
;RJMP EERead
OUT EEARL, ZL ; откуда здесь temp Нужно поставить адрес ячейки.
SBI EECR,EERE
IN R18, EEDR
ret
счетчик байт массива
буфер обмена
начальный адрес источника (регистр адреса еепром)
начальный адрес массива (указатель z/x/y -на выбор)
--------
читаем еепромку в буфер
пишем в озу из буфера
адрес источника = адрес источника +1 (или -1)
адрес массива = адрес массива +1 (или -1)
счетчик = счетчик-1
ежли счетчик не равен 0 продолжим сызнова
---------
ну иль чего из вариаций...
указатели весьма в дефиците - использовать два сразу для простого примитива - как-то ЖАБО ЗЭЛЭНЭ
это с какого бодуна "потеряли"?
сколько байт в массиве - столько и в счетчике,
у данного примера предобработка массива с последующим декрементом счетчика событий
другое дело, если была бы постобработка (вначале счетчик событий - затем массив)
- тогда один элемент может потеряться.
Ээххх...
Ежли б народ чууток больше внимания общим алгоритмам уделял, без привязки к конкретному ядру и системе команд - такой алгоритм можно было б под любое семейство МК прикошачить!
А уж далее - "полировка" под конкретную систему команд и ресурсы конкретного МК.
Дорогие котобратья и котосестры, подскажите пожалуйста как лучше выполнить поставленную задачу?
Микроконтроллер Atmega8, в устройсте есть графический LCD индикатор 128*64 и шина i2c, все висит на вышеупомянутом МК, так же есть несколько цифровых входов. Есть еще другой сигнал, точнее импульсы, которые нужно измерить с минимальной потерей времени. Измерить нужно время между импульсами, но не в коем случае не количество импульсов в секунду(например), так как этот способ вызовет задержку в эту самую секунду, для устройства это критично. В программе для этого инициализировано прерывание INT0 по нарастанию сигнала. Частота импульсов может варироваться от 1 до 350 Гц. Думаю создать какой-нито счетчик, а в прерывании INT0 смотреть показания счетчика и обнулять его.
Вопросы:
Как организовать счетчик для такой задачи что бы точность измерений составляла 1 Гц (особенно важно на бОльших частотах)? И вообще возможно ли это? Если да то как и сколько байт памяти будет занимать максимально возможный результат? Думаю 3 байта...
Не скажется ли это на работе всего устройства? В частности не будет ли сбиваться LCD индикатор и шина i2c?
Может есть другие пути решения такого рода проблем?
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
нижний предел в 1Гц - от задержки измерения в 1 сек в худшем случае НИКУДА не уйти.
Подключай свой сигнал на вывод INT0 или INT1 настраивай прерывание на работу по фронту.
Первый фронт - запускаешь таймер, на второй - считываешь значение. Если во время между прерываниями ловишь переполнение таймера - частота ниже нижнего предела измерения, надо сбросить режим измерения на начало и ждать следующего прерывания чтобы стартовать таймер. Таймер делителями настроить так чтобы переполнялся больше чем за 1 сек - иначе на предел в 1гц не обеспечить. И по всей видимости это должен быть 16-битный таймер.
Потом тебе надо будет реализовать функцию 1/X и т.д. использовать немного арифметики чтобы согласовать скорость счета таймера с милисекундами и после деления получить герцы.
xkp писал(а):Измерить нужно время между импульсами, но не в коем случае не количество импульсов в секунду(например), так как этот способ вызовет задержку в эту самую секунду, для устройства это критично. В программе для этого инициализировано прерывание INT0 по нарастанию сигнала. Частота импульсов может варироваться от 1 до 350 Гц. Думаю создать какой-нито счетчик, а в прерывании INT0 смотреть показания счетчика и обнулять его.
Для этой цели есть модуль Capture в МК.
Этот модуль по входному событию на пине (входе модуля) производит АППАРАТНУЮ запись (захват) значения некоего таймера, который работает с этим модулем.
Одновременно происходит прерывание от этого модуля, где и считывается из буфера Capture то значение счетчика которое было захвачено.
Делается так же буфер на два значения измерений, где из текущего захвата вычитается предыдущее значение.
Для обеспечения заданной точности по любому потребуется усреднять (фильтровать) измерения, поэтому нужен так же кольцевой буфер на несколько измерений, которые каждый цикл захвата усредняются.
Задержка НЕИЗБЕЖНА. Это ФИЗИКА и МАТЕМАТИКА. Это ПРИРОДА...
Зачем?
Вывод на символьный дисплей - столь медленный процесс, что его СПОКОЙНО можно сделать фоновым и не мешающим основному, либо вообще оставить в суперлупе...
Alexeyslav, измерять нужно не частоту а время между импульсами. Сигнал уже висит на INT0. С переполнением можно проще разобраться: там где опрос счетчика значение $FF принимать как 0.
КРАМ, а можно поподробнее? С усреднением проблем нет. У меня для этого есть отдельная подпрограмма: беру предыдущее значение и умножаю на 9, прибавляю сюда текущее значение и делю на 10, так же учитывается и остаток, который пстепенно копится и тоже попадает под усреднение. Раньше остаток я игнорировал - были потери, потом доработал подпрограмму усреднения и потери исчезли.
BOB51, Внешний МК? тоже вариант, повесить tiny13, например. Такой вариант я тоже рассматриваю. Но сначала надо мне научится считать время между импульсами, а уже потом думать в какой МК влезет программа.
КРАМ, дисплей не символьный а графический.
Да еще в устройстве помимо того что уже есть скорее всего будет индикация на семисегментных светодиодных индикаторах, по нехватке выводов скорее всего схема будет статическо-динамической. Помимо индикации в программе еще будет куча расчетов и запись/чтение EEprom (энергонезависиой памяти). Так что время то может и не хватить на все задумки... Может и придется вешать внешний МК. Но это решим потом. Хотелось бы значало все таки посчитать это время на макетке...
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Как метод замера интервала...
Возможен вариант маркер-окошек - замер равными кусочками и фильтрация по вектору из полученного количества измеренных кусочков (если нужна быстрота и не слишком высокая точность измерений).
Т.е. получил активный сигнал на линии и запустил таймерок... отсчитал "кусманчик" проверил линию - если сигнал сохранился прибавил в указателе единичку и считаю снова. как сигнал не обнаружился - прекратил счет и прыгнул по вектору из указателя. Замер с точностью половинки длительности "кусочка". (я таким манером сортировал листики в счетчике копий на копире А3/А4/A4R все что не попало в заданный диапазон =брак)
xkp писал(а):сначала надо мне научится считать время между импульсами, а уже потом думать в какой МК влезет программа.
... Может и придется вешать внешний МК. Но это решим потом. Хотелось бы значало все таки посчитать это время на макетке...
По мне, решается одним таймером Т1, у которого разрешены прерывания CAPT_T1 и OVER_T1.
Выражение для определения периода Tx=nox/Fo/N, где nox-число тактов частоты Fo за время измерения периода (N=1), N-целое число измеряемых периодов. Чтобы получить удобочитаемые значения лучше ввести в выражение множитель. При множителе 1'000'000, например, результат будет в микросекундах. По такому принципу работает схема отсюда.
Можно.
Открываете даташит на Мегу 8:
И обнаруживаете искомое.
xkp писал(а):
КРАМ, дисплей не символьный а графический.
Это не важно. Полный цикл регенерации такого дисплея при статических изображениях типа вывода числовых величин достаточно проводить с частотой не выше 2...4 Гц.
ЗЫ. То что Вы предлагаете в качестве фильтра называется БИХ. БИХ при неправильном расчете может возбуждаться. КИХ на основе кольцевого буфера ест чуть больше памяти, но всегда абсолютно устойчив.
измерять нужно не частоту а время между импульсами.
Вопрос на засыпку: какой интервал между импульсами у частоты 1Гц?
Если измерять время между фронтами то можно налажать - не всегда имеется на входе чистый меандр.
форма сигнала - прямоугольник (либо 0, либо 1), ни каких меандров, ну сейчас опять начнете собирать что время нарастания и затухания сигнала и т.п., это не критично. И ваш вопрос про интервал на частоте 1 Гц немного не корректен. Оно и ежу... эм, коту понятно что на 1 Гц время составит 1 сек. А вот на 300 Гц время измерения в 1 секунду это очень много, поэтому и написано что измерять нужно время между импульсами
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic