Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Модератор форума: ivan_fd  
Cчет импульсов
Yrok Дата: Пт, 26.10.2007, 17:18  |                                                                                                                Сообщение # 16
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 112
Репутация: 2   ±
Замечания:   ±
На сайте с 27.09.2007

Статус: Offline

Quote
хочу всё изучить по пикам в процессе измерения импульсов, температуры и т.д.

Это похвально.
Ну чтож давай попробуем.
Откуда взялось 333Гц ???
при скорости 200 км/ч = 3,333км/мин=0,0555 км/с
переведем все это в метры 55,5м/с
датчик скорости тоже считает не 1 импульс за километр , возьмем для простоты что он дает 1000 импульсов за километр
тогда получим частоту входных импульсов 55500 имп/сек=55,5 КГц---ндя-я-я это уже проблема посчитать
вспоминаем--на одометре минимальная единица измерения это сотни метров--а мы считали метры
Значит переводим в измерение сотен метров и получаем 555 Гц.
Ну вродебы недалеко ушли от 333 Гц.
Теперь проблем со счетом нет.
проверяем что получится если скорость автомобиля 10км--то частота входных импульсов в нашем случае составит 27 Гц--
это больше 1 значит все ок.

Теперь с выводом на экран--к сожалению все нетак быстро как хотелось бы--время вывода занимает гдето 60-80 милисек.
А кроме того еще надо подготовить данные к выводу и т.д. и т.п.--короче пол секунды готовь-поверь мне.
Поэтому здесь Count непойдет--пока на экран выводишь машина то едет а ты несчитаешь.
Надо как говорил basicpic запускать счетчик на одну секунду и включать прерывания по изменению фронта на PortB.

DeveloperX Дата: Пт, 26.10.2007, 18:05  |                                                                                                                Сообщение # 17
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 149
Репутация: 1   ±
Замечания:   ±
На сайте с 25.10.2007

Статус: Offline

я считал так:
каждый метр - 6 импульсов.
200км/ч=55.5м/с
каждый километр датчик генерирует 6000 импульсов.
т.о. при скорости 200 км/ч: частота(F)=55.5м/с*6имп=333Гц
получается, что можно считать метры.
при той же скорости период между импульсами =1сек/333Гц~3милисекунды.
вывел формулу для вычисления скорости:
V=F*3600c/6000=F*0,6 //скорость получаем в км/ч
нужна простая программа со счетчиком и прерываниями применительно к данному случаю, как написано выше, чтобы я разобрался (в рамках имеющейся схемы).
сейчас в схеме у меня: пик, кварц, светодиод и датчик с импульсами.
ADMIN Дата: Сб, 27.10.2007, 05:00  |                                                                                                                Сообщение # 18
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Quote (DeveloperX)
basicpic, к сожалению я ещё не умею работать с таймерами и прерываниями...а логически: w больше 10 и тушим - по-моему верно?к тому же частота меняется от 0Гц до 333Гц.вообще-то мне нужно считать импульсы постоянно (от датчика скорости, вентилятора кулера) и выводить полученное количество на дисплей.подскажите пожалуйста текст программы, которая по-вашему мнению будет работать и описание схемы подключения.очень надо разобраться...

Что вам конкретно нужно?
Вот ваша программа, во-первых, не зациклена, то есть она выключит светодиод и все, но это произойдет через секунду, за которую считаются ВСЕ входящие импульсы. Просто выключится и все. По логике вашей программы, переменная W при любой частоте ,будет больше 10. Ваш процессор, я так понял, должен ловить каждые 10 импульсов (почему именно 10?) и сообщать вам об этом.

Давайте так: Вы внятно и понятно объясните вашу задачу(что нужно, километраж, скорость?) и мы вместе на вашем примере разберем все нюансы.

DeveloperX Дата: Пн, 29.10.2007, 08:14  |                                                                                                                Сообщение # 19
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 149
Репутация: 1   ±
Замечания:   ±
На сайте с 25.10.2007

Статус: Offline

Quote (basicpic)
Давайте так: Вы внятно и понятно объясните вашу задачу(что нужно, километраж, скорость?) и мы вместе на вашем примере разберем все нюансы.

10 импульсов мне нужно было для того, чтобы понять работают ли функции PULSIN, COUNT и каким образом (вал датчика крутил руками).
а вообще нужно определять и выводить на дисплей километраж и скорость. и заодно понять прерывания и таймеры.
Yrok Дата: Пн, 29.10.2007, 10:03  |                                                                                                                Сообщение # 20
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 112
Репутация: 2   ±
Замечания:   ±
На сайте с 27.09.2007

Статус: Offline

Предлагаю такой алгоритм
1)Считать импульсы от датчика скорости используя прерывания по изменению состояния порта B
2)Использовать счетчик TMR0 для измерения отрезков времени по 1сек
3)По прошествии 1сек выставлять флаг разрешения вывода на экран
4)Выводить на LCD дисплей используя 4 битный интерфейс и посадить его на порт С
DeveloperX Дата: Пн, 29.10.2007, 10:23  |                                                                                                                Сообщение # 21
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 149
Репутация: 1   ±
Замечания:   ±
На сайте с 25.10.2007

Статус: Offline

Yrok, а потери времени на вывод на экран удастся избежать?

Добавлено (29.10.2007, 16:23)
---------------------------------------------
Yrok, basicpic, вот есть пример

Code
led     var     PORTB.7

         OPTION_REG = $7f        ' Enable PORTB pullups

         On Interrupt Goto myint ' Define interrupt handler
         INTCON = $90            ' Enable INTE interrupt

loop:   High led                ' Turn LED on
         Goto loop               ' Do it forever

' Interrupt handler
         Disable                 ' No interrupts past this point
myint:  Low led                 ' If we get here, turn LED off
         Pause   500             ' Wait .5 seconds
         INTCON.1 = 0            ' Clear interrupt flag
         Resume                  ' Return to main program
         Enable

здесь мне всё понятно, но куда добавить обработку таймера - не понимаю...
как я понял обработку вывода на экран можно вставить в подпрограмму myint.
сколько времени нужно пику чтобы умножить полученное количество импульсов на 0,6 для определения скорости? я читал, что 4 такта.
ЯНДЕКС Дата: 29.10.2007
Yrok Дата: Пн, 29.10.2007, 15:19  |                                                                                                                Сообщение # 22
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 112
Репутация: 2   ±
Замечания:   ±
На сайте с 27.09.2007

Статус: Offline

Quote
как я понял обработку вывода на экран можно вставить в подпрограмму myint.

Вот тут ты неправ --сюда нельзя ставить вывод на экран--потому как пока ты будешь выводить , импульсы считаться небудут.
В этой подпрограмме нужно все делать очень быстро и убегать из нее biggrin , например увеличить счетчик импульсов на единицу
А поставить вывод нужно перед
Quote
Goto loop ' Do it forever
и убрать паузу в 0.5 секунд

тока с условием что вывод разрешен
а разешать каждую секунду
Чтобы понять куда ставить счетчик--почитай в мануале про него , тогда поймешь как он работает

Сообщение отредактировал Yrok - Пн, 29.10.2007, 15:30
DeveloperX Дата: Пн, 29.10.2007, 17:37  |                                                                                                                Сообщение # 23
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 149
Репутация: 1   ±
Замечания:   ±
На сайте с 25.10.2007

Статус: Offline

Quote (Yrok)
тока с условием что вывод разрешен

а такой флаг разрешения нужно делать через специальный регистр или через любую переменную размером в бит?
Yrok Дата: Вт, 30.10.2007, 10:05  |                                                                                                                Сообщение # 24
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 112
Репутация: 2   ±
Замечания:   ±
На сайте с 27.09.2007

Статус: Offline

Quote
через любую переменную размером в бит
DeveloperX Дата: Вт, 30.10.2007, 17:33  |                                                                                                                Сообщение # 25
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 149
Репутация: 1   ±
Замечания:   ±
На сайте с 25.10.2007

Статус: Offline

правильно ли я понял:
когда установлен этот бит в "разрешить", то начинает работать подпрограмма вывода на экран, но при очередном импульсе выполняется прерывание и эта подпрограмма обрывается и происходит например увеличение счетчика и затем снова подпрограмма вывода на экран попытается вывести что-то до поступления очередного импульса?

возможно я ошибся в этом псевдо-коде, т.к. нет ни разу слова таймер...

Yrok Дата: Ср, 31.10.2007, 09:56  |                                                                                                                Сообщение # 26
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 112
Репутация: 2   ±
Замечания:   ±
На сайте с 27.09.2007

Статус: Offline

Quote
правильно ли я понял:
когда установлен этот бит в "разрешить", то начинает работать подпрограмма вывода на экран, но при очередном импульсе выполняется прерывание и эта подпрограмма обрывается и происходит например увеличение счетчика и затем снова подпрограмма вывода на экран попытается вывести что-то до поступления очередного импульса?

Абсолютно правильно понял!!!

В последнем приведенном тобой примере таймер неиспользуется.
Pic настроен как счетчик импульсов со входа INT.
Конфигурирование счетчика осуществляется строчками:
OPTION_REG = $7f
и
INTCON = $90

а вот здесь
INTCON.1 = 0
происходит сброс флага прерывания

Сообщение отредактировал Yrok - Ср, 31.10.2007, 09:58
DeveloperX Дата: Ср, 31.10.2007, 10:13  |                                                                                                                Сообщение # 27
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 149
Репутация: 1   ±
Замечания:   ±
На сайте с 25.10.2007

Статус: Offline

Quote (Yrok)
Абсолютно правильно понял!!!

если я понял всё верно, то если учесть то, что на вывод на экран нужно пол секунды, а импульсы при скорости 200 км/ч поступают каждые 1/333 сек или приблиз. 3 милисек - т.е. при такой частоте на экран ничего не выведется пока частота не уменьшится до 0,5 сек!!!
как же быть с выводом на экран?
может быть кварц по-шустрее поставить? 20мгц-40мгц?

Сообщение отредактировал DeveloperX - Ср, 31.10.2007, 10:17
Yrok Дата: Ср, 31.10.2007, 11:18  |                                                                                                                Сообщение # 28
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 112
Репутация: 2   ±
Замечания:   ±
На сайте с 27.09.2007

Статус: Offline

ну почему невыведется--вот смотри--подпрограмма обработки прерывания будет выполняться микросекунды,еслт туда неставить конечно задержки или вывод на экран--т.е. правильно все сделать.
Допустим что на обработку прерывания уходит 1 милисекунда--тогда у нас еще остается целых 2 милисекунды happy --а это очень даже ого-го.
Т.е. за время вывода на экран(которое занимает примерно 40-60 милисекунд) мы дополнительно посчитаем еще 60/2=30 импульсов---а также нестоить забывать что следующий вывод на экран будет спустя 1 секунду--так что проблем никаких нет
DeveloperX Дата: Ср, 31.10.2007, 11:29  |                                                                                                                Сообщение # 29
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 149
Репутация: 1   ±
Замечания:   ±
На сайте с 25.10.2007

Статус: Offline

Yrok, а что пик- многозадачный как windowsXP???
и считает, и выводит?....
Yrok Дата: Ср, 31.10.2007, 12:25  |                                                                                                                Сообщение # 30
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 112
Репутация: 2   ±
Замечания:   ±
На сайте с 27.09.2007

Статус: Offline

если все правильно сделать то практически так и есть biggrin
вот накропал программку которая считает импульсы за 1 секунду и выводит их на экран
смотри , разбирайся --если что непонятно спрашивай
Quote
DEFINE LCD_DREG PORTC 'LCD data port B '
DEFINE LCD_DBIT 4 'LCD data starting bit 0 or 4 '
DEFINE LCD_RSREG PORTC 'LCD register select port D.1 '
DEFINE LCD_RSBIT 1 'LCD register select bit 1 '
DEFINE LCD_EREG PORTC 'LCD enable port D.3 ' Установки LCD дисплея
DEFINE LCD_EBIT 3 'LCD enable bit '
DEFINE LCD_BITS 4 'LCD bus size 4 or 8 '
DEFINE LCD_LINES 2 '
DEFINE OSC 4 'используем кварц на 4МГц

od var byte
s var byte '
w1 var word '
od100 var word
od101 var word '
od1km var word ' всякие там переменные(некоторые пока даже неиспользуются)
F var word '
st var bit
q var bit '
i var word

OPTION_REG = $43 ' Включаем подтягивающие резисторы и настраиваем предделитель для TMR0
@ device WDT_OFF
On Interrupt Goto myint
LCDOUT $FE, 1,"Nachinaem schet" ' это так чтоб проконтролировать работу
low PortB.4
pause 1000 '
TMR0=5
od100=0
od101=0
q=0
INTCON = $B0 ' включаем прерывания от входа INT и по переполнению таймера TMR0

loop: if q=1 then
LCDOUT $FE, 1,#od101," za 1 sec " ' Выводим данные если разрешенно
q=0
od101=0
endif
Goto loop

' Interrupt handler
Disable
myint: if intcon.1=1 then ' если прерывание произошло по входу INT увеличиваем счетчик
od100=od100+1
INTCON.1 = 0
endif
if intcon.2=1 then ' если прерывание по переполнению TMR0 разрешаем вывод на экран
s=s+1
if s=250 then
s=0
q=1
od101=od100
od100=0
endif
TMR0=5
intcon.2=0
endif
Resume
Enable

Поиск: