Измерить ширину и период импульса на asm

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 13
Зарегистрирован: Вт фев 03, 2009 19:12:26

Сообщение spartanec »

Задача измерить ширину и период импульса на asm. Помогите составить алгоритм программы.
Я так понимаю что нужно использовать т/с с пребыванием по фронту .
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

Да, можно сделать и так. Выделяем какой-нибудь регистр для хранения флага состояния (нужен 1 бит), например R18.

Внешнее прерывание настраиваем на любое изменение сигнала, в обработчике пишем проверку флага. Если флаг не установлен (0), запускаем таймер (ставим как надо биты CS0:2 регистра TCCRx для запуска), ставим флаг и выходим из обработчика. Иначе, если флаг установлен, сохраняем текущее значение счетного регистра таймера (TCNTx), сбрасываем флаг, останавливаем таймер, сбрасываем таймер, выходим.

На таймер также вешаем прерывание по переполнению. Как только таймер досчитает до максимального значения, сбрасываем флаг, останавливаем таймер, сбрасываем таймер - в этом случае попытка измерения завершается неудачей (слишком широкий импульс).

Вот и весь алгоритм собственно.
Изображение only pure true norwegian blackx Изображение
Реклама
Родился
Сообщения: 13
Зарегистрирован: Вт фев 03, 2009 19:12:26

Сообщение spartanec »

Поясните по поводу флага, о каком именно флаге идет речь ? О флаге переполнения?




На первый раз исправил сам.
Вам нужно прочитать Правила форума.
http://radiokot.ru/forum/viewtopic.php?f=19&t=6538
Нарушение Правил форума п. 2.7

aen
Вымогатель припоя
Сообщения: 506
Зарегистрирован: Пн авг 31, 2009 22:10:50
Откуда: СК

Сообщение Шурики »

Речь идёт о флаге программном, который устанавливается или сбрасывается не аппаратно, по переполнению чего либо или другому событию, а самим программистом по событию, которое он хочет отметить сам для себя.
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 13
Зарегистрирован: Вт фев 03, 2009 19:12:26

Сообщение spartanec »

Спасибо . А как именно мы узнаем когда состояние на пине 0 если мы сделали прерывание по нарастающему фронту?
Реклама
Вымогатель припоя
Сообщения: 506
Зарегистрирован: Пн авг 31, 2009 22:10:50
Откуда: СК

Сообщение Шурики »

Вот для этого и нужны программные флаги, чтобы сохранить информацию об интересующем событии, возможно, с подробностями.

Прерывания, не знаю, на каком кристале хотите реализовать, но современные микроконтроллеры могут отслеживать состояния изменения сигнала по прерыванию: из 1->0 (спад), из 0->1 (фронт). Мы можем запрограммировать прерывание по одному из указанных событий или по двум из них.
Для примера: событие по прерыванию: изменение состояния вывода. Уходим в прерывание. Внутри выставляем флаг, что событие произошло. Анализируем (считываем) состояние входа - запоминаем уровень во втором флаге, если нужно и т.д.
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

spartanec писал(а):Спасибо . А как именно мы узнаем когда состояние на пине 0 если мы сделали прерывание по нарастающему фронту?
Если вы имеете ввиду, как узнать в прерывании какой фронт был - нарастающий или спадающий, до относительно достоверно это можно узнать, если сразу проверить текущее состояние вывода (бит регистра PINx). Если там 1 - то был нарастающий, иначе - спадающий.
Изображение only pure true norwegian blackx Изображение
akl
Друг Кота
Сообщения: 4463
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

spartanec писал(а):Задача измерить ширину и период импульса на asm. Помогите составить алгоритм программы.
По мне, для этой цели проще использовать имеющийся практически в каждом контроллере режим захвата, т.к. событие прихода активного перепада запоминается на аппаратном уровне и исключается погрешность входа в прерывание и считывания в нем состояния таймера.
Родился
Сообщения: 13
Зарегистрирован: Вт фев 03, 2009 19:12:26

Сообщение spartanec »

А мне нужно использовать предделитель?
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

А вы пробовали делать простой расчет? Может вам и мк не подойдет для задачи, а вы уже его выбрали?

AVR работают на частотах до 20 МГц. Предделитель может быть равен p = 1, 8, 64, 256 или 1024.
8-битный таймер на такой частоте будет переполняться с частотой 20000 / (256 * p) кГц, 16-битный - 20000 / (65536* p) кГц. Вот и считайте, исходя из длительности ваших импульсов.
Изображение only pure true norwegian blackx Изображение
Родился
Сообщения: 13
Зарегистрирован: Вт фев 03, 2009 19:12:26

Сообщение spartanec »

blackx писал(а):переполняться с частотой 20000 / (256 * p) кГц
Я никак не пойму связь частоты с временем. Допусти МК работает на частоте 8 мГц, переполнение на 31,25 кГц (p=1). Это значит что счетчик будет считать до 0,032 мс?
Вымогатель припоя
Сообщения: 506
Зарегистрирован: Пн авг 31, 2009 22:10:50
Откуда: СК

Сообщение Шурики »

Частота со временем связана одним простым уравнением: F=1/T
Вот и всё.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

Вы правильно понимаете. Если сложно с герцами, можно сразу начать расчет с секунд.

Допустим, частота мк - 8 МГц, по формуле определяем длительность одного такта: 1/8M = 0,125 мкс. Нетрудно догадаться, что это число мы теперь умножаем на предделитель и на 256/65536, в зав-ти от разрядности таймера. Например, 0,125 * 1024 * 65536 = 8388608 мкс = 8,4 с - максимальная возможная задержка 16-битного таймера на частоте 8 МГц.

Ну а там прикидывайте какой вам нужен таймер и с каким предделителем. Предпочтительнее использовать 16-битный таймер с меньшим предделителем, чем 8-битный с большим - выше будет точность.
Изображение only pure true norwegian blackx Изображение
Родился
Сообщения: 13
Зарегистрирован: Вт фев 03, 2009 19:12:26

Сообщение spartanec »

blackx, спасибо разобрался. Написал код, будет ли он правильно работать с таймером ? https://gist.github.com/25325b2554d93a865c23
akl
Друг Кота
Сообщения: 4463
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Удалил.
Последний раз редактировалось akl Вс дек 08, 2013 02:40:18, всего редактировалось 1 раз.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

spartanec, главное то не сказали, зачем вам все это нужно? Что собираетесь измерять? Делаете прибор для измерения или просто нужно отличить импульс 1 мс от импульса в 2 мс? Какая точность нужна? Какой диапазон частот (длительностей импульсов) нужен?

Мы можем выделить несколько регистров и использовать высокую опорную частоту (как в сообщении akl), а можем использовать только счетные регистры таймера, тикающего с низкой частотой. При этом не заморачиваться с "ручным" подсчетом в нескольких регистрах и не получать потом в них огромное число, которое нужно еще как-то обрабатывать. Оба варианта работать будут, с разной точностью, но будут. Второй я описал в начале темы.
Изображение only pure true norwegian blackx Изображение
Родился
Сообщения: 13
Зарегистрирован: Вт фев 03, 2009 19:12:26

Сообщение spartanec »

blackx писал(а):spartanec, главное то не сказали, зачем вам все это нужно? Что собираетесь измерять?
Я делаю курсовую, мне не так важна точность , как понимание этой темы.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

Понятно. Тогда очень советую пока отложить эту идею с измерениями. Взять какую-нибудь книгу по AVR, либо статьи в интернете (http://easyelectronics.ru/category/avr-uchebnyj-kurs, http://radiokot.ru/start/mcu_fpga/avr). И читать от корки до корки, сразу повторяя все усвоенное в симуляторе AVR Studio. Это даст качественное понимание с минимальными трудозатратами :beer:
Изображение only pure true norwegian blackx Изображение
Родился
Сообщения: 13
Зарегистрирован: Вт фев 03, 2009 19:12:26

Сообщение spartanec »

blackx писал(а):Понятно. Тогда очень советую пока отложить эту идею с измерениями.
Как код который я написал? Да я как раз читал эти статьи без них вообще не знал ничего.
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

spartanec, для точного измерения используй регистр ICR1 без всяких предделителей прескалеров. У тиньки 2313 есть такой регистр и специальная нога для захвата таймера 1, ICP обозначена, входной сигнал вешаешь на эту ногу, делаешь эту ногу входом, включаешь прерывания по захвату и измеряешь сигналы, не забывай считать переполнения таймера 1, если вдруг сигнал будет больше размера таймера 1, а хвостик будет в регистре ICR1.
Ответить

Вернуться в «AVR»