Свежие обсуждения
Микроконтроллеры

Частотомер на AVR

1 2 7

Пробывал подавать сигналы с более низкими частотами, паказания стабильны. Вы были правы, скореее всего контроллер теряет импульсы входной частоты.

 

Y@rik: Запрет прерывания по захвату происходит в прерывании по захвату таймера1
Здесь я проглядел, прошу пардону.

Y@rik: Пробовал подавать сигналы с более низкими частотами, показания стабильны. Вы были правы, скорее всего контроллер теряет импульсы входной частоты
Не контроллер, а программа. Но где она их теряет? Для МК с тактовой 8 МГц я получал максимум 1.6 МГц на ассемблере, больше вытянуть не удалось, а на си получается меньше 1 МГц? За время между двумя захватами нужно успеть забрать содержимое таймера0 и содержимое регистра захвата, иначе они будут переписаны.

Мелькнула идейка одна, вполне продуктивная и легко выполнимая, как на си измерять частоты до половины тактовой, в вашем случае - до 4 МГц. Если интересно, могу рассказать, но завтра, сейчас уже полдвенадцатого, пойду-ка я баиньки, что-то притомился за выходные, ездил в Корнуол - 600 миль откатал туда-обратно.

 

GM: Мелькнула идейка одна, вполне продуктивная и легко выполнимая, как на си измерять частоты до половины тактовой, в вашем случае - до 4 МГц. Если интересно, могу рассказать
Да, конечно, очень интересно. Расскажите пожалуйста.

 

Когда я говорил о запрете захвата, я имел в виду физический запрет захвата, а не запрещение прерывания от него. Сами подумайте, запрет прерываний не запрещает фронтам входного импульса защёлкивать данные в ICR1. Отсюда возникла идея физического запрещения импульсов для схемы захвата.

Предполагаю, что у вас входной сигнал подан на вход счётчика0 и на вход схемы захвата. Теперь к входу схемы захвата надо подключить выход элемента 2И-НЕ, на один вход которого подать входной сигнал, а на второй - сигнал разрешения от микроконтроллера. Впрочем, можно поставить ключ или триггер, не важно что именно, лишь бы была возможность отключать сигнал от схемы захвата.

Логика работы остаётся практически неизменной, надо только заменить команду запрета прерывания на команду разрешения захвата.

Теперь, чтобы начать период отсчёта входных импульсов, вы разрешаете работу схемы захвата на короткое время и дожидаетесь срабатывания схемы захвата (как и раньше), для больших входных частот может проскочить несколько импульсов захвата, это не принципиально, важен самый последний. В прерывании захвата надо немедленно запретить захват и считать значение счётчика0.

Абсолютно то же самое надо сделать и в конце периода отсчёта входных импульсов, таким образом, вы будете иметь точные значения для определения N. Задержка, получившаяся при входе в прерывание захвата для считывания счётчика0, не важна, поскольку для точного определения М важна разность двух значений счётчика0, а не их абсолютные значения.

Ну вот, вроде бы полностью изложил основы идеи. Расскажите, что получилось. Вы, кстати, на электрониксе обещались доложить о практической точности моего метода и пропали .

 

GM: Сами подумайте, запрет прерываний не запрещает фронтам входного импульса защёлкивать данные в ICR1.
Запрещать оно конечно, не запрещает, но как эта запись счетного регистра в ICR1 вияет на пропускание импульсов входной частоты, происходит все аппаратно?

 

Ну да, щелкает и щелкает аппаратно, вы же запретили только прерывание. Чтобы точно сказать как пропускает, надо анализировать код, который генерит си-компайлер. Один из вариантов, например такой. Защелкнули вы конечный фронт входного импульса, начали вычислять N и M. Только считали переменную перенос0, а тут возник новый фронт, прерывание таймера0 по переполнению сработало и добавило 1 к перенос0, но вы-то уже считали предыдущее значение. А эта единица (фактически в 8 разряде) "весит" 256 импульсов.

 

Пробывал реализовать предложенны вами изменнения.
Первый захват происходит нормально, закрыл подачу импульсов на вход схемы захвата, преписал значения регисторов в переменные, запретил прерывание по захвату. Выжидаю 1с разрешаю захват, но прерывание по захвату происходит до того как на один из входов элемента 2И-НЕ подаю высокий уровень, тем самым разрешая имульсам поступать на вход схемы захвата. Это происходит по тому, что еще при первом выполнении прерывания по захвату в регистре TIFR повторно установился флаг запроса на прерывание по захвату (до того момента как я запрещаю прохождения сигнала влазит еще один переиод). По идее нужно просто сбросить этот разряд в регистре TIFR путем запеси в него еденицы, но он почемуто не сбрасывается.

148309.c

 

Они же там прут со страшной скоростью (до 4 МГц в вашем случае), только прерываний нет, а флаг всё равно взводится. Вы его сбросили, а он тут же взводится (через 0.25 мкс). Поэтому лучше дождаться первого захвата, пропустить его, потом использовать второй. И не надо сбрасывать разрешение после первого захвата, а только после второго.

 

Все казалось заработало, но на 18-ом измерении 9,975е+05.

 

Значит, где-то ещё баг сидит. Давайте посмотрим на числа и частоты.