Счетчик / делитель импульсов
|
|
magelan |
Дата: Чт, 16.04.2009, 14:21 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
7
Замечания:
±
На сайте с 10.03.2008
Статус:
Offline
|
Подскажите, как лучше поступить... Надо считать входные импульсы, и при поступлении например 100 или 200 имп. выдать один выходной импульс.. Период входных 200-300мс длительность 100-150мс Длительность выходного от 50мс.. Варианты считать импульсы через прерывания, или считать в цикле через button?
|
|
|
|
DIKTATOR |
Дата: Чт, 16.04.2009, 15:06 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
76
Замечания:
±
На сайте с 24.07.2008
Статус:
Offline
|
тебе написать пример ? Про button, советую не использовать, у этой команды много дополнительных настроек которые ненужны. Легче всего сделать подсчёт при помощи if ... then ... Добавлено (16.04.2009, 2:38:49) --------------------------------------------- Вобщем сейчас напишу с коментариями =) Добавлено (16.04.2009, 3:06:28) --------------------------------------------- примерно через 40 минут я сюда выложу пример, я подробно распишу каждую строку кода, и я просимулирую работу программы в программе PIC Simulator IDE чтоб точно знать что пример мой работает ))
Используйте симулятор ПРОТУЕС !!! Реальная вещь!! Я снова тут, но не всегда свободен.
|
|
|
|
magelan |
Дата: Чт, 16.04.2009, 15:39 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
7
Замечания:
±
На сайте с 10.03.2008
Статус:
Offline
|
Вот, пытался чтото сделать ... Как правильно инициализацию прерываний сделать? TRISIO = %00000100 'GP2 - вход GP1, GP0 выход INTCON = %10010000 counter var byte on interrupt goto myint counter = 0 goto main myint: counter=counter+1 resume main: if counter < 100 then goto main high GPIO.1 pause 50 low GPIO.1 counter = counter - 100 goto main end
|
|
|
|
DIKTATOR |
Дата: Чт, 16.04.2009, 15:51 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
76
Замечания:
±
На сайте с 24.07.2008
Статус:
Offline
|
kolPULS var word 'переменная для хранения количества импульсов - word позволяет щитать до 65535 impin VAR PORTB.0 'теперь PORTB.0 называется impin impou VAR PORTB.1 'теперь PORTB.1 называется impou init: clear 'очистка всей памяти озу PORTB = %00000000 'очистить все данные в регистре порта TRISB.0 = 1 'PORTB.0 сконфигурировать как вход TRISB.1 = 0 'PORTB.1 сконфигурировать как выход pulsIN: IF impin = 1 THEN pulsWRITEwar 'если на выводе impin(PORTB.0) появится сигнал 1 то перейти к метке pulsWRITEwar IF kolPULS = 200 THEN pulsEXIT 'если количество импульсов будет равно 200 то перейти к метке pulsEXIT pauseus 100 'если ни одна из команд IF ... THEN ... не перешла по меткам, выполнить pauseus 100 goto pulsIN 'вернутся к метке pulsIN и начать проверять порты и переменные заного pulsWRITEwar: kolPULS = kolPULS + 1 'прибавить к числу в переменной kolPULS 1 импульс slygMETKA: pauseus 100 'ждать 100 микросекунд, на всякий случай лёгкая защита от помех IF impin = 0 THEN pulsIN 'если на выводе impin(PORTB.0) сигнал пропадёт(логическая 0) перейти к метке pulsIN goto slygMETKA pulsEXIT: impou = 1 'подать сигнал 1 на impin(PORTB.1) сообщяющий о том что количество импульсов = 200 pause 50 'оставить порт impin(PORTB.1) включенным на 50 милисекунд impou = 0 'подать сигнал 0 на impin(PORTB.1) - это выключение сигнала kolPULS = 0 'сбросить число в переменной kolPULS на 0 goto pulsIN 'перейти в начало программы пока не проверял, но думаю правильно ))))
Используйте симулятор ПРОТУЕС !!! Реальная вещь!! Я снова тут, но не всегда свободен.
|
|
|
|
magelan |
Дата: Чт, 16.04.2009, 16:08 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
7
Замечания:
±
На сайте с 10.03.2008
Статус:
Offline
|
попробую... просто думал что можно чемнить определить срабатывание по фронту импульса... но, можно и так... счас, в протеусе проверю...
|
|
|
|
DIKTATOR |
Дата: Чт, 16.04.2009, 16:22 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
76
Замечания:
±
На сайте с 24.07.2008
Статус:
Offline
|
такс в примере при компиляции много ошибок с метками )) названия меток надо другие Добавлено (16.04.2009, 4:22:59) --------------------------------------------- ктомуже для pic12 порты PORTB итд недоступны наверно, я лично работаю тока с 16 серией и сейчас перехожу на 18 да все проблемы тока с названием меток, при исправлении компилится норм. Пример можно усложнить добавлением подпрограммы для обработки длительности входного сигнала, чтоб добавить повышенную помехозащищённость и чтоб щитать сигналы только определённой длинны
Используйте симулятор ПРОТУЕС !!! Реальная вещь!! Я снова тут, но не всегда свободен.
Сообщение отредактировал
DIKTATOR - Чт, 16.04.2009, 16:38
|
|
|
|
magelan |
Дата: Чт, 16.04.2009, 16:38 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
7
Замечания:
±
На сайте с 10.03.2008
Статус:
Offline
|
это сам уже исправил pulsin тоже служебная команда... скомпилировал, но пока не заработало... на pic18 там в корпусе места нету, да и дороже он ...
|
|
|
|
DIKTATOR |
Дата: Чт, 16.04.2009, 17:22 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
76
Замечания:
±
На сайте с 24.07.2008
Статус:
Offline
|
kolPULS var word impin VAR PORTB.0 impou VAR PORTB.1 x var byte init: clear PORTB = %00000000 TRISB.0 = 1 TRISB.1 = 0 proverk: IF impin = 1 THEN proverk2 IF kolPULS = 50 THEN sygnou goto proverk proverk2: for x = 0 to 9 pauseus 1000 IF impin = 0 THEN proverk IF x = 10 THEN pulsWRITEwar next goto proverk2 pulsWRITEwar: kolPULS = kolPULS + 1 slygMETKA: pauseus 100 IF impin = 0 THEN proverk goto slygMETKA sygnou: impou = 1 pause 50 impou = 0 kolPULS = 0 goto proverk Вот пример компилирующийся без ошибок, проверил в pic симуляторе работает нормально, главный недостаток этого делителя это то что когда сигнал impou = 1, щитать ничего не получится, но если входящий сигнал больше по длительности чем сигнал impou то всё будет нормально... Программа ниже метки proverk2 проверяет длинну импульса на входе, если сигнал меньше 10000 микросекунд то программа возвращается обратно к proverk при этом импульс не защитывается. тока я проверял программу без proverk2 но в компиляторе всё норм, просто в pic симуляторе такая программа будет прощитыватся очень долго, конечно я могу выставить меньшие задержки но мне что-то не охота=)... Надеюсь я помог
Используйте симулятор ПРОТУЕС !!! Реальная вещь!! Я снова тут, но не всегда свободен.
Сообщение отредактировал
DIKTATOR - Чт, 16.04.2009, 22:54
|
|
|
|
magelan |
Дата: Пт, 17.04.2009, 15:32 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
7
Замечания:
±
На сайте с 10.03.2008
Статус:
Offline
|
Забодался совсем... что то совсем запутался... неработает, не реагирует на входные импульсы. даже если сделать простой цикл - читать состояние вывода и тутже выводить его на другой - тишина... проц запускается... тестовое одновременное моргание третьим выводом при этом работает... ... Придется видать Си-асемблер вспоминать... или хотяб поковырять полученный из бейсика .asm пробовал и встроенный асм пользовать и mpasm... ... Откопал большую макетку с 40ка ногим pic18 и LCD 4x20 - буду на ней бейсик изучать... последний раз наверно два года назат чтото писал, вот теперь мучаюсьДобавлено (17.04.2009, 3:32:27) --------------------------------------------- Хотя... вот в соседней ветке нашел.. Quote (viktorino) (начало) програми для 12f629 чтоб gp0 gp1 стали цифвровыми входами a gp3-выход Сначала нужно отключить компаратор от входов: CMCON = %00000111 потом: output gpio.3 input gpio.1 input gpio.0 Пойду проверять!
|
|
|
|
DIKTATOR |
Дата: Пт, 17.04.2009, 20:58 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
76
Замечания:
±
На сайте с 24.07.2008
Статус:
Offline
|
а как ты импульсы подаёшь? посмотри в книге чака, там кнопки подтянуты резистором к питанию чтоб было 5в на порту постоянно и рядом подключается кнопка которая подключена к земле, если её нажать то на выводе чотко 0 вольт, так можно щитать импульсы. Но если нога просто висит и ты кнему проводочком тыкаеш +5в то нефакт что когда ты отпустиш на выводе будет ровно 0 вольт.
Используйте симулятор ПРОТУЕС !!! Реальная вещь!! Я снова тут, но не всегда свободен.
|
|
|
|
magelan |
Дата: Пт, 17.04.2009, 21:15 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
7
Замечания:
±
На сайте с 10.03.2008
Статус:
Offline
|
Сразу не написал... Но в общем - добавил CMCON = %00000111 и все заработало! Всем большое спасибо! девайс уже поставлен на тестирование. завтра отдаю заказчику... Попутно буду работать над вариантом с индикацией результата на LCD и установкой коэф. через меню кнопками... Такчто далеко не пропаду с форума
|
|
|
|