Cчет импульсов
|
|
Yrok |
Дата: Пт, 26.10.2007, 17:18 | Сообщение # 16 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
112
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Quote (DeveloperX) basicpic, к сожалению я ещё не умею работать с таймерами и прерываниями...а логически: w больше 10 и тушим - по-моему верно?к тому же частота меняется от 0Гц до 333Гц.вообще-то мне нужно считать импульсы постоянно (от датчика скорости, вентилятора кулера) и выводить полученное количество на дисплей.подскажите пожалуйста текст программы, которая по-вашему мнению будет работать и описание схемы подключения.очень надо разобраться... Что вам конкретно нужно? Вот ваша программа, во-первых, не зациклена, то есть она выключит светодиод и все, но это произойдет через секунду, за которую считаются ВСЕ входящие импульсы. Просто выключится и все. По логике вашей программы, переменная W при любой частоте ,будет больше 10. Ваш процессор, я так понял, должен ловить каждые 10 импульсов (почему именно 10?) и сообщать вам об этом. Давайте так: Вы внятно и понятно объясните вашу задачу(что нужно, километраж, скорость?) и мы вместе на вашем примере разберем все нюансы.
|
|
|
|
DeveloperX |
Дата: Пн, 29.10.2007, 08:14 | Сообщение # 19 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
149
Замечания:
±
На сайте с 25.10.2007
Статус:
Offline
|
Quote (basicpic) Давайте так: Вы внятно и понятно объясните вашу задачу(что нужно, километраж, скорость?) и мы вместе на вашем примере разберем все нюансы. 10 импульсов мне нужно было для того, чтобы понять работают ли функции PULSIN, COUNT и каким образом (вал датчика крутил руками). а вообще нужно определять и выводить на дисплей километраж и скорость. и заодно понять прерывания и таймеры.
|
|
|
|
Yrok |
Дата: Пн, 29.10.2007, 10:03 | Сообщение # 20 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
112
Замечания:
±
На сайте с 27.09.2007
Статус:
Offline
|
Предлагаю такой алгоритм 1)Считать импульсы от датчика скорости используя прерывания по изменению состояния порта B 2)Использовать счетчик TMR0 для измерения отрезков времени по 1сек 3)По прошествии 1сек выставлять флаг разрешения вывода на экран 4)Выводить на LCD дисплей используя 4 битный интерфейс и посадить его на порт С
|
|
|
|
DeveloperX |
Дата: Пн, 29.10.2007, 10:23 | Сообщение # 21 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
149
Замечания:
±
На сайте с 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 такта.
|
|
|
|
Yrok |
Дата: Пн, 29.10.2007, 15:19 | Сообщение # 22 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
112
Замечания:
±
На сайте с 27.09.2007
Статус:
Offline
|
Quote как я понял обработку вывода на экран можно вставить в подпрограмму myint. Вот тут ты неправ --сюда нельзя ставить вывод на экран--потому как пока ты будешь выводить , импульсы считаться небудут. В этой подпрограмме нужно все делать очень быстро и убегать из нее , например увеличить счетчик импульсов на единицу А поставить вывод нужно перед Quote Goto loop ' Do it forever и убрать паузу в 0.5 секунд тока с условием что вывод разрешен а разешать каждую секунду Чтобы понять куда ставить счетчик--почитай в мануале про него , тогда поймешь как он работает
Сообщение отредактировал
Yrok - Пн, 29.10.2007, 15:30
|
|
|
|
DeveloperX |
Дата: Пн, 29.10.2007, 17:37 | Сообщение # 23 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
149
Замечания:
±
На сайте с 25.10.2007
Статус:
Offline
|
Quote (Yrok) тока с условием что вывод разрешен а такой флаг разрешения нужно делать через специальный регистр или через любую переменную размером в бит?
|
|
|
|
Yrok |
Дата: Вт, 30.10.2007, 10:05 | Сообщение # 24 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
112
Замечания:
±
На сайте с 27.09.2007
Статус:
Offline
|
Quote через любую переменную размером в бит
|
|
|
|
DeveloperX |
Дата: Вт, 30.10.2007, 17:33 | Сообщение # 25 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
149
Замечания:
±
На сайте с 25.10.2007
Статус:
Offline
|
правильно ли я понял: когда установлен этот бит в "разрешить", то начинает работать подпрограмма вывода на экран, но при очередном импульсе выполняется прерывание и эта подпрограмма обрывается и происходит например увеличение счетчика и затем снова подпрограмма вывода на экран попытается вывести что-то до поступления очередного импульса? возможно я ошибся в этом псевдо-коде, т.к. нет ни разу слова таймер...
|
|
|
|
Yrok |
Дата: Ср, 31.10.2007, 09:56 | Сообщение # 26 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
112
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 27.09.2007
Статус:
Offline
|
ну почему невыведется--вот смотри--подпрограмма обработки прерывания будет выполняться микросекунды,еслт туда неставить конечно задержки или вывод на экран--т.е. правильно все сделать. Допустим что на обработку прерывания уходит 1 милисекунда--тогда у нас еще остается целых 2 милисекунды --а это очень даже ого-го. Т.е. за время вывода на экран(которое занимает примерно 40-60 милисекунд) мы дополнительно посчитаем еще 60/2=30 импульсов---а также нестоить забывать что следующий вывод на экран будет спустя 1 секунду--так что проблем никаких нет
|
|
|
|
DeveloperX |
Дата: Ср, 31.10.2007, 11:29 | Сообщение # 29 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
149
Замечания:
±
На сайте с 25.10.2007
Статус:
Offline
|
Yrok, а что пик- многозадачный как windowsXP??? и считает, и выводит?....
|
|
|
|
Yrok |
Дата: Ср, 31.10.2007, 12:25 | Сообщение # 30 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
112
Замечания:
±
На сайте с 27.09.2007
Статус:
Offline
|
если все правильно сделать то практически так и есть вот накропал программку которая считает импульсы за 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
|
|
|
|