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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: ivan_fd  
Счетчик / делитель импульсов
magelan Дата: Чт, 16.04.2009, 14:21  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 7
Репутация: 0   ±
Замечания:   ±
На сайте с 10.03.2008

Статус: Offline

Подскажите, как лучше поступить...
Надо считать входные импульсы, и при поступлении например 100 или 200 имп.
выдать один выходной импульс..
Период входных 200-300мс длительность 100-150мс
Длительность выходного от 50мс..

Варианты считать импульсы через прерывания, или считать в цикле через button?

ЯНДЕКС Дата: 16.04.2009
DIKTATOR Дата: Чт, 16.04.2009, 15:06  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 76
Репутация: 2   ±
Замечания:   ±
На сайте с 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
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 2   ±
Замечания:   ±
На сайте с 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
Репутация: 0   ±
Замечания:   ±
На сайте с 10.03.2008

Статус: Offline

попробую...
просто думал что можно чемнить определить срабатывание по фронту импульса...
но, можно и так...
счас, в протеусе проверю...
DIKTATOR Дата: Чт, 16.04.2009, 16:22  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 76
Репутация: 2   ±
Замечания:   ±
На сайте с 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
Репутация: 0   ±
Замечания:   ±
На сайте с 10.03.2008

Статус: Offline

это сам уже исправил wacko
pulsin тоже служебная команда...
скомпилировал, но пока не заработало...
на pic18 там в корпусе места нету, да и дороже он ...
DIKTATOR Дата: Чт, 16.04.2009, 17:22  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 76
Репутация: 2   ±
Замечания:   ±
На сайте с 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 симуляторе такая программа будет прощитыватся очень долго, конечно я могу выставить меньшие задержки но мне что-то не охота=)...
Надеюсь я помог wink


Используйте симулятор ПРОТУЕС !!! Реальная вещь!!
Я снова тут, но не всегда свободен.

Сообщение отредактировал DIKTATOR - Чт, 16.04.2009, 22:54
magelan Дата: Пт, 17.04.2009, 15:32  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Новенький
Сообщений: 7
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 2   ±
Замечания:   ±
На сайте с 24.07.2008

Статус: Offline

а как ты импульсы подаёшь? посмотри в книге чака, там кнопки подтянуты резистором к питанию чтоб было 5в на порту постоянно и рядом подключается кнопка которая подключена к земле, если её нажать то на выводе чотко 0 вольт, так можно щитать импульсы. Но если нога просто висит и ты кнему проводочком тыкаеш +5в то нефакт что когда ты отпустиш на выводе будет ровно 0 вольт.

Используйте симулятор ПРОТУЕС !!! Реальная вещь!!
Я снова тут, но не всегда свободен.
magelan Дата: Пт, 17.04.2009, 21:15  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Новенький
Сообщений: 7
Репутация: 0   ±
Замечания:   ±
На сайте с 10.03.2008

Статус: Offline

Сразу не написал...
Но в общем - добавил

CMCON = %00000111

и все заработало!

Всем большое спасибо!
девайс уже поставлен на тестирование. завтра отдаю заказчику...
Попутно буду работать над вариантом с индикацией результата на LCD
и установкой коэф. через меню кнопками...
Такчто далеко не пропаду с форума smile

ЯНДЕКС Дата: 17.04.2009
  • Страница 1 из 1
  • 1
Поиск: