|
Частотомер на аt90s2313...Нужна помощь, Частотомер на аt90s2313...Нужна помощь |
|
|
|
Aug 21 2005, 09:55
|
Участник

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

|
Я начинающий в МК поэтому просьба сразу ногами не пинать... Решил сделать сам частотомер на t90s2313. Как правильно реализовать таймер который будет выдавать импульс с Ти=1 сек и Ти=0,1 сек (по выбору) на 8 битном таймере-счетчике? Я вижу только одно решение использовать несколько вложенных друг в друга циклов... Подскажите пожалуйста есть ли другое более грамотное , и вносит ли такое решение дополнительную погрешность в длительность импульса помимо той которую имеет кварцевый генератор?
|
|
|
|
|
Aug 21 2005, 12:04
|
Участник

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

|
Тоже делал частотомер на этом самом МК. Тут еще заисит от схемы. Я бы предложил попросту сделать на таймере импульс в Ти = 0,1 с, а Ти = 1 с получать просто подсчитывая до десяти.
|
|
|
|
|
Aug 21 2005, 12:27
|
Участник

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

|
Цитата(Reboot_s @ Aug 21 2005, 15:04) Тоже делал частотомер на этом самом МК. Тут еще заисит от схемы. Я бы предложил попросту сделать на таймере импульс в Ти = 0,1 с, а Ти = 1 с получать просто подсчитывая до десяти. Спасибо что ответили на мой вопрос... Только я забыл сказать что 16-разрядный таймер я отдал на подсчет внешних импульсов...Индикация на цифровом ЖКИ (LCD-COG) в последовательном коде.И еще есть ограничение делители частоты не использовать. А вот идея подсчитывать 10 по 0,1с мне понравилась. У меня еще один подозреваю что глупый вопрос (но еще раз прошу не пинайте). При возникновении прерывания (любого) счетчики как себя ведут, они останавливаются, мой 16 разрядный счетчик перестанет считать внешние импульсы?
|
|
|
|
|
Aug 21 2005, 12:34
|
Частый гость
 
Группа: Свой
Сообщений: 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 разрядный счетчик перестанет считать внешние импульсы? Не беспокойся, Счетчики продолжают считать. А вообще, если нужен хороший частотомер (хорошая точность за малое время измерения) не стоит использовать методы прямого счета. Общепринятым является косвенный метод зависимого счета. Просто и надежно.
|
|
|
|
|
Aug 21 2005, 13:15
|
Участник

Группа: Участник
Сообщений: 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! Простите можно поподробнее остановиться на последнем... Что значит косвенный метод зависимого счета? Или хотя бы где это можно посмотреть?
|
|
|
|
|
Aug 21 2005, 13:59
|

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

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

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

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

Участник

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

|
Вот я когда-то сделал себе по быстрячку простенький частотомер (платка была) вывод на сегментный индикатор. Файл переименовать в EXE и запустить
|
|
|
|
|
Aug 22 2005, 13:36
|
Участник

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

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

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

|
Цитата(jimmi @ Aug 23 2005, 00:20) Ну если что, то спрашивай. Пиши что не получается. Не забудь, что за 10 сек насчитает частоту в 10 раз больше. На индикаторе пробелом последнюю цифру закрась.  И еще у меня во всем измерительном цикле получилось примерно 50 тактов. При 16 МГц кварца максимальная измеряемая частота будет примерно 300 кГц. Чтобы мерять большую частоту нужно использовать предделитель. Удобно делать на счетчиках кратно 16 или 256 и умножать с помощью сдвигов влево через перенос. У меня есть еще пара вопросов... Я вообще планировал сделать частотомер с временем счета 0,1 и 1сек для измерения частоты от сотен герц до едениц МГц. Мой незамысловатый алгоритм выглядел примерно так.... На основе 8 битного таймера счетчика, и нескольких вложенных программных циклов получаю тайминги 0,1 и 1 сек, которые управляют 16 битным таймером счетчиком, подсчитывающем частоту сигнала... А теперь собственно вопросы почему время счета выбрано 10 сек, это наверное хорошо для медленно изменяющихся сигналов, ну так это же замучаешься мерить?  Если честно не совсем разобрался с прерываниями зачем делать внешнее прерывание таймера что оно дает?
|
|
|
|
|
Aug 22 2005, 23:09
|
Участник

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

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

Группа: Участник
Сообщений: 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 Вобщем половину граблей, на которые я наступал разобрали.  У меня был процессор АТМЕГА8, В 2313 немного отличается расположение битов в регистрах, в частности в TIMSK и MCUCR. Да Товарищ, тут пивом вряд ли отделаюсь придется за коньяком мне бежать
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|