[uquote="dumbass",url="/forum/viewtopic.php?p=3396032#p3396032"]Как правильно настроить вывод ICP МК (тн2313), если в МК-ре т/с Т1 настроен в режиме захвата?
В книге написано что на вход. А с подключенным подтягивающем резистором или вывод должен "висеть в воздухе"?
По-идее разницы быть не должно...да и на практике, вроде бы, ничего не изменилось. Но все же как правильно?
Спасибо![/uquote] Так и так правильно. Сам использую и с включением подтяжки и Z-состоянием, если есть внешняя подтяжка. К примеруСпойлер
Ошибка разводки печати. На самом деле, подключение идет на PB0/T0. Для частотомеров на AVR методом захвата, когда счет периодов измеряемой частоты идет T0, а счет периодов опорной частоты T1.
Хочу измерять частоту вращения вала асинхронной машины. Для этого буду использовать датчик на основе эффекта Холла (с магнитом).
По программе: коэффициент предделителя выбрал 1024, чтобы значения периода было в милисекундах (пускай и слегка не точно).
Полученное значение периода сигнала вывожу на светодиоды в двоичном виде. Далее из двоичного числа делаю десятичное. Делю полученное значение на коэффициент =16/2 (16-частота работы МК, если бы было 1МГц, то на 1000 тактов МК был 1 такт таймера. Это мне дает: Тт1=Кпреддел./Fмк=1024/1000000=1,024мс -т.е. на св-диодах я получаю период сигнала.
откуда взялась двойка: на диске у меня две прорези, т.е. я имею на диске два зуба (см фото).)
Далее математически нахожу частоту и частоту оборотов в минуту.
вот так.
Знаю, Вы скажете мне на это --
но и до этого я дошел не сразу)
С семисегментным индикатором еще не работал, поэтому применяю св-диоды.
СпойлерСпойлер
.include "tn2313def.inc"
.def temp =R16
.cseg
.org 0x00 rjmp init
;ТАБЛИЦА ВЕКТОРОВ ПРЕРЫВАНИЙ
.org ICP1addr rjmp T1_capt ;(0х03) Захват таймера/счетчика Т1
.org INT_VECTORS_SIZE
;НАСТРОЙКА СТЕКА И ПОРТОВ
init: ldi temp,RAMEND
out SPL,temp
ser temp
out DDRB,temp ;В на выход с 0
ldi temp,~(1<<PD6)
out DDRD,temp ;D на выход с 0, кроме PD6
ldi temp,(1<<PD6)
out PORTD,temp ;ICP на вход БЕЗ подтяжки
;НАСТРОЙКА ТАЙМЕРА T1
ldi temp,1<<ICIE1
out TIMSK,temp ;Разрешаем прерывание по захвату Т1
ldi temp,(1<<ICNC1 | 1<<ICES1 | 1<<CS12 | 0<<CS11 | 1<<CS10)
out TCCR1B,temp ;1/1024
sei
;ОСНОВНОЙ ЦИКЛ
MAIN: rjmp MAIN
;ОБРАБОТКА ПРЕРЫВАНИЯ ПО ЗАХВАТУ
T1_capt:clr temp
out TCNT1H,temp
out TCNT1L,temp ;Обнулили счетный регистр
in ZL,ICR1L
in ZH,ICR1H
out PORTD,ZH
out PORTB,ZL ;Вывели значение периода на св-диоды
reti
вопросы:
1 можно было бы как то улучшить читабельность путем программного преобразования/расчета периода в частоту. Но как это сделать я не знаю. В интернете пишут для умножения и деления исп. команды mul и div. Но подходят ли они действительно для программирования МК и если нет, то как можно осуществить программный расчет?
2 С учетом текущей внешней схемотехникой формирования импульса мне необходимо настраивать ICP на вход с подтяжкой, верно?
3 на одном из фото указаны параметры датчика. как понять, где говорится про его предельную частоту измерения?
Спасибо!
На фото оптический датчик "на просвет" и диск с одним просветом (пропилом, окном).
Из магнитных - шестерня с А3144 и "магнитом ссади"(зуб шестерни в качествн магнитного шунта).
Датчик в виде наклеянного кусманчикафольги и оптрона "на отражение".
Как вариант - диск с прорезями и ранее показанный оптрон "на просвет".
деление/умножение на МК да ещё вещественных чисел довольно затратное занятие. Если реальных значений выводимых на дисплей немного(два-двасполовиной значащих десятичных разряда), то проще использовать табличное преобразование проведя все вычисления заранее на ПК.
Например, выводить значение оборотов на 4 знака с дискретностью 50 об/мин. От 0 до 10000 будет всего 200 значений в таблице. Если закодировать их в виде BCD то получится 2 байта на значение и минимум телодвижений с выводом на 7-сегментные индикаторы.
Таблица займёт всего 400 байт в FLASH-памяти и преобразование период-частота будет происходить практически мгновенно. И заметь - никаких плясок с мат.библиотеками, которые запросто отъедят десяток килобайт флеша.
Если вам нужна частота то нужно просто считать количество импульсов за определенное время. Так как у вас 2 импульса за оборот то считайте сколько придёт импульсов за 500 миллисекунд, и получите "готовую" частоту в герцах.
[uquote="dumbass",url="/forum/viewtopic.php?p=3396266#p3396266"]Хочу измерять частоту вращения вала асинхронной машины. Для этого буду использовать датчик на основе эффекта Холла (с магнитом).
...вопросы:
1 можно было бы как то улучшить читабельность путем программного преобразования/расчета периода в частоту. Но как это сделать я не знаю. В интернете пишут для умножения и деления исп. команды mul и div. Но подходят ли они действительно для программирования МК и если нет, то как можно осуществить программный расчет?
2 С учетом текущей внешней схемотехникой формирования импульса мне необходимо настраивать ICP на вход с подтяжкой, верно?
3 на одном из фото указаны параметры датчика. как понять, где говорится про его предельную частоту измерения?[/uquote]
[uquote="Alexeyslav",url="/forum/viewtopic.php?p=3397801#p3397801"]деление/умножение на МК да ещё вещественных чисел довольно затратное занятие. Если реальных значений выводимых на дисплей немного(два-двасполовиной значащих десятичных разряда), то проще использовать табличное преобразование проведя все вычисления заранее на ПК.
Таблица займёт всего 400 байт в FLASH-памяти и преобразование период-частота будет происходить практически мгновенно. И заметь - никаких плясок с мат.библиотеками, которые запросто отъедят десяток килобайт флеша.[/uquote]
Не так всё плохо с математикой в МК.
В хорошем макроассемблере деление 4-хбайтной переменной на 2-хбайтную будет одна макрокоманда с параметрами, скажем, такого типа:
div(делимое, делитель, итог деления).
Подключить файл с таким библиотечным элементом и написать команду – дело, условно говоря, нескольких минут.
Да и размеры программ не такие страшные. Команда деления занимает около 130 слов, команда умножения два на два байта занимает около 60 слов.
Так что всё просто и легко, никаких «плясок с мат.библиотеками».
Макросы тоже в некотором роде библиотека.
Только в данном случае разница в результирующем объеме программного кода - при подпрограммке он меньше (если только сам макрос не есть вызов подпрограммы).
Да, а в какой форме представлены операнды? А результат? Это всё целые числа. И время выполнения этого деления на 8-битных?
считайте сколько придёт импульсов за 500 миллисекунд, и получите "готовую" частоту в герцах.
Частоту вращения всяких механизмов обычно измеряют в оборотах в МИНУТУ. Т.к. на герцы частота получается очень небольшой и её трудно будет измерить с достаточной точностью прямым способом. Быстрее и точнее измерять период между импульсами и потом приводить его к частоте. Для чего и нужна математика.
Надо сказать что частота вращения силового двигателя в 100Гц это на пределе механических характеристик применяемых материалов из которого изготавливают ротор. Бор-машинки электрические, но там ротор совсем маленький по размерам - разгоняются до 500Гц, а дальше только совсем маленький размер ротора и пневаматика.
[uquote="Alexeyslav",url="/forum/viewtopic.php?p=3400402#p3400402"]Да, а в какой форме представлены операнды? А результат? Это всё целые числа. И время выполнения этого деления на 8-битных?[/uquote]
Все операнды и результат– целые числа, а в чём проблема?
Операции с целыми числами - ничего сложного, школьная арифметика, только надо следить, чтобы, с одной стороны, обеспечить требуемую точность и, с другой стороны, не выскочить за диапазон переменной. Запятая появляется только при выводе на индикатор в соответствующем месте.
Быстрое деление, наверно, редко нужно, я ни разу не сталкивался.
По возможности деление вроде как заменяют умножением.
При умножении и делении все операции проводятся в регистрах РОН,
получается довольно быстро.
Добрый день.
Помогите определить формат компилятора(чем открыть и компилировать?). http://elm-chan.org/works/fldrv/fliv.zip
(или как альтернатива сделайте мне пожалуйста сразу hex файл, там же в нем фьюзы зашиты)
Спасибо.
Уважаемый akl.
Стал проверять работу brtc в протеус. Один момент: для того, чтобы выйти из цикла brtc приходится отправлять команду два раза. Причем останов происходит на команде brtc.
Отправляю сообщение - перехожу в паузу - программа на brtc и флаг T установлен. Продолжение Run не изменяет ситуацию.
Повторное отправление сообщения и происходит выход из цикла с отработкой последующих команд и сбросом флага T.
Симулируется спящий режим. Поэтому все верно. При включенном спящем режиме выполнение программы прекращается сразу после команды sleep. И разбудить МК можно только действиями зависящими от настройки спящего режима.