Перейти к содержанию
    

Частотомер на аt90s2313...Нужна помощь

Я начинающий в МК поэтому просьба сразу ногами не пинать...

Решил сделать сам частотомер на t90s2313.

Как правильно реализовать таймер который будет выдавать импульс с Ти=1 сек и Ти=0,1 сек (по выбору) на 8 битном таймере-счетчике?

Я вижу только одно решение использовать несколько вложенных друг в друга циклов...

Подскажите пожалуйста есть ли другое более грамотное , и вносит ли такое решение дополнительную погрешность в длительность импульса помимо той которую имеет кварцевый генератор?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно проще. Сделайте цикл длиной в 1000000 тактов(для кварца 10 Мгц) в начале запускаете 16 битный счетчик, в конце останавливаете. (Не забываем подсчитывать переполнения) Затем делаете BCD и выводите. Если у вас динамическая индикация на светодиодах, то ее надо оформить прямо в измерительном цикле.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тоже делал частотомер на этом самом МК. Тут еще заисит от схемы. Я бы предложил попросту сделать на таймере импульс в Ти = 0,1 с, а Ти = 1 с получать просто подсчитывая до десяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тоже делал частотомер на этом самом МК. Тут еще заисит от схемы. Я бы предложил попросту сделать на таймере импульс в Ти = 0,1 с, а Ти = 1 с получать просто подсчитывая до десяти.

Спасибо что ответили на мой вопрос...

Только я забыл сказать что 16-разрядный таймер я отдал на подсчет внешних импульсов...Индикация на цифровом ЖКИ (LCD-COG) в последовательном коде.И еще есть ограничение делители частоты не использовать.

А вот идея подсчитывать 10 по 0,1с мне понравилась.

У меня еще один подозреваю что глупый вопрос (но еще раз прошу не пинайте).

При возникновении прерывания (любого) счетчики как себя ведут, они останавливаются, мой 16 разрядный счетчик перестанет считать внешние импульсы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тоже делал частотомер на этом самом МК. Тут еще заисит от схемы. Я бы предложил попросту сделать на таймере импульс в Ти = 0,1 с, а Ти = 1 с получать просто подсчитывая до десяти.

Спасибо что ответили на мой вопрос...

Только я забыл сказать что 16-разрядный таймер я отдал на подсчет внешних импульсов...Индикация на цифровом ЖКИ (LCD-COG) в последовательном коде.И еще есть ограничение делители частоты не использовать.

А вот идея подсчитывать 10 по 0,1с мне понравилась.

У меня еще один подозреваю что глупый вопрос (но еще раз прошу не пинайте).

При возникновении прерывания (любого) счетчики как себя ведут, они останавливаются, мой 16 разрядный счетчик перестанет считать внешние импульсы?

Не беспокойся, Счетчики продолжают считать.

А вообще, если нужен хороший частотомер (хорошая точность за малое время измерения) не стоит использовать методы прямого счета. Общепринятым является косвенный метод зависимого счета. Просто и надежно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тоже делал частотомер на этом самом МК. Тут еще заисит от схемы. Я бы предложил попросту сделать на таймере импульс в Ти = 0,1 с, а Ти = 1 с получать просто подсчитывая до десяти.

Спасибо что ответили на мой вопрос...

Только я забыл сказать что 16-разрядный таймер я отдал на подсчет внешних импульсов...Индикация на цифровом ЖКИ (LCD-COG) в последовательном коде.И еще есть ограничение делители частоты не использовать.

А вот идея подсчитывать 10 по 0,1с мне понравилась.

У меня еще один подозреваю что глупый вопрос (но еще раз прошу не пинайте).

При возникновении прерывания (любого) счетчики как себя ведут, они останавливаются, мой 16 разрядный счетчик перестанет считать внешние импульсы?

Не беспокойся, Счетчики продолжают считать.

А вообще, если нужен хороший частотомер (хорошая точность за малое время измерения) не стоит использовать методы прямого счета. Общепринятым является косвенный метод зависимого счета. Просто и надежно.

Alexs! Простите можно поподробнее остановиться на последнем...

Что значит косвенный метод зависимого счета? Или хотя бы где это можно посмотреть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотри по этому адресу http://www.enigma2004.nm.ru/avr29.rar тут уже готовый проект частотомера, правда на AT90S8535, но тут главное принцип.

Кроме того там есть пример моделирования частотомера в среде Proteus(можно взять на kazus.ru) очень рекомендую изучить эту среду.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотри по этому адресу http://www.enigma2004.nm.ru/avr29.rar тут уже готовый проект частотомера, правда на AT90S8535, но тут главное принцип.

Кроме того там есть пример моделирования частотомера в среде Proteus(можно взять на kazus.ru) очень рекомендую изучить эту среду.

Спасибо обязательно посмотрю, тем более что с Proteusом

уже знаком, а на форуме Казуса бываю каждый день, в качестве слушателя:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Лучше повесьте подсчет импульсов на внешнее прерывание от порта. У Аtmel кстати есть glitch-фильтр аппаратный, который устраняет дребезг по фронту - только не помню, есть ли он для 2313. А временной интервал формируйте по таймеру. Только придется сделать метку например 10ms и счетчик до 10 и 100 в прерывании от таймера. Вывод тоже удобно повесить на прерывание от таймера, особенно если это вывод на светодиодный индикатор.

 

"косвенный метод" это когда не как у вас эталонный импульс заполняется измеряемой частотой, а наоборот измеряемый импульс - эталонной частотой только здесь фактически измеряется период и для абсолютной оценки требуется обратное преобразование, конечно если частоту нужно оценивать косвенно, то такого преобразования не требуется. Естественно одно измерение будет производится за период измеряемого сигнала, а не как у вас - за период эталонного импульса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот я когда-то сделал себе по быстрячку простенький частотомер (платка была) вывод на сегментный индикатор.

Файл переименовать в EXE и запустить

AT_2313.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот я когда-то сделал себе по быстрячку простенький частотомер (платка была) вывод на сегментный индикатор.

Файл переименовать в EXE и запустить

Простите а зачем вешать подсчет импульсов на внешнее прерывание от порта,

если я собираюсь использовать внутренний таймер?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну если что, то спрашивай.

Пиши что не получается.

Не забудь, что за 10 сек насчитает частоту в 10 раз больше.

На индикаторе пробелом последнюю цифру закрась. :)

И еще у меня во всем измерительном цикле получилось примерно 50 тактов. При 16 МГц кварца максимальная измеряемая частота будет

примерно 300 кГц. Чтобы мерять большую частоту нужно использовать предделитель. Удобно делать на счетчиках кратно 16 или 256 и умножать с помощью сдвигов влево через перенос.

У меня есть еще пара вопросов...

Я вообще планировал сделать частотомер с временем счета 0,1 и 1сек

для измерения частоты от сотен герц до едениц МГц.

Мой незамысловатый алгоритм выглядел примерно так....

На основе 8 битного таймера счетчика, и нескольких вложенных программных

циклов получаю тайминги 0,1 и 1 сек, которые управляют 16 битным таймером счетчиком, подсчитывающем частоту сигнала...

А теперь собственно вопросы почему время счета выбрано 10 сек, это наверное хорошо для медленно изменяющихся сигналов, ну так это же замучаешься мерить? :)

Если честно не совсем разобрался с прерываниями зачем делать внешнее прерывание таймера что оно дает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если делать время измерения 0,1 сек то цифры на экране будут быстро изменяться. Пользователь не успеет считать результать.

В программе используются два прерывания внешнее INT0 и от восьмиразрядного  таймера0. Внешнее прерывание считает импульсы измеряемой частоты, таймер отмеряет промежуток времени, допустим 1 сек. Сколько импульсов меандра пришло в процессор за 1 сек такая и частота.

У АТМЕЛ имеется приоритет прерываний. После выхода из прерывания флаг глобального разрешения прерываний сброшен, поэтому прерывания запрещены. Если в это время случилось событие (пришел импульс на вход), то устанавливается флаг прерывания. Если разрешить прерывания, то они выполняются в порядке приоритетов. Внешнее прерывание имеет более высокий приоритет, чем прерывание от таймера. В даташите таблица векторов прерываний описана в порядке приоритетов.

Поэтому, чтобы время шло правильно (была точно 1 сек независимо от частоты измеряемого сигнала) во внешнем прерывании разрешаем прерывание от таймера.

Теперь понял, спасибо что подробно обьяснили...А по поводу того что цифры будут быстро мелькать и сложно будет снять показания, я позаимствовал от заводских частотомеров такое понятие как время индикации (в пределах от 1 до 3 сек)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот пример основной программы

MAIN:    
        cli
        clr Counter_0      ;Обнуление счетчика импульсов
        clr Counter_1
        clr Counter_2      ;Обнуление счетчика импульсов
        clr Counter_3
        ldi temp,$00
        out TCNT0,temp;Сброс таймера
             ;Программирование прерывания таймера
        clr temp
        mov TIMER1,temp
        mov TIMER2,temp
        ldi temp,0b00000101
        out TCCR0,temp      ;Предделитель 1024
        ldi temp,0b00000001;Разрешено прерывание по переполнению
        out TIMSK,temp
;Программирование внешнего прерывания
        ldi temp,0b00000010; По заднему фронту
        out MCUCR,temp
        ldi temp,0b01000000
        out GICR,temp      ;Разрешение Int0
MAIN_LOOP:
        nop
        cli
INT_10seq:
        mov temp_2,TIMER2 
        cpi temp_2,$02
        brlo MAIN_LOOP_1
        mov temp_2,TIMER1
        cpi temp_2,$40
        brlo MAIN_LOOP_1
        rjmp LCD_OUT
MAIN_LOOP_1:
        ldi temp_2,0b01000000
        out GICR,temp_2 
        sei        ;Разрешение прерываний
        rjmp MAIN_LOOP

 

Вобщем половину граблей, на которые я наступал разобрали. :)

У меня был процессор АТМЕГА8, В 2313 немного отличается расположение битов в регистрах, в частности в TIMSK и MCUCR.

Да Товарищ, тут пивом вряд ли отделаюсь придется за коньяком мне бежать :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...