Доброго времени! Никак не получается измерить время нажатия на кнопку. Задача в следующем, если кнопка нажата больше 0, но меньше 300 мсек, то зажигаем светодиод, в остальных случаях не реагируем на нажатия. Пробовал использовать PULSIN, но он только с генератором работает ,а скнопкой не хочет( программу запускал в REAL PIC SIMULATOR). Направте на путь, а то в тупике. использую PIC12F629
Сообщение отредактировал
sky76 - Сб, 18.06.2011, 21:24
Для меня сложно с прерыванием, только начал программировать, всего несколько простых программ писал(главное что в железе работают и мне проще на PIC, чем на простой логике городить). Если возможно подробней как реализовать программно измерение импульса с помощью прерывания. Может описание организации прерываний. Вообщем буду благодарен Вашей помощи!
Да были лишь безуспешные попытки написать код, использовал PULSIN, RCTIME, потом просто main: GPIO.4 = 0 GPIO.5 = 0 IF GPIO.0 = 1 AND GPIO.1 = 0 THEN PAUSE 300 IF GPIO.0 = 0 AND GPIO.1 = 0 THEN GOTO f ENDIF ENDIF
IF GPIO.1 = 1 AND GPIO.0 = 0 THEN PAUSE 300 IF GPIO.1 = 0 AND GPIO.0 = 0 THEN GOTO g ENDIF ENDIF
GOTO main
f: FOR x = 0 TO 12 GPIO.5 = 1 IF GPIO.1 =1 THEN GOTO MAIN PAUSE 250 NEXT GOTO main
g: FOR x = 0 TO 12 GPIO.4 = 1 IF GPIO.0 =1 THEN GOTO MAIN PAUSE 250 NEXT GOTO main END Конечно коряво, но это пока что умею.Если не сильно понятно что к чему я прокомментирую.
Ну вот пример: кнопка на GPIO.0, светодиод на GPIO.1. При нажатии менее 300 мСек, загорается светодиод, при более длительном нажатии - ничего не делаем.
Code
SYMBOL TMR1IE = PIE1.0 ' Бит разрешения прерывания по переполнению TMR1 SYMBOL TMR1IF = PIR1.0 ' Флаг прерывания по переполнению TMR1
SYMBOL TMR1ON = T1CON.0 ' Бит включения модуля TMR1 SYMBOL TMR1CS = T1CON.1 ' Выбор источника тактового сигнала для TMR1 SYMBOL NOT_T1SYNC = T1CON.2 ' Синхронизация внешнего тактового сигнала SYMBOL T1INSYNC = T1CON.2 ' Синхронизация внешнего тактового сигнала SYMBOL T1SYNC = T1CON.2 ' Синхронизация внешнего тактового сигнала SYMBOL T1OSCEN = T1CON.3 ' Включение тактового генератора TMR1 SYMBOL T1CKPS0 = T1CON.4 ' Выбор коэффициента деления предделителя TMR1 SYMBOL T1CKPS1 = T1CON.5 ' Выбор коэффициента деления предделителя TMR1 SYMBOL PEIE = INTCON.6 ' Бит разрешения прерывания от периферийных устройств SYMBOL GIE = INTCON.7 ' Бит глобального разрешения прерываний '-------------------------- Начало ------------------------------------------- SYMBOL Butt = GPIO.0 'Вход кнопки SYMBOL Led1 = GPIO.1 'Выход светодиода
Butflag VAR BYTE 'Переменная флагов But1 VAR Butflag.0 'Флаг того, что была нажата кнопка CHF VAR Butflag.1 'Флаг отпущенной кнопки
'-------------------------- Настройка TMR1 для прерываний -------------------- TMR1L = $84 ' Значение младшего регистра TMR1 TMR1H = $6D ' Значение старшего регистра TMR1 T1CON = %00110000 'Настройка TMR1 CMCON = 7 'Отключим компаратор TMR1IE = 1 ' Разрешение прерывания при переполнении TMR1 с частотой 3,333333 Гц
PEIE = 1 ' Разрешение прерываний от периферийных устройств GIE = 1 ' Разрешение глобального прерывания Butflag = 0 'Очистим флаги GPIO = 0 'Очистим порт WPU = %000001 'Включим подтяжку на GPIO.0 OPTION_REG = %00000000 'Разрешим внутренние подтягивающие резисторы TRISIO = %001001 'Настроим GPIO.0 на вход ON INTERRUPT GOTO Int_Label 'При прерывании перейдем на метку Int_Label GOTO MainProgram 'Все, начинаем
'-------------------------- Прерывания-------------------------- 'Сюда мы будем попадать через 300 мСек после нажатия кнопки Int_Label: DISABLE 'Запрет прерываний IF GPIO.0 = 1 THEN 'Если кнопка уже отпущена до окончания 300 мСек But1 = ~But1 'то ставим флаг ENDIF CHF = 1 'Ставим флаг для того, что если кнопка не отпущена 'не попадать снова в прерывания TMR1ON = 0 'Выключаем таймер TMR1L = $84 ' Значение младшего регистра TMR1 TMR1H = $6D ' Значение старшего регистра TMR1 TMR1IF = 0 'Сбрасываем флаг прерывания по переполнению TMR1 RESUME ' Возврат из обработчика прерывания ENABLE '-------------------------- Главная программа -------------------------
MainProgram: IF GPIO.0 = 0 THEN 'Если нажата кнопка IF CHF = 0 THEN 'то если разрешено действие TMR1ON = 1 'начинаем отсчет 300 мСек(включаем таймер) ENDIF ENDIF IF But1 = 1 THEN 'Если установлен разрешающий флаг для действия от кнопки 'нажатой менее 300 мСек Led1 = 1 'то зажигаем светодиод ELSE Led1 = 0 'иначе - гасим его ENDIF
IF GPIO.0 = 1 THEN ' Если кнопка отпущена уже после прерывания CHF = 0 'То разрешаем обработку следующего нажатия ENDIF GOTO MainProgram ' Возврат на начало основной программы
Ну спасибо, работает(симуляция). Попробую разобраться и реализовать свою задачу.
Добавлено (22.06.2011, 23.02.14) --------------------------------------------- В какой строке задается выдержка 300мсек. Где можно почитать по настройке прерываний.
Добавлено (22.06.2011, 23.34.03) --------------------------------------------- Что значит " ~ " в строке " But1 = ~but1 "
Сообщение отредактировал
sky76 - Ср, 22.06.2011, 23:01
TMR1L = $84 ' Значение младшего регистра TMR1 TMR1H = $6D ' Значение старшего регистра TMR1 T1CON = %00110000 'Настройка TMR1 Эти значения можно задать с помощью этой онлайн программки. Устанавливаешь тактовую частоту, выбираешь таймер, предделитель для него. С помощью пункта Подстройка TMR подбираешь такое значение, чтобы в окне период прерываний появилось нужное число секунд, миллисекунд,микросекунд или наносекунд(выбирается кнопкой), также можно сразу увидеть частоту этих прерываний (в Гц, кГц или МГц - также выбирается кнопкой рядом). В результате получается для TMR1 значение регистра T1CON и TMR1.