Страница 1 из 2
Измерить ширину и период импульса на asm
Добавлено: Пн ноя 25, 2013 23:18:20
spartanec
Задача измерить ширину и период импульса на asm. Помогите составить алгоритм программы.
Я так понимаю что нужно использовать т/с с пребыванием по фронту .
Re: Измерить ширину и период импульса на asm
Добавлено: Пн ноя 25, 2013 23:32:07
blackx
Да, можно сделать и так. Выделяем какой-нибудь регистр для хранения флага состояния (нужен 1 бит), например R18.
Внешнее прерывание настраиваем на любое изменение сигнала, в обработчике пишем проверку флага. Если флаг не установлен (0), запускаем таймер (ставим как надо биты CS0:2 регистра TCCRx для запуска), ставим флаг и выходим из обработчика. Иначе, если флаг установлен, сохраняем текущее значение счетного регистра таймера (TCNTx), сбрасываем флаг, останавливаем таймер, сбрасываем таймер, выходим.
На таймер также вешаем прерывание по переполнению. Как только таймер досчитает до максимального значения, сбрасываем флаг, останавливаем таймер, сбрасываем таймер - в этом случае попытка измерения завершается неудачей (слишком широкий импульс).
Вот и весь алгоритм собственно.
Re: Измерить ширину и период импульса на asm
Добавлено: Вт ноя 26, 2013 00:09:34
spartanec
Поясните по поводу флага, о каком именно флаге идет речь ? О флаге переполнения?
На первый раз исправил сам.
Вам нужно прочитать Правила форума.
http://radiokot.ru/forum/viewtopic.php?f=19&t=6538
Нарушение Правил форума п. 2.7
aen
Re: Измерить ширину и период импульса на asm
Добавлено: Вт ноя 26, 2013 00:16:10
Шурики
Речь идёт о флаге программном, который устанавливается или сбрасывается не аппаратно, по переполнению чего либо или другому событию, а самим программистом по событию, которое он хочет отметить сам для себя.
Re: Измерить ширину и период импульса на asm
Добавлено: Вт ноя 26, 2013 00:34:01
spartanec
Спасибо . А как именно мы узнаем когда состояние на пине 0 если мы сделали прерывание по нарастающему фронту?
Re: Измерить ширину и период импульса на asm
Добавлено: Вт ноя 26, 2013 00:45:07
Шурики
Вот для этого и нужны программные флаги, чтобы сохранить информацию об интересующем событии, возможно, с подробностями.
Прерывания, не знаю, на каком кристале хотите реализовать, но современные микроконтроллеры могут отслеживать состояния изменения сигнала по прерыванию: из 1->0 (спад), из 0->1 (фронт). Мы можем запрограммировать прерывание по одному из указанных событий или по двум из них.
Для примера: событие по прерыванию: изменение состояния вывода. Уходим в прерывание. Внутри выставляем флаг, что событие произошло. Анализируем (считываем) состояние входа - запоминаем уровень во втором флаге, если нужно и т.д.
Re: Измерить ширину и период импульса на asm
Добавлено: Вт ноя 26, 2013 01:24:26
blackx
spartanec писал(а):Спасибо . А как именно мы узнаем когда состояние на пине 0 если мы сделали прерывание по нарастающему фронту?
Если вы имеете ввиду, как узнать в прерывании какой фронт был - нарастающий или спадающий, до относительно достоверно это можно узнать, если сразу проверить текущее состояние вывода (бит регистра PINx). Если там 1 - то был нарастающий, иначе - спадающий.
Re: Измерить ширину и период импульса на asm
Добавлено: Вт ноя 26, 2013 03:41:09
akl
spartanec писал(а):Задача измерить ширину и период импульса на asm. Помогите составить алгоритм программы.
По мне, для этой цели проще использовать имеющийся практически в каждом контроллере режим захвата, т.к. событие прихода активного перепада запоминается на аппаратном уровне и исключается погрешность входа в прерывание и считывания в нем состояния таймера.
Re: Измерить ширину и период импульса на asm
Добавлено: Чт дек 05, 2013 23:24:32
spartanec
А мне нужно использовать предделитель?
Re: Измерить ширину и период импульса на asm
Добавлено: Чт дек 05, 2013 23:41:44
blackx
А вы пробовали делать простой расчет? Может вам и мк не подойдет для задачи, а вы уже его выбрали?
AVR работают на частотах до 20 МГц. Предделитель может быть равен p = 1, 8, 64, 256 или 1024.
8-битный таймер на такой частоте будет переполняться с частотой 20000 / (256 * p) кГц, 16-битный - 20000 / (65536* p) кГц. Вот и считайте, исходя из длительности ваших импульсов.
Re: Измерить ширину и период импульса на asm
Добавлено: Пт дек 06, 2013 18:45:02
spartanec
blackx писал(а):переполняться с частотой 20000 / (256 * p) кГц
Я никак не пойму связь частоты с временем. Допусти МК работает на частоте 8 мГц, переполнение на 31,25 кГц (p=1). Это значит что счетчик будет считать до 0,032 мс?
Re: Измерить ширину и период импульса на asm
Добавлено: Пт дек 06, 2013 18:47:04
Шурики
Частота со временем связана одним простым уравнением: F=1/T
Вот и всё.
Re: Измерить ширину и период импульса на asm
Добавлено: Пт дек 06, 2013 22:14:51
blackx
Вы правильно понимаете. Если сложно с герцами, можно сразу начать расчет с секунд.
Допустим, частота мк - 8 МГц, по формуле определяем длительность одного такта: 1/8M = 0,125 мкс. Нетрудно догадаться, что это число мы теперь умножаем на предделитель и на 256/65536, в зав-ти от разрядности таймера. Например, 0,125 * 1024 * 65536 = 8388608 мкс = 8,4 с - максимальная возможная задержка 16-битного таймера на частоте 8 МГц.
Ну а там прикидывайте какой вам нужен таймер и с каким предделителем. Предпочтительнее использовать 16-битный таймер с меньшим предделителем, чем 8-битный с большим - выше будет точность.
Re: Измерить ширину и период импульса на asm
Добавлено: Пт дек 06, 2013 22:42:08
spartanec
blackx, спасибо разобрался. Написал код, будет ли он правильно работать с таймером ?
https://gist.github.com/25325b2554d93a865c23
Re: Измерить ширину и период импульса на asm
Добавлено: Сб дек 07, 2013 07:55:26
akl
Удалил.
Re: Измерить ширину и период импульса на asm
Добавлено: Сб дек 07, 2013 11:57:13
blackx
spartanec, главное то не сказали, зачем вам все это нужно? Что собираетесь измерять? Делаете прибор для измерения или просто нужно отличить импульс 1 мс от импульса в 2 мс? Какая точность нужна? Какой диапазон частот (длительностей импульсов) нужен?
Мы можем выделить несколько регистров и использовать высокую опорную частоту (как в сообщении akl), а можем использовать только счетные регистры таймера, тикающего с низкой частотой. При этом не заморачиваться с "ручным" подсчетом в нескольких регистрах и не получать потом в них огромное число, которое нужно еще как-то обрабатывать. Оба варианта работать будут, с разной точностью, но будут. Второй я описал в начале темы.
Re: Измерить ширину и период импульса на asm
Добавлено: Сб дек 07, 2013 21:03:20
spartanec
blackx писал(а):spartanec, главное то не сказали, зачем вам все это нужно? Что собираетесь измерять?
Я делаю курсовую, мне не так важна точность , как понимание этой темы.
Re: Измерить ширину и период импульса на asm
Добавлено: Вс дек 08, 2013 17:47:34
blackx
Понятно. Тогда очень советую пока отложить эту идею с измерениями. Взять какую-нибудь книгу по AVR, либо статьи в интернете (
http://easyelectronics.ru/category/avr-uchebnyj-kurs,
http://radiokot.ru/start/mcu_fpga/avr). И читать от корки до корки, сразу повторяя все усвоенное в симуляторе AVR Studio. Это даст качественное понимание с минимальными трудозатратами

Re: Измерить ширину и период импульса на asm
Добавлено: Вс дек 08, 2013 21:49:11
spartanec
blackx писал(а):Понятно. Тогда очень советую пока отложить эту идею с измерениями.
Как код который я написал? Да я как раз читал эти статьи без них вообще не знал ничего.
Re: Измерить ширину и период импульса на asm
Добавлено: Вс дек 08, 2013 22:10:14
zero648
spartanec, для точного измерения используй регистр ICR1 без всяких предделителей прескалеров. У тиньки 2313 есть такой регистр и специальная нога для захвата таймера 1, ICP обозначена, входной сигнал вешаешь на эту ногу, делаешь эту ногу входом, включаешь прерывания по захвату и измеряешь сигналы, не забывай считать переполнения таймера 1, если вдруг сигнал будет больше размера таймера 1, а хвостик будет в регистре ICR1.