'*******************************************************************************
'************************* *************************
'************************* ИССЛЕДОВАНИЕ ПРЕРЫВАНИЙ *************************
'************************* *************************
'*******************************************************************************
'* Revision : 1.0 *
'* Controller : ATMEGA88A *
'* Compiler : BASCOM-AVR 2.0.7.1 *
'* Author : sasha_1973@mail.ru *
'*******************************************************************************
'-------------------------------------------------------------------------------
$regfile = "m88def.dat" : $crystal = 1000000 : $hwstack = 40 : $swstack = 16 : $framesize = 32 : $baud = 4700 '1200 '2400 '4800 '9600 '19200 '38400 '57600 '115000
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
Sim:
' $sim
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
$lib "mcsbyte.lbx"
$lib "mcsbyteint.lib"
'-------------------------------------------------------------------------------
'*******************************************************************************
'**********************************************************************************************************
'*************** *******************************************
'*************** Конфигурация *******************************************
'*************** режима пониженого энергпотребления *******************************************
'*************** *******************************************
'**********************************************************************************************************
'|--------------------------------------------------------------------------------------------------------|
'| |
'| SMCR - регистр управления режимом пониженого энергпотребления |
'| |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| | - | - | - | - | SM2 | SM1 | SM0 | SE | |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| | | | | | | | | 1 | разрешить спящий режим |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| | | | | | 0 | 0 | 0 | | Idle |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| | | | | | 0 | 0 | 1 | | Adcnoise |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| | | | | | 0 | 1 | 0 | | Powerdown |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| | | | | | 0 | 1 | 1 | | Powersave |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| | | | | | 1 | 1 | 0 | | Standby |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'**********************************************************************************************************
'**********************************************************************************************************
'*************** *******************************************
'*************** Конфигурация прерываний INT0; INT1 *******************************************
'*************** *******************************************
'**********************************************************************************************************
'|--------------------------------------------------------------------------------------------------------|
'| |
'| EICRA - регистр управления прерываниями INT0 и INT1 |
'| |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| | | | | | ISC11 | ISC10 | ISC01 | ISC00 | | |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| | | | | | 0 | 0 | | | INT1 Low Level |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| | | | | | 0 | 1 | | | INT1 Change |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| | | | | | 1 | 0 | | | INT1 Falling |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| | | | | | 1 | 1 | | | INT1 Rising |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| | | | | | | | 0 | 0 | INT0 Low Level |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| | | | | | | | 0 | 1 | INT0 Change |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| | | | | | | | 1 | 0 | INT0 Falling |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| | | | | | | | 1 | 1 | INT0 Rising |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'**********************************************************************************************************
'**********************************************************************************************************
'************************* *********************************
'************************* Конфигурация прерываний INT0; INT1 *********************************
'************************* *********************************
'**********************************************************************************************************
'|--------------------------------------------------------------------------------------------------------|
'| |
'| PCICR - регистр управления прерываниями PCINT0 - PCINT23 |
'| |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| | | | | | | PCIE2 | PCIE1 | PCIE0 | |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| | | | | | | 1 | | | Enable PCINT23...16 |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| | | | | | | | 1 | | Enable PCINT14...8 |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'| | | | | | | | | 1 | Enable PCINT7...0 |
'|-----|------|-------|-------|-------|---------|---------|---------|---------|---------------------------|
'**********************************************************************************************************
'***************************************************************************************
'************ **********************
'************ Конфигурация прерываний PCINT0...PCINT23 **********************
'************ **********************
'***************************************************************************************
'|-------------------------------------------------------------------------------------|
'| |
'| PCMSK2 - регистр маски прерываний PCINT23 - PCINT16 |
'| |
'|-----|---------|---------|---------|---------|---------|---------|---------|---------|
'| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
'|-----|---------|---------|---------|---------|---------|---------|---------|---------|
'| | PCINT23 | PCINT22 | PCINT21 | PCINT20 | PCINT19 | PCINT18 | PCINT17 | PCINT16 |
'|-----|---------|---------|---------|---------|---------|---------|---------|---------|
'| |
'| PCMSK1 - регистр маски прерываний PCINT14 - PCINT8 |
'| |
'|-----|---------|---------|---------|---------|---------|---------|---------|---------|
'| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
'|-----|---------|---------|---------|---------|---------|---------|---------|---------|
'| | - | PCINT14 | PCINT13 | PCINT12 | PCINT11 | PCINT10 | PCINT9 | PCINT8 |
'|-----|---------|---------|---------|---------|---------|---------|---------|---------|
'| |
'| PCMSK0 - регистр маски прерываний PCINT7 - PCINT0 |
'| |
'|-----|---------|---------|---------|---------|---------|---------|---------|---------|
'| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
'|-----|---------|---------|---------|---------|---------|---------|---------|---------|
'| | PCINT7 | PCINT6 | PCINT5 | PCINT4 | PCINT3 | PCINT2 | PCINT1 | PCINT0 |
'|-----|---------|---------|---------|---------|---------|---------|---------|---------|
'***************************************************************************************
'-------------------------------------------------------------------------------
'------------------------ Можно так ------------------------------
'-------------------------------------------------------------------------------
Smcr = &B00000001 ' В данном случае выставлено: разрешить спящий режим, Idle
Pcmsk0 = &B00000111 ' В данном случае выставлено: разрешить PCINT0, PCINT1, PCINT2
Eicra = &B00001011 ' В данном случае выставлено: INT1=Falling, INT0=Rising
'-------------------------------------------------------------------------------
'------------ а можно так, выглидит нагляднее, работает, так-же ------------
'-------------------------------------------------------------------------------
Config Int0 = Rising ' Change - прерывание при изменении уровня, Falling - прерывание по нарастанию уровня, Rising - прерывание по спаду уровня, Low Level - низкий уровень
Config Int1 = Falling ' Change - прерывание при изменении уровня, Falling - прерывание по нарастанию уровня, Rising - прерывание по спаду уровня, Low Level - низкий уровень
'-------------------------------------------------------------------------------
On Int0 Обработка_прерывания_int0 Nosave ' Подпрограмма обработки прерывания INT0
On Int1 Обработка_прерывания_int1 Nosave ' Подпрограмма обработки прерывания INT1
On Pcint0 Обработка_прерывания_pcint0 ' Nosave ' Подпрограмма обработки прерывания PCINT0
'-------------------------------------------------------------------------------
Config Pind.2 = Input : Set Pind.2 ' Настройка вывода МК на вход с подтяжкой к плюсовой шине питания, для прерывания INT0
Config Pind.3 = Input : Set Pind.3 ' Настройка вывода МК на вход с подтяжкой к плюсовой шине питания, для прерывания INT1
Config Pinb.0 = Input : Set Pinb.0 ' Настройка вывода МК на вход с подтяжкой к плюсовой шине питания, для прерывания PCINT0
Config Pinb.1 = Input : Set Pinb.1 ' Настройка вывода МК на вход с подтяжкой к плюсовой шине питания, для прерывания PCINT1
Config Pinb.2 = Input : Set Pinb.2 ' Настройка вывода МК на вход с подтяжкой к плюсовой шине питания, для прерывания PCINT2
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
Config Pind.0 = Input ' Конфигурация вывода RxD, приёмник UART
Config Pind.1 = Output ' Конфигурация вывода TxD, передатчик UART
'-------------------------------------------------------------------------------
Config Portd.5 = Output : Reset Portd.5 ' Настройка вывода МК на выход, для наглядности (светодиод или "logicprobe" в протеус)
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'------------------------ Заводим переменные ---------------------------
'-------------------------------------------------------------------------------
Dim Кнопка As Byte
Dim Флаг_rising_pinb_0 As Byte ' Флаг контроля замыкания кнопки PINB.0
Dim Флаг_rising_pinb_1 As Byte ' Флаг контроля замыкания кнопки PINB.1
Dim Флаг_rising_pinb_2 As Byte ' Флаг контроля замыкания кнопки PINB.2
Dim Флаг_falling_pinb_0 As Byte ' Флаг контроля размыкания кнопки PINB.0
Dim Флаг_falling_pinb_1 As Byte ' Флаг контроля размыкания кнопки PINB.1
Dim Флаг_falling_pinb_2 As Byte ' Флаг контроля размыкания кнопки PINB.2
Dim Счетчик_прерываний_int0 As Byte
Dim Счетчик_прерываний_int1 As Byte
Dim Счетчик_прерываний_pinb_0 As Byte
Dim Счетчик_прерываний_pinb_1 As Byte
Dim Счетчик_прерываний_pinb_2 As Byte
Dim Флаг_есть_прерывание_int0 As Byte
Dim Флаг_есть_прерывание_int1 As Byte
Dim Флаг_есть_прерывание_pinb_0 As Byte
Dim Флаг_есть_прерывание_pinb_1 As Byte
Dim Флаг_есть_прерывание_pinb_2 As Byte
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
'------------------- Локально разрешаем прерывания ---------------------
'-------------------------------------------------------------------------------
Enable Int0 ' Разрешаем прерывание INT0
'Или так
Eimsk.0 = 1 ' Разрешаем прерывание INT0
'-------------------------------------------------------------------------------
Enable Int1 ' Разрешаем прерывание INT1
'Или так
Eimsk.1 = 1 ' Разрешаем прерывание INT1
'-------------------------------------------------------------------------------
Enable Pcint0 ' Разрешаем прерывание на PORTB.0 - PORTB.7
'Или так
Pcicr = &B00000001 ' Разрешаем прерывание на PORTB.0 - PORTB.7
'-------------------------------------------------------------------------------
'------------------- Глобально разрешаем прерывания ---------------------
'-------------------------------------------------------------------------------
Enable Interrupts
'Или так
Sreg.7 = 1
'Или так
SEI
'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------
Флаг_falling_pinb_0 = 1
Флаг_falling_pinb_1 = 1
Флаг_falling_pinb_2 = 1
'-------------------------------------------------------------------------------
'*******************************************************************************
'*******************************************************************************
'*******************************************************************************
'*******************************************************************************
'*******************************************************************************
'-------------------------------------------------------------------------------
Do
'-------------------------------------------------------------------------------
Главный_цикл:
nop
'*******************************************************************************
'-------------------------------------------------------------------------------
'-------------- Реакция на прерывание с вывода PIND.2 (INT0) ---------------
'-------------------------------------------------------------------------------
If Флаг_есть_прерывание_int0 <> 0 Then
'-------------------------------------------------------------------------------
'----- Сбрасываем флаг, что было прерывание ---------------------------------
'-------------------------------------------------------------------------------
Флаг_есть_прерывание_int0 = 0
'-------------------------------------------------------------------------------
'----- Запрещаем прерывание INT0 -------------------------------------------
'-------------------------------------------------------------------------------
Disable Int0
'Или так
Eimsk.0 = 0
'-------------------------------------------------------------------------------
'-------- Тут делаем все, что нужно --------------------------------------------
'-------------------------------------------------------------------------------
Toggle Portd.5
Print ""
Print "Прерывание INT0 Atmega88"
Print ""
'-------------------------------------------------------------------------------
'----- Разрешаем прерывание INT0 -------------------------------------------
'-------------------------------------------------------------------------------
Enable Int0
'Или так
Eimsk.0 = 1
'-------------------------------------------------------------------------------
'------- Переходим на метку, для проверки возможного нажатия ---------------
'-------------------------------------------------------------------------------
Goto Главный_цикл
End If
'-------------------------------------------------------------------------------
'*******************************************************************************
'*******************************************************************************
'-------------------------------------------------------------------------------
'-------------- Реакция на прерывание с вывода PIND.3 (INT1) ---------------
'-------------------------------------------------------------------------------
If Флаг_есть_прерывание_int1 <> 0 Then
'-------------------------------------------------------------------------------
'----- Сбрасываем флаг, что было прерывание ---------------------------------
'-------------------------------------------------------------------------------
Флаг_есть_прерывание_int1 = 0
'-------------------------------------------------------------------------------
'----- Запрещаем прерывание INT1 -------------------------------------------
'-------------------------------------------------------------------------------
Disable Int1
'Или так
Eimsk.1 = 0
'-------------------------------------------------------------------------------
'-------- Тут делаем все, что нужно --------------------------------------------
'-------------------------------------------------------------------------------
Toggle Portd.5
Print ""
Print "Прерывание INT1 Atmega88"
Print ""
'-------------------------------------------------------------------------------
'----- Разрешаем прерывание INT1 -------------------------------------------
'-------------------------------------------------------------------------------
Enable Int1
'Или так
Eimsk.1 = 1
'-------------------------------------------------------------------------------
'------- Переходим на метку, для проверки возможного нажатия ---------------
'-------------------------------------------------------------------------------
Goto Главный_цикл
End If
'-------------------------------------------------------------------------------
'*******************************************************************************
'*******************************************************************************
'-------------------------------------------------------------------------------
'---------------- Реакция на прерывание с вывода PINB.0 --------------------
'-------------------------------------------------------------------------------
If Флаг_есть_прерывание_pinb_0 <> 0 Then
'-------------------------------------------------------------------------------
'----- Сбрасываем флаг, что было прерывание ---------------------------------
'-------------------------------------------------------------------------------
Флаг_есть_прерывание_pinb_0 = 0
'-------------------------------------------------------------------------------
'----- Запрещаем прерывание PCINT0 -----------------------------------------
'-------------------------------------------------------------------------------
Disable Pcint0
'Или так
Pcicr.0 = 0
'-------------------------------------------------------------------------------
'-------- Тут делаем все, что нужно --------------------------------------------
'-------------------------------------------------------------------------------
Toggle Portd.5
Print ""
If Кнопка = 1 Then
Print "Нажата PINB.0 Atmega88"
Elseif Кнопка = 2 Then
Print "Отпущена PINB.0 Atmega88"
End If
Print ""
'-------------------------------------------------------------------------------
'----- Разрешаем прерывание PCINT0 -----------------------------------------
'-------------------------------------------------------------------------------
Enable Pcint0
'Или так
Pcicr.0 = 1
'-------------------------------------------------------------------------------
'------- Переходим на метку, для проверки возможного нажатия ---------------
'-------------------------------------------------------------------------------
Goto Главный_цикл
End If
'-------------------------------------------------------------------------------
'*******************************************************************************
'*******************************************************************************
'-------------------------------------------------------------------------------
'---------------- Реакция на прерывание с вывода PINB.1 --------------------
'-------------------------------------------------------------------------------
If Флаг_есть_прерывание_pinb_1 <> 0 Then
'-------------------------------------------------------------------------------
'----- Сбрасываем флаг, что было прерывание ---------------------------------
'-------------------------------------------------------------------------------
Флаг_есть_прерывание_pinb_1 = 0
'-------------------------------------------------------------------------------
'----- Запрещаем прерывание PCINT0 -----------------------------------------
'-------------------------------------------------------------------------------
Disable Pcint0
'Или так
Pcicr.0 = 0
'-------------------------------------------------------------------------------
'-------- Тут делаем все, что нужно --------------------------------------------
'-------------------------------------------------------------------------------
Toggle Portd.5
Print ""
If Кнопка = 3 Then
Print "Нажата PINB.1 Atmega88"
Elseif Кнопка = 4 Then
Print "Отпущена PINB.1 Atmega88"
End If
Print ""
'-------------------------------------------------------------------------------
'----- Разрешаем прерывание PCINT0 -----------------------------------------
'-------------------------------------------------------------------------------
Enable Pcint0
'Или так
Pcicr.0 = 1
'-------------------------------------------------------------------------------
'------- Переходим на метку, для проверки возможного нажатия ---------------
'-------------------------------------------------------------------------------
Goto Главный_цикл
End If
'-------------------------------------------------------------------------------
'*******************************************************************************
'*******************************************************************************
'-------------------------------------------------------------------------------
'---------------- Реакция на прерывание с вывода PINB.2 --------------------
'-------------------------------------------------------------------------------
If Флаг_есть_прерывание_pinb_2 <> 0 Then
'-------------------------------------------------------------------------------
'----- Сбрасываем флаг, что было прерывание ---------------------------------
'-------------------------------------------------------------------------------
Флаг_есть_прерывание_pinb_2 = 0
'-------------------------------------------------------------------------------
'----- Запрещаем прерывание PCINT0 -----------------------------------------
'-------------------------------------------------------------------------------
Disable Pcint0
'Или так
Pcicr.0 = 0
'-------------------------------------------------------------------------------
'-------- Тут делаем все, что нужно --------------------------------------------
'-------------------------------------------------------------------------------
Toggle Portd.5
Print ""
If Кнопка = 5 Then
Print "Нажата PINB.2 Atmega88"
Elseif Кнопка = 6 Then
Print "Отпущена PINB.2 Atmega88"
End If
Print ""
'-------------------------------------------------------------------------------
'----- Разрешаем прерывание PCINT0 -----------------------------------------
'-------------------------------------------------------------------------------
Enable Pcint0
'Или так
Pcicr.0 = 1
'-------------------------------------------------------------------------------
'------- Переходим на метку, для проверки возможного нажатия ---------------
'-------------------------------------------------------------------------------
Goto Главный_цикл
End If
'-------------------------------------------------------------------------------
'*******************************************************************************
'*******************************************************************************
'-------------------------------------------------------------------------------
'-------------------- Если ничего не делаем, засыпаем ----------------------
'-------------------------------------------------------------------------------
SLEEP ' Необходимо настроить соответствующие регистры (смотреть таблицу "Конфигурация режима пониженого энергпотребления" или тех.документацию на контроллер (datasheet))
' 'Или используем более наглядный вариант
'-------------------------------------------------------------------------------
' Idle ' Спим
'-------------------------------------------------------------------------------
' Power Adcnoise ' Спим для уменьшения шума АЦП, просыпаемся при появлении результата преобразования
'-------------------------------------------------------------------------------
' Powersave ' Крепко спим, просыпаемся только при Config int = Low Level
'-------------------------------------------------------------------------------
' Power Standby ' Очень крепко спим, просыпаемся только при Config int = Low Level и наличии внешнего кварца
'-------------------------------------------------------------------------------
' Powerdown ' Почти померли, потребление минимально, если правильно заснули (т.е. все выключили), просыпаемся только при Config int = Low Level или PCINT0...2
'-------------------------------------------------------------------------------
'*******************************************************************************
'*******************************************************************************
'-------------------------------------------------------------------------------
' Как только будет прерывание, просыпаемся и идем смотреть, что там случилось
'-------------------------------------------------------------------------------
Goto Главный_цикл
'-------------------------------------------------------------------------------
Loop : End
'-------------------------------------------------------------------------------
'*******************************************************************************
'*******************************************************************************
'*******************************************************************************
'*******************************************************************************
'*******************************************************************************
'*******************************************************************************
'-------------------------------------------------------------------------------
Обработка_прерывания_int0:
nop
push r24
Флаг_есть_прерывание_int0 = 1
pop r24
nop
Return
'-------------------------------------------------------------------------------
'*******************************************************************************
'*******************************************************************************
'-------------------------------------------------------------------------------
' Обработка_прерывания_int0:
' $asm
' Push R31 'сохраним регистры
' In R31 , Sreg
' Push R31
' '----------------
' Ldi R31 , 1
' Sts {флаг_есть_прерывание_int0} , R31
' '----------------
' ldi R31 , {Счетчик_прерываний_int0}
' inc R31
' sts {Счетчик_прерываний_int0} , R31
' '----------------
' Pop R31
' Out Sreg , R31 'восстановим регистры
' Pop R31
' $end Asm
'-------------------------------------------------------------------------------
'*******************************************************************************
'*******************************************************************************
'-------------------------------------------------------------------------------
' Обработка_прерывания_int1:
' push r24
' Флаг_есть_прерывание_int1 = 1
' pop r24
' Return
'-------------------------------------------------------------------------------
'*******************************************************************************
'*******************************************************************************
'-------------------------------------------------------------------------------
Обработка_прерывания_int1:
nop
$asm
Push R31 'сохраним регистры
In R31 , Sreg
Push R31
'----------------
Ldi R31 , 1
Sts {флаг_есть_прерывание_int1} , R31
'----------------
' ldi R31 , {Счетчик_прерываний_int1}
' inc R31
' sts {Счетчик_прерываний_int1} , R31
'----------------
Pop R31
Out Sreg , R31 'восстановим регистры
Pop R31
$end Asm
nop
Return
'-------------------------------------------------------------------------------
'*******************************************************************************
'*******************************************************************************
'-------------------------------------------------------------------------------
Обработка_прерывания_pcint0:
' Время обработки нажатия 43 мкс до 139 мкс
' Время обработки отпускания от 67 мкс до 163 мкс
'-------------------------------------------------------------------------------
nop
Do
Кнопка = 0 ' Время обработки 3 мкс
'-------------------------------------------------------------------------------
'----------------- Обработка нажатия кнопки с вывода PINB.0 ----------------
'-------------------------------------------------------------------------------
If Pinb.0 = 0 And Флаг_falling_pinb_0 = 1 Then ' Время обработки 22 мкс ' Если есть нажатие кнопки PINB.0, и было отпускание кнопки PINB.0
Кнопка = 1 ' Время обработки 3 мкс
Флаг_rising_pinb_0 = 1 ' Время обработки 3 мкс ' Ставим флаг, что было нажатие PINB.0
Флаг_falling_pinb_0 = 0 ' Время обработки 3 мкс ' Сбрасываем флаг, что было отпускание PINB.0
Флаг_есть_прерывание_pinb_0 = 1 ' Время обработки 3 мкс ' Ставим флаг, что есть необработанное прерывание PINB.0 ' Время обработки нажатия 43 мкс
Goto Выход_прерывание_pcint0 ' Время обработки 3 мкс ' Переход на метку выхода из прерывания ' Время обработки нажатия 43 мкс
End If
'-------------------------------------------------------------------------------
'--------------- Обработка отпускания кнопки с вывода PINB.0 ---------------
'-------------------------------------------------------------------------------
If Pinb.0 = 1 And Флаг_rising_pinb_0 = 1 Then ' Если есть отпускание кнопки PINB.0, и было нажатие кнопки PINB.0
Кнопка = 2
Флаг_rising_pinb_0 = 0 ' Сбрасываем флаг, что было нажатие PINB.0
Флаг_falling_pinb_0 = 1 ' Ставим флаг, что было отпускание PINB.0
Флаг_есть_прерывание_pinb_0 = 1 ' Ставим флаг, что есть необработанное прерывание PINB.0
Goto Выход_прерывание_pcint0 ' ' Переход на метку выхода из прерывания
End If
'-------------------------------------------------------------------------------
'----------------- Обработка нажатия кнопки с вывода PINB.1 ----------------
'-------------------------------------------------------------------------------
If Pinb.1 = 0 And Флаг_falling_pinb_1 = 1 Then ' Если есть нажатие кнопки PINB.1, и было отпускание кнопки PINB.1
Кнопка = 3
Флаг_rising_pinb_1 = 1 ' Ставим флаг, что было нажатие PINB.1
Флаг_falling_pinb_1 = 0 ' Сбрасываем флаг, что было отпускание PINB.1
Флаг_есть_прерывание_pinb_1 = 1 ' Ставим флаг, что есть необработанное прерывание PINB.1
Goto Выход_прерывание_pcint0 ' Переход на метку выхода из прерывания
End If
'-------------------------------------------------------------------------------
'--------------- Обработка отпускания кнопки с вывода PINB.1 ---------------
'-------------------------------------------------------------------------------
If Pinb.1 = 1 And Флаг_rising_pinb_1 = 1 Then ' Если есть отпускание кнопки PINB.1, и было нажатие кнопки PINB.1
Кнопка = 4
Флаг_rising_pinb_1 = 0 ' Сбрасываем флаг, что было нажатие PINB.1
Флаг_falling_pinb_1 = 1 ' Ставим флаг, что было отпускание PINB.1
Флаг_есть_прерывание_pinb_1 = 1 ' Ставим флаг, что есть необработанное прерывание PINB.1
Goto Выход_прерывание_pcint0 ' Переход на метку выхода из прерывания
End If
'-------------------------------------------------------------------------------
'----------------- Обработка нажатия кнопки с вывода PINB.2 ----------------
'-------------------------------------------------------------------------------
If Pinb.2 = 0 And Флаг_falling_pinb_2 = 1 Then ' Если есть нажатие кнопки PINB.2, и было отпускание кнопки PINB.2
Кнопка = 5
Флаг_rising_pinb_2 = 1 ' Ставим флаг, что было нажатие PINB.2
Флаг_falling_pinb_2 = 0 ' Сбрасываем флаг, что было отпускание PINB.2
Флаг_есть_прерывание_pinb_2 = 1 ' Ставим флаг, что есть необработанное прерывание PINB.2
Goto Выход_прерывание_pcint0 ' Переход на метку выхода из прерывания
End If
'-------------------------------------------------------------------------------
'--------------- Обработка отпускания кнопки с вывода PINB.2 ---------------
'-------------------------------------------------------------------------------
If Pinb.2 = 1 And Флаг_rising_pinb_2 = 1 Then ' Если есть отпускание кнопки PINB.2, и было нажатие кнопки PINB.2
Кнопка = 6
Флаг_rising_pinb_2 = 0 ' Сбрасываем флаг, что было нажатие PINB.2
Флаг_falling_pinb_2 = 1 ' Ставим флаг, что было отпускание PINB.2
Флаг_есть_прерывание_pinb_2 = 1 ' Ставим флаг, что есть необработанное прерывание PINB.2
Goto Выход_прерывание_pcint0 ' Переход на метку выхода из прерывания
End If
'-------------------------------------------------------------------------------
'----------------- Выходим если что-то нажато, или отпущено ----------------
'-------------------------------------------------------------------------------
Loop Until Кнопка <> 0 ' Если дребезг помешал определить состояние кнопки, повторяем
'-------------------------------------------------------------------------------
'-------------------- Выходим из обработки прерывания ----------------------
'-------------------------------------------------------------------------------
Выход_прерывание_pcint0:
'-------------------------------------------------------------------------------
'------ Cброс флага "Есть необработаное прерывание" прерывания PCINT0 ------
'-------------------------------------------------------------------------------
Pcifr = 1 ' Время обработки 2 мкс
'-------------------------------------------------------------------------------
'------------------ Возвращаемся на место, где прервались ------------------
'-------------------------------------------------------------------------------
nop ' Время обработки 1 мкс
Return
'-------------------------------------------------------------------------------
'*******************************************************************************