Я так понимаю что нужно использовать т/с с пребыванием по фронту .
Измерить ширину и период импульса на asm
- Сообщения: 13
- Зарегистрирован: Вт фев 03, 2009 19:12:26
Задача измерить ширину и период импульса на asm. Помогите составить алгоритм программы.
Я так понимаю что нужно использовать т/с с пребыванием по фронту .
Я так понимаю что нужно использовать т/с с пребыванием по фронту .
- Реклама
Да, можно сделать и так. Выделяем какой-нибудь регистр для хранения флага состояния (нужен 1 бит), например R18.
Внешнее прерывание настраиваем на любое изменение сигнала, в обработчике пишем проверку флага. Если флаг не установлен (0), запускаем таймер (ставим как надо биты CS0:2 регистра TCCRx для запуска), ставим флаг и выходим из обработчика. Иначе, если флаг установлен, сохраняем текущее значение счетного регистра таймера (TCNTx), сбрасываем флаг, останавливаем таймер, сбрасываем таймер, выходим.
На таймер также вешаем прерывание по переполнению. Как только таймер досчитает до максимального значения, сбрасываем флаг, останавливаем таймер, сбрасываем таймер - в этом случае попытка измерения завершается неудачей (слишком широкий импульс).
Вот и весь алгоритм собственно.
Внешнее прерывание настраиваем на любое изменение сигнала, в обработчике пишем проверку флага. Если флаг не установлен (0), запускаем таймер (ставим как надо биты CS0:2 регистра TCCRx для запуска), ставим флаг и выходим из обработчика. Иначе, если флаг установлен, сохраняем текущее значение счетного регистра таймера (TCNTx), сбрасываем флаг, останавливаем таймер, сбрасываем таймер, выходим.
На таймер также вешаем прерывание по переполнению. Как только таймер досчитает до максимального значения, сбрасываем флаг, останавливаем таймер, сбрасываем таймер - в этом случае попытка измерения завершается неудачей (слишком широкий импульс).
Вот и весь алгоритм собственно.
only pure true norwegian blackx 
- Сообщения: 13
- Зарегистрирован: Вт фев 03, 2009 19:12:26
Поясните по поводу флага, о каком именно флаге идет речь ? О флаге переполнения?
На первый раз исправил сам.
Вам нужно прочитать Правила форума.
http://radiokot.ru/forum/viewtopic.php?f=19&t=6538
Нарушение Правил форума п. 2.7
aen
На первый раз исправил сам.
Вам нужно прочитать Правила форума.
http://radiokot.ru/forum/viewtopic.php?f=19&t=6538
Нарушение Правил форума п. 2.7
aen
Речь идёт о флаге программном, который устанавливается или сбрасывается не аппаратно, по переполнению чего либо или другому событию, а самим программистом по событию, которое он хочет отметить сам для себя.
- Сообщения: 13
- Зарегистрирован: Вт фев 03, 2009 19:12:26
Спасибо . А как именно мы узнаем когда состояние на пине 0 если мы сделали прерывание по нарастающему фронту?
- Реклама
Вот для этого и нужны программные флаги, чтобы сохранить информацию об интересующем событии, возможно, с подробностями.
Прерывания, не знаю, на каком кристале хотите реализовать, но современные микроконтроллеры могут отслеживать состояния изменения сигнала по прерыванию: из 1->0 (спад), из 0->1 (фронт). Мы можем запрограммировать прерывание по одному из указанных событий или по двум из них.
Для примера: событие по прерыванию: изменение состояния вывода. Уходим в прерывание. Внутри выставляем флаг, что событие произошло. Анализируем (считываем) состояние входа - запоминаем уровень во втором флаге, если нужно и т.д.
Прерывания, не знаю, на каком кристале хотите реализовать, но современные микроконтроллеры могут отслеживать состояния изменения сигнала по прерыванию: из 1->0 (спад), из 0->1 (фронт). Мы можем запрограммировать прерывание по одному из указанных событий или по двум из них.
Для примера: событие по прерыванию: изменение состояния вывода. Уходим в прерывание. Внутри выставляем флаг, что событие произошло. Анализируем (считываем) состояние входа - запоминаем уровень во втором флаге, если нужно и т.д.
Если вы имеете ввиду, как узнать в прерывании какой фронт был - нарастающий или спадающий, до относительно достоверно это можно узнать, если сразу проверить текущее состояние вывода (бит регистра PINx). Если там 1 - то был нарастающий, иначе - спадающий.spartanec писал(а):Спасибо . А как именно мы узнаем когда состояние на пине 0 если мы сделали прерывание по нарастающему фронту?
only pure true norwegian blackx 
По мне, для этой цели проще использовать имеющийся практически в каждом контроллере режим захвата, т.к. событие прихода активного перепада запоминается на аппаратном уровне и исключается погрешность входа в прерывание и считывания в нем состояния таймера.spartanec писал(а):Задача измерить ширину и период импульса на asm. Помогите составить алгоритм программы.
- Сообщения: 13
- Зарегистрирован: Вт фев 03, 2009 19:12:26
А вы пробовали делать простой расчет? Может вам и мк не подойдет для задачи, а вы уже его выбрали?
AVR работают на частотах до 20 МГц. Предделитель может быть равен p = 1, 8, 64, 256 или 1024.
8-битный таймер на такой частоте будет переполняться с частотой 20000 / (256 * p) кГц, 16-битный - 20000 / (65536* p) кГц. Вот и считайте, исходя из длительности ваших импульсов.
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
Я никак не пойму связь частоты с временем. Допусти МК работает на частоте 8 мГц, переполнение на 31,25 кГц (p=1). Это значит что счетчик будет считать до 0,032 мс?blackx писал(а):переполняться с частотой 20000 / (256 * p) кГц
Частота со временем связана одним простым уравнением: F=1/T
Вот и всё.
Вот и всё.
Вы правильно понимаете. Если сложно с герцами, можно сразу начать расчет с секунд.
Допустим, частота мк - 8 МГц, по формуле определяем длительность одного такта: 1/8M = 0,125 мкс. Нетрудно догадаться, что это число мы теперь умножаем на предделитель и на 256/65536, в зав-ти от разрядности таймера. Например, 0,125 * 1024 * 65536 = 8388608 мкс = 8,4 с - максимальная возможная задержка 16-битного таймера на частоте 8 МГц.
Ну а там прикидывайте какой вам нужен таймер и с каким предделителем. Предпочтительнее использовать 16-битный таймер с меньшим предделителем, чем 8-битный с большим - выше будет точность.
Допустим, частота мк - 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
blackx, спасибо разобрался. Написал код, будет ли он правильно работать с таймером ? https://gist.github.com/25325b2554d93a865c23
spartanec, главное то не сказали, зачем вам все это нужно? Что собираетесь измерять? Делаете прибор для измерения или просто нужно отличить импульс 1 мс от импульса в 2 мс? Какая точность нужна? Какой диапазон частот (длительностей импульсов) нужен?
Мы можем выделить несколько регистров и использовать высокую опорную частоту (как в сообщении akl), а можем использовать только счетные регистры таймера, тикающего с низкой частотой. При этом не заморачиваться с "ручным" подсчетом в нескольких регистрах и не получать потом в них огромное число, которое нужно еще как-то обрабатывать. Оба варианта работать будут, с разной точностью, но будут. Второй я описал в начале темы.
Мы можем выделить несколько регистров и использовать высокую опорную частоту (как в сообщении akl), а можем использовать только счетные регистры таймера, тикающего с низкой частотой. При этом не заморачиваться с "ручным" подсчетом в нескольких регистрах и не получать потом в них огромное число, которое нужно еще как-то обрабатывать. Оба варианта работать будут, с разной точностью, но будут. Второй я описал в начале темы.
only pure true norwegian blackx 
- Сообщения: 13
- Зарегистрирован: Вт фев 03, 2009 19:12:26
Я делаю курсовую, мне не так важна точность , как понимание этой темы.blackx писал(а):spartanec, главное то не сказали, зачем вам все это нужно? Что собираетесь измерять?
Понятно. Тогда очень советую пока отложить эту идею с измерениями. Взять какую-нибудь книгу по AVR, либо статьи в интернете (http://easyelectronics.ru/category/avr-uchebnyj-kurs, http://radiokot.ru/start/mcu_fpga/avr). И читать от корки до корки, сразу повторяя все усвоенное в симуляторе AVR Studio. Это даст качественное понимание с минимальными трудозатратами 
only pure true norwegian blackx 
- Сообщения: 13
- Зарегистрирован: Вт фев 03, 2009 19:12:26
Как код который я написал? Да я как раз читал эти статьи без них вообще не знал ничего.blackx писал(а):Понятно. Тогда очень советую пока отложить эту идею с измерениями.
spartanec, для точного измерения используй регистр ICR1 без всяких предделителей прескалеров. У тиньки 2313 есть такой регистр и специальная нога для захвата таймера 1, ICP обозначена, входной сигнал вешаешь на эту ногу, делаешь эту ногу входом, включаешь прерывания по захвату и измеряешь сигналы, не забывай считать переполнения таймера 1, если вдруг сигнал будет больше размера таймера 1, а хвостик будет в регистре ICR1.


