Измерение импульса
|
|
sky76 |
Дата: Сб, 18.06.2011, 21:23 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
5
Замечания:
±
На сайте с 02.03.2011
Статус:
Offline
|
Доброго времени! Никак не получается измерить время нажатия на кнопку. Задача в следующем, если кнопка нажата больше 0, но меньше 300 мсек, то зажигаем светодиод, в остальных случаях не реагируем на нажатия. Пробовал использовать PULSIN, но он только с генератором работает ,а скнопкой не хочет( программу запускал в REAL PIC SIMULATOR). Направте на путь, а то в тупике. использую PIC12F629
Сообщение отредактировал
sky76 - Сб, 18.06.2011, 21:24
|
|
|
|
ADMIN |
Дата: Вс, 19.06.2011, 04:37 | Сообщение # 2 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Можно глянуть здесь.
|
|
|
|
sky76 |
Дата: Пн, 20.06.2011, 00:50 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
5
Замечания:
±
На сайте с 02.03.2011
Статус:
Offline
|
Для меня сложно с прерыванием, только начал программировать, всего несколько простых программ писал(главное что в железе работают и мне проще на PIC, чем на простой логике городить). Если возможно подробней как реализовать программно измерение импульса с помощью прерывания. Может описание организации прерываний. Вообщем буду благодарен Вашей помощи!
|
|
|
|
ADMIN |
Дата: Пн, 20.06.2011, 18:39 | Сообщение # 4 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Ну тогда напиши, что уже имеется в программе. Попробуем, что-нибудь придумаем
|
|
|
|
sky76 |
Дата: Вт, 21.06.2011, 00:08 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
5
Замечания:
±
На сайте с 02.03.2011
Статус:
Offline
|
Да были лишь безуспешные попытки написать код, использовал 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 Конечно коряво, но это пока что умею.Если не сильно понятно что к чему я прокомментирую.
|
|
|
|
ADMIN |
Дата: Вт, 21.06.2011, 13:41 | Сообщение # 6 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Ну вот пример: кнопка на GPIO.0, светодиод на GPIO.1. При нажатии менее 300 мСек, загорается светодиод, при более длительном нажатии - ничего не делаем.
Code
SYMBOL TMR1IE = PIE1.0 ' Бит разрешения прерывания по переполнению TMR1 SYMBOL TMR1IF = PIR1.0 ' Флаг прерывания по переполнению TMR1 '-------------------------- T1CON --------------------------------------------------- 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 ' Возврат на начало основной программы
|
|
|
|
sky76 |
Дата: Вт, 21.06.2011, 13:59 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
5
Замечания:
±
На сайте с 02.03.2011
Статус:
Offline
|
Этот пример на ПРОТОНе написан? И для какого проца?
Сообщение отредактировал
sky76 - Вт, 21.06.2011, 14:05
|
|
|
|
ADMIN |
Дата: Вт, 21.06.2011, 14:12 | Сообщение # 8 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Это для PBP для 12f629. В архиве лежит файл протеуса и файл программы.
|
|
|
|
sky76 |
Дата: Ср, 22.06.2011, 23:34 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
5
Замечания:
±
На сайте с 02.03.2011
Статус:
Offline
|
Ну спасибо, работает(симуляция). Попробую разобраться и реализовать свою задачу. Добавлено (22.06.2011, 23.02.14) --------------------------------------------- В какой строке задается выдержка 300мсек. Где можно почитать по настройке прерываний. Добавлено (22.06.2011, 23.34.03) --------------------------------------------- Что значит " ~ " в строке " But1 = ~but1 "
Сообщение отредактировал
sky76 - Ср, 22.06.2011, 23:01
|
|
|
|
ADMIN |
Дата: Чт, 23.06.2011, 08:31 | Сообщение # 10 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
300 мСек задается следующими строками:
TMR1L = $84 ' Значение младшего регистра TMR1 TMR1H = $6D ' Значение старшего регистра TMR1 T1CON = %00110000 'Настройка TMR1 Эти значения можно задать с помощью этой онлайн программки. Устанавливаешь тактовую частоту, выбираешь таймер, предделитель для него. С помощью пункта Подстройка TMR подбираешь такое значение, чтобы в окне период прерываний появилось нужное число секунд, миллисекунд,микросекунд или наносекунд(выбирается кнопкой), также можно сразу увидеть частоту этих прерываний (в Гц, кГц или МГц - также выбирается кнопкой рядом). В результате получается для TMR1 значение регистра T1CON и TMR1.
|
|
|
|