Уважаемый Vladh !!
Спасибо вам за ответ
Конечно мне знакома команда Бейсика Pulsin
Но как я уже говорил выше про команду Pauseus
во время выполнения этой команды нельзя выполнять другие команды кроме как ждать окончания импульса!!!
А если импульс имеет длительность 0,5сек--что тогда???
Идти курить??
Да выложенная программа содержит много лишнего ---это все результат моих попыток отладить ее
вот выкладываю удобоваримый вариант а также модель в Proteuse
-------------------------------------------------
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 20 'используем кварц на 20МГц
od var byte '
w1 var word '
od100 var byte '
od1km var word ' всякие там переменные(некоторые пока даже неиспользуются)
F var word '
st var bit '
i var word '
On Interrupt Goto signal 'если прерывание идем на Signal
@ device WDT_OFF 'jnhe,ftv сторожевой таймер чтоб немешал
OPTION_REG = $C7 '
trisB=255 'порт В как вход
LCDOUT $FE, 1,"Privet Andrey" ' это так чтоб проконтролировать работу
pause 500 '
LCDOUT $FE, 1," " ' ну и меня порадовать
F=0 ' обнуляем количество переполнений TMR1
w1=1 ' вспомогательный бит - определяющий фронт входного сигнала
intcon=$C0 ' включаем перефирийные прерывания
T1CON=0 ' включаем модуль таймера TMR1
m:
LCDOUT $FE, 2, #od1km, " ", #F, " " ' выводим длительность в мс и содержимое счетчика
if PortB.7=1 and w1=1 then goto start ' проверяем если передний фронт то идем запускать счетчик
if PortB.7=0 and w1=0 then goto stoping ' если задний то идем останавливать счетчик
n:
goto m ' зацикливаем вывод и проверку
start:
TMR1H=254 ' устанавливаем прерывания от TMR1 каждые 0,1мс
TMR1L=12 '
T1CON=1 ' включаем модуль таймера TMR1
PIE1=1 ' разрешаем прерывания от TMR1
w1=0 ' счет начался
high portc.0 ' логическая 1 на порт С0(контроль начала счета)
goto ex ' возвращаемся к опросу порта В
stoping:
PIE1=0 ' запрещаем прерывания от TMR1
T1CON=0 ' выключаем модуль TMR1
od1km=F/10 'длительность = счетчик/0.1мс
w1=1 ' счет закончен
F=0 'обнуляем счетчик
low portc.0 ' лог 0 на порт С0
ex:
goto n '
Disable ' запрещаем всяческие прерывания
signal: '
'
f=f+1 ' увеличиваем счетчик
TMR1H=254 ' устанавливаем прерывания от TMR1 каждые 0,1мс
TMR1L=12 '
PIR1=0 ' сбрасываем флаг TMR1.IF
'
'
Resume ' возвращаемся в основную программу
Enable ' разрешаем всяческие прерывания
------------------------------------------------------
Весь фикус втом что никак немогу добиться правильного
значения.
В примере подаю сигнал с частото1 1 ГЦ и длительностью входного сигнала 500мс а результат получаю 15мс????
Прикрепленный файл:
3260460.RAR