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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: ivan_fd  
Измерение импульса
sky76 Дата: Сб, 18.06.2011, 21:23  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 5
Репутация: 0   ±
Замечания:   ±
На сайте с 02.03.2011

Статус: Offline

Доброго времени! Никак не получается измерить время нажатия на кнопку. Задача в следующем, если кнопка нажата больше 0, но меньше 300 мсек, то зажигаем светодиод, в остальных случаях не реагируем на нажатия. Пробовал использовать PULSIN, но он только с генератором работает ,а скнопкой не хочет( программу запускал в REAL PIC SIMULATOR). Направте на путь, а то в тупике. wacko использую PIC12F629
Сообщение отредактировал sky76 - Сб, 18.06.2011, 21:24
ЯНДЕКС Дата: 18.06.2011
ADMIN Дата: Вс, 19.06.2011, 04:37  |                                                                                                                Сообщение # 2
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Можно глянуть здесь.
sky76 Дата: Пн, 20.06.2011, 00:50  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Новенький
Сообщений: 5
Репутация: 0   ±
Замечания:   ±
На сайте с 02.03.2011

Статус: Offline

Для меня сложно с прерыванием, только начал программировать, всего несколько простых программ писал(главное что в железе работают и мне проще на PIC, чем на простой логике городить). Если возможно подробней как реализовать программно измерение импульса с помощью прерывания. Может описание организации прерываний. Вообщем буду благодарен Вашей помощи!
ADMIN Дата: Пн, 20.06.2011, 18:39  |                                                                                                                Сообщение # 4
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Ну тогда напиши, что уже имеется в программе. Попробуем, что-нибудь придумаем
sky76 Дата: Вт, 21.06.2011, 00:08  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Новенький
Сообщений: 5
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 32   ±
Замечания:   ±
На сайте с 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   ' Возврат на начало основной программы

Прикрепления: Button.rar (16.2 Kb)
sky76 Дата: Вт, 21.06.2011, 13:59  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Новенький
Сообщений: 5
Репутация: 0   ±
Замечания:   ±
На сайте с 02.03.2011

Статус: Offline

Этот пример на ПРОТОНе написан? И для какого проца?
Сообщение отредактировал sky76 - Вт, 21.06.2011, 14:05
ADMIN Дата: Вт, 21.06.2011, 14:12  |                                                                                                                Сообщение # 8
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Это для PBP для 12f629. В архиве лежит файл протеуса и файл программы.
sky76 Дата: Ср, 22.06.2011, 23:34  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Новенький
Сообщений: 5
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

300 мСек задается следующими строками:

TMR1L = $84 ' Значение младшего регистра TMR1
TMR1H = $6D ' Значение старшего регистра TMR1
T1CON = %00110000 'Настройка TMR1
Эти значения можно задать с помощью этой онлайн программки. Устанавливаешь тактовую частоту, выбираешь таймер, предделитель для него. С помощью пункта Подстройка TMR подбираешь такое значение, чтобы в окне период прерываний появилось нужное число секунд, миллисекунд,микросекунд или наносекунд(выбирается кнопкой), также можно сразу увидеть частоту этих прерываний (в Гц, кГц или МГц - также выбирается кнопкой рядом). В результате получается для TMR1 значение регистра T1CON и TMR1.
  • Страница 1 из 1
  • 1
Поиск: