реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Частотомер на аt90s2313...Нужна помощь, Частотомер на аt90s2313...Нужна помощь
Genri
сообщение Aug 21 2005, 09:55
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 28-04-05
Пользователь №: 4 598



Я начинающий в МК поэтому просьба сразу ногами не пинать...
Решил сделать сам частотомер на t90s2313.
Как правильно реализовать таймер который будет выдавать импульс с Ти=1 сек и Ти=0,1 сек (по выбору) на 8 битном таймере-счетчике?
Я вижу только одно решение использовать несколько вложенных друг в друга циклов...
Подскажите пожалуйста есть ли другое более грамотное , и вносит ли такое решение дополнительную погрешность в длительность импульса помимо той которую имеет кварцевый генератор?
Go to the top of the page
 
+Quote Post
moonrock
сообщение Aug 21 2005, 11:21
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 24-03-05
Из: Санкт-Петербург
Пользователь №: 3 661



Можно проще. Сделайте цикл длиной в 1000000 тактов(для кварца 10 Мгц) в начале запускаете 16 битный счетчик, в конце останавливаете. (Не забываем подсчитывать переполнения) Затем делаете BCD и выводите. Если у вас динамическая индикация на светодиодах, то ее надо оформить прямо в измерительном цикле.
Go to the top of the page
 
+Quote Post
Reboot_s
сообщение Aug 21 2005, 12:04
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 26
Регистрация: 9-05-05
Пользователь №: 4 855



Тоже делал частотомер на этом самом МК. Тут еще заисит от схемы. Я бы предложил попросту сделать на таймере импульс в Ти = 0,1 с, а Ти = 1 с получать просто подсчитывая до десяти.
Go to the top of the page
 
+Quote Post
Genri
сообщение Aug 21 2005, 12:27
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 28-04-05
Пользователь №: 4 598



Цитата(Reboot_s @ Aug 21 2005, 15:04)
Тоже делал частотомер на этом самом МК. Тут еще заисит от схемы. Я бы предложил попросту сделать на таймере импульс в Ти = 0,1 с, а Ти = 1 с получать просто подсчитывая до десяти.
*

Спасибо что ответили на мой вопрос...
Только я забыл сказать что 16-разрядный таймер я отдал на подсчет внешних импульсов...Индикация на цифровом ЖКИ (LCD-COG) в последовательном коде.И еще есть ограничение делители частоты не использовать.
А вот идея подсчитывать 10 по 0,1с мне понравилась.
У меня еще один подозреваю что глупый вопрос (но еще раз прошу не пинайте).
При возникновении прерывания (любого) счетчики как себя ведут, они останавливаются, мой 16 разрядный счетчик перестанет считать внешние импульсы?
Go to the top of the page
 
+Quote Post
alexs
сообщение Aug 21 2005, 12:34
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 97
Регистрация: 7-06-05
Пользователь №: 5 811



Цитата(Genri @ Aug 21 2005, 17:27)
Цитата(Reboot_s @ Aug 21 2005, 15:04)
Тоже делал частотомер на этом самом МК. Тут еще заисит от схемы. Я бы предложил попросту сделать на таймере импульс в Ти = 0,1 с, а Ти = 1 с получать просто подсчитывая до десяти.
*

Спасибо что ответили на мой вопрос...
Только я забыл сказать что 16-разрядный таймер я отдал на подсчет внешних импульсов...Индикация на цифровом ЖКИ (LCD-COG) в последовательном коде.И еще есть ограничение делители частоты не использовать.
А вот идея подсчитывать 10 по 0,1с мне понравилась.
У меня еще один подозреваю что глупый вопрос (но еще раз прошу не пинайте).
При возникновении прерывания (любого) счетчики как себя ведут, они останавливаются, мой 16 разрядный счетчик перестанет считать внешние импульсы?
*


Не беспокойся, Счетчики продолжают считать.
А вообще, если нужен хороший частотомер (хорошая точность за малое время измерения) не стоит использовать методы прямого счета. Общепринятым является косвенный метод зависимого счета. Просто и надежно.
Go to the top of the page
 
+Quote Post
Genri
сообщение Aug 21 2005, 13:15
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 28-04-05
Пользователь №: 4 598



Цитата(alexs @ Aug 21 2005, 15:34)
Цитата(Genri @ Aug 21 2005, 17:27)
Цитата(Reboot_s @ Aug 21 2005, 15:04)
Тоже делал частотомер на этом самом МК. Тут еще заисит от схемы. Я бы предложил попросту сделать на таймере импульс в Ти = 0,1 с, а Ти = 1 с получать просто подсчитывая до десяти.
*

Спасибо что ответили на мой вопрос...
Только я забыл сказать что 16-разрядный таймер я отдал на подсчет внешних импульсов...Индикация на цифровом ЖКИ (LCD-COG) в последовательном коде.И еще есть ограничение делители частоты не использовать.
А вот идея подсчитывать 10 по 0,1с мне понравилась.
У меня еще один подозреваю что глупый вопрос (но еще раз прошу не пинайте).
При возникновении прерывания (любого) счетчики как себя ведут, они останавливаются, мой 16 разрядный счетчик перестанет считать внешние импульсы?
*


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


Alexs! Простите можно поподробнее остановиться на последнем...
Что значит косвенный метод зависимого счета? Или хотя бы где это можно посмотреть?
Go to the top of the page
 
+Quote Post
Proton
сообщение Aug 21 2005, 13:59
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 185
Регистрация: 3-08-05
Из: Новосибирск
Пользователь №: 7 334



Посмотри по этому адресу http://www.enigma2004.nm.ru/avr29.rar тут уже готовый проект частотомера, правда на AT90S8535, но тут главное принцип.
Кроме того там есть пример моделирования частотомера в среде Proteus(можно взять на kazus.ru) очень рекомендую изучить эту среду.


--------------------
Всяк хорошая мысля к нам приходит опосля.
Go to the top of the page
 
+Quote Post
Genri
сообщение Aug 21 2005, 14:40
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 28-04-05
Пользователь №: 4 598



Цитата(Proton @ Aug 21 2005, 16:59)
Посмотри по этому адресу http://www.enigma2004.nm.ru/avr29.rar тут уже готовый проект частотомера, правда на AT90S8535, но тут главное принцип.
Кроме того там есть пример моделирования частотомера в среде Proteus(можно взять на kazus.ru) очень рекомендую изучить эту среду.
*

Спасибо обязательно посмотрю, тем более что с Proteusом
уже знаком, а на форуме Казуса бываю каждый день, в качестве слушателяsmile.gif
Go to the top of the page
 
+Quote Post
psL
сообщение Aug 21 2005, 17:45
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



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

"косвенный метод" это когда не как у вас эталонный импульс заполняется измеряемой частотой, а наоборот измеряемый импульс - эталонной частотой только здесь фактически измеряется период и для абсолютной оценки требуется обратное преобразование, конечно если частоту нужно оценивать косвенно, то такого преобразования не требуется. Естественно одно измерение будет производится за период измеряемого сигнала, а не как у вас - за период эталонного импульса.
Go to the top of the page
 
+Quote Post
Juk1976
сообщение Aug 21 2005, 21:42
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 1-08-05
Из: Украина Винница
Пользователь №: 7 258



Вот я когда-то сделал себе по быстрячку простенький частотомер (платка была) вывод на сегментный индикатор.
Файл переименовать в EXE и запустить
Прикрепленные файлы
Прикрепленный файл  AT_2313.txt ( 29.15 килобайт ) Кол-во скачиваний: 140
 
Go to the top of the page
 
+Quote Post
Genri
сообщение Aug 22 2005, 13:36
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 28-04-05
Пользователь №: 4 598



Цитата(Juk1976 @ Aug 22 2005, 00:42)
Вот я когда-то сделал себе по быстрячку простенький частотомер (платка была) вывод на сегментный индикатор.
Файл переименовать в EXE и запустить
*

Простите а зачем вешать подсчет импульсов на внешнее прерывание от порта,
если я собираюсь использовать внутренний таймер?
Go to the top of the page
 
+Quote Post
psL
сообщение Aug 22 2005, 16:40
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



просто все зависит от измеряемого сигнала и конкретной задачи. Можно и таймер использовать конечно, но тогда возможно нужно будет делать фильтр снаружи.
Go to the top of the page
 
+Quote Post
Genri
сообщение Aug 22 2005, 22:37
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 28-04-05
Пользователь №: 4 598



Цитата(jimmi @ Aug 23 2005, 00:20)
Ну если что, то спрашивай.
Пиши что не получается.
Не забудь, что за 10 сек насчитает частоту в 10 раз больше.
На индикаторе пробелом последнюю цифру закрась. smile.gif
И еще у меня во всем измерительном цикле получилось примерно 50 тактов. При 16 МГц кварца максимальная измеряемая частота будет
примерно 300 кГц. Чтобы мерять большую частоту нужно использовать предделитель. Удобно делать на счетчиках кратно 16 или 256 и умножать с помощью сдвигов влево через перенос.
*

У меня есть еще пара вопросов...
Я вообще планировал сделать частотомер с временем счета 0,1 и 1сек
для измерения частоты от сотен герц до едениц МГц.
Мой незамысловатый алгоритм выглядел примерно так....
На основе 8 битного таймера счетчика, и нескольких вложенных программных
циклов получаю тайминги 0,1 и 1 сек, которые управляют 16 битным таймером счетчиком, подсчитывающем частоту сигнала...
А теперь собственно вопросы почему время счета выбрано 10 сек, это наверное хорошо для медленно изменяющихся сигналов, ну так это же замучаешься мерить? smile.gif
Если честно не совсем разобрался с прерываниями зачем делать внешнее прерывание таймера что оно дает?
Go to the top of the page
 
+Quote Post
Genri
сообщение Aug 22 2005, 23:09
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 28-04-05
Пользователь №: 4 598



Цитата(jimmi @ Aug 23 2005, 01:53)
Если делать время измерения 0,1 сек то цифры на экране будут быстро изменяться. Пользователь не успеет считать результать.
В программе используются два прерывания внешнее INT0 и от восьмиразрядного  таймера0. Внешнее прерывание считает импульсы измеряемой частоты, таймер отмеряет промежуток времени, допустим 1 сек. Сколько импульсов меандра пришло в процессор за 1 сек такая и частота.
У АТМЕЛ имеется приоритет прерываний. После выхода из прерывания флаг глобального разрешения прерываний сброшен, поэтому прерывания запрещены. Если в это время случилось событие (пришел импульс на вход), то устанавливается флаг прерывания. Если разрешить прерывания, то они выполняются в порядке приоритетов. Внешнее прерывание имеет более высокий приоритет, чем прерывание от таймера. В даташите таблица векторов прерываний описана в порядке приоритетов.
Поэтому, чтобы время шло правильно (была точно 1 сек независимо от частоты измеряемого сигнала) во внешнем прерывании разрешаем прерывание от таймера.
*

Теперь понял, спасибо что подробно обьяснили...А по поводу того что цифры будут быстро мелькать и сложно будет снять показания, я позаимствовал от заводских частотомеров такое понятие как время индикации (в пределах от 1 до 3 сек)
Go to the top of the page
 
+Quote Post
Genri
сообщение Aug 23 2005, 00:35
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 28-04-05
Пользователь №: 4 598



Цитата(jimmi @ Aug 23 2005, 02:24)
Вот пример основной программы
Код
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


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

Да Товарищ, тут пивом вряд ли отделаюсь придется за коньяком мне бежать smile.gif
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 02:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01487 секунд с 7
ELECTRONIX ©2004-2016