Pcmsk0 = &B00000111 ' В данном случае выставлено: разрешить PCINT0, PCINT1, PCINT2 Eicra = &B00000011 ' В данном случае выставлено: INT1=Falling, INT0=Rising
'------------------------------------------------------------------------------- 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 '------------------------------------------------------------------------------- '******************************************************************************* '------------------------------------------------------------------------------- '------------------------ Заводим переменные --------------------------- '------------------------------------------------------------------------------- Dim Кнопка As Byte Dim Флаг_есть_прерывание_int0 As Byte
Dim Флаг_есть_прерывание_pinb_0 As Byte Dim Флаг_есть_прерывание_pinb_1 As Byte Dim Флаг_есть_прерывание_pinb_2 As Byte '------------------------------------------------------------------------------- '******************************************************************************* '------------------------------------------------------------------------------- '------------------- Локально разрешаем прерывания --------------------- '------------------------------------------------------------------------------- Enable Int0 ' Разрешаем прерывание INT0 '------------------------------------------------------------------------------- Enable Pcint0 ' Разрешаем прерывание на PORTB.0 - PORTB.7 'Или так 'Pcicr = &B00000001 ' Разрешаем прерывание на PORTB.0 - PORTB.7 '------------------------------------------------------------------------------- '------------------- Глобально разрешаем прерывания --------------------- '------------------------------------------------------------------------------- Enable Interrupts 'Или так 'Sreg.7 = 1 'Или так 'SEI '------------------------------------------------------------------------------- '*******************************************************************************
Dim Temptotal As Byte Dim Total As Long Dim Итого As Long Dim Скорость As Word 'Dim Flag As Bit Dim Contdata As Eram Long
Do '------------------------------------------------------------------------------- Главный_цикл:
nop
'******************************************************************************* '------------------------------------------------------------------------------- '-------------- Реакция на прерывание с вывода PIND.2 (INT0) --------------- '------------------------------------------------------------------------------- If Флаг_есть_прерывание_int0 <> 0 Then '------------------------------------------------------------------------------- '----- Сбрасываем флаг, что было прерывание --------------------------------- '------------------------------------------------------------------------------- Флаг_есть_прерывание_int0 = 0 Total = Total + Колесо Итого = Итого + Колесо Temptotal = Temptotal + Колесо End If '------------------------------------------------------------------------------- '----- Запрещаем прерывание INT0 ------------------------------------------- '------------------------------------------------------------------------------- Disable Interrupts 'Или так 'Eimsk.0 = 0 '------------------------------------------------------------------------------- '-------- Тут делаем все, что нужно -------------------------------------------- '------------------------------------------------------------------------------- 'Toggle Portd.5 Locate 2 , 5 Lcd "km/h" Locate 2 , 3 If Скорость < 10 Then Lcd Скорость ; " " If Скорость > 9 Then Lcd Скорость Locate 1 , 1 Lcd Total ; "m" '------------------------------------------------------------------------------- '----- Разрешаем прерывание INT0 ------------------------------------------- '------------------------------------------------------------------------------- Enable Interrupts 'Или так 'Eimsk.0 = 1 '------------------------------------------------------------------------------- '------- Переходим на метку, для проверки возможного нажатия --------------- '------------------------------------------------------------------------------- Goto Главный_цикл
'******************************************************************************* '------------------------------------------------------------------------------- '---------------- Реакция на прерывание с вывода PINB.0 -------------------- '------------------------------------------------------------------------------- If Флаг_есть_прерывание_pinb_0 <> 0 Then '------------------------------------------------------------------------------- '----- Сбрасываем флаг, что было прерывание --------------------------------- '------------------------------------------------------------------------------- Флаг_есть_прерывание_pinb_0 = 0 '------------------------------------------------------------------------------- '----- Запрещаем прерывание PCINT0 ----------------------------------------- '------------------------------------------------------------------------------- Disable Interrupts 'Или так 'Pcicr.0 = 0 '------------------------------------------------------------------------------- '-------- Тут делаем все, что нужно -------------------------------------------- '-------------------------------------------------------------------------------
Скорость_: Скорость = 0 Скорость = Temptotal Temptotal = 0 Скорость = Скорость * 7.2 Return
Обработка_прерывания_int0: nop push r24 Флаг_есть_прерывание_int0 = 1 pop r24 nop
Return '******************************************************************************* '------------------------------------------------------------------------------- Обработка_прерывания_pcint0: ' Время обработки нажатия 43 мкс до 139 мкс ' Время обработки отпускания от 67 мкс до 163 мкс '------------------------------------------------------------------------------- nop
Do Кнопка = 0 '------------------------------------------------------------------------------- '----------------- Обработка нажатия кнопки с вывода PINB.0 ---------------- '------------------------------------------------------------------------------- If Pinb.0 = 0 Then ' Время обработки 22 мкс ' Если есть нажатие кнопки PINB.0, и было отпускание кнопки PINB.0 Флаг_есть_прерывание_pinb_0 = 1 ' Время обработки 3 мкс ' Ставим флаг, что есть необработанное прерывание PINB.0 ' Время обработки нажатия 43 мкс Кнопка = 1 Goto Выход_прерывание_pcint0 ' Время обработки 3 мкс ' Переход на метку выхода из прерывания ' Время обработки нажатия 43 мкс
End If '------------------------------------------------------------------------------- '----------------- Обработка нажатия кнопки с вывода PINB.1 ---------------- '------------------------------------------------------------------------------- If Pinb.1 = 0 Then ' Если есть нажатие кнопки PINB.1, и было отпускание кнопки PINB.1 Флаг_есть_прерывание_pinb_1 = 1 ' Ставим флаг, что есть необработанное прерывание PINB.1 Кнопка = 2 Goto Выход_прерывание_pcint0 ' Переход на метку выхода из прерывания
End If '------------------------------------------------------------------------------- '----------------- Обработка нажатия кнопки с вывода PINB.2 ---------------- '------------------------------------------------------------------------------- If Pinb.2 = 0 Then ' Если есть нажатие кнопки PINB.2, и было отпускание кнопки PINB.2 Флаг_есть_прерывание_pinb_2 = 1 ' Ставим флаг, что есть необработанное прерывание PINB.2 Кнопка = 3 Goto Выход_прерывание_pcint0 ' Переход на метку выхода из прерывания
End If '------------------------------------------------------------------------------- '----------------- Выходим если что-то нажато, или отпущено ---------------- '------------------------------------------------------------------------------- Loop Until Кнопка <> 0 ' Если дребезг помешал определить состояние кнопки, повторяем '------------------------------------------------------------------------------- '-------------------- Выходим из обработки прерывания ---------------------- '------------------------------------------------------------------------------- Выход_прерывание_pcint0: '------------------------------------------------------------------------------- '------ Cброс флага "Есть необработаное прерывание" прерывания PCINT0 ------ '------------------------------------------------------------------------------- Pcifr = 1 ' Время обработки 2 мкс '------------------------------------------------------------------------------- '------------------ Возвращаемся на место, где прервались ------------------ '------------------------------------------------------------------------------- nop ' Время обработки 1 мкс
Дата: Понедельник, 15.07.2013, 22:30 | Сообщение # 3
Группа: Проверенные
Сообщений: 247
Статус: Offline
301992, ОН, баском, выдает ошибку 61. Смотри: Главный_цикл!!на лсди нечего выводить. стр.71 DimСкорость As Word ????
Опиши, что хотел сделать, хоть коменты добавь, непонятно. Dim Temptotal As Byte Dim Total As Long Dim Итого As Long Dim Скорость As String 'Dim Flag As Bit Dim Contdata As Eram Long
Disable Interrupts 'Или так 'Eimsk.0 = 0 '------------------------------------------------------------------------------- '-------- Выводи скорость и путь -------------------------------------------- '------------------------------------------------------------------------------- 'Toggle Portd.5 Locate 2 , 5 Lcd "km/h" Locate 2 , 3 If Скорость < 10 Then Lcd Скорость ; " " If Скорость > 9 Then Lcd Скорость Locate 1 , 1 Lcd Путь ; "m" '------------------------------------------------------------------------------- '----- Разрешаем прерывание INT0 ------------------------------------------- '------------------------------------------------------------------------------- Enable Interrupts
Pcmsk0 = &B00000111 ' В данном случае выставлено: разрешить PCINT0, PCINT1, PCINT2 Eicra = &B00000011 ' В данном случае выставлено: INT1=Falling, INT0=Rising
'------------------------------------------------------------------------------- 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 '------------------------------------------------------------------------------- '******************************************************************************* '------------------------------------------------------------------------------- '------------------------ Заводим переменные --------------------------- '------------------------------------------------------------------------------- Dim Кнопка As Byte Dim Флаг_есть_прерывание_int0 As Byte
Dim Флаг_есть_прерывание_pinb_0 As Byte Dim Флаг_есть_прерывание_pinb_1 As Byte Dim Флаг_есть_прерывание_pinb_2 As Byte '------------------------------------------------------------------------------- '******************************************************************************* '------------------------------------------------------------------------------- '------------------- Локально разрешаем прерывания --------------------- '------------------------------------------------------------------------------- Enable Int0 ' Разрешаем прерывание INT0 '------------------------------------------------------------------------------- Enable Pcint0 ' Разрешаем прерывание на PORTB.0 - PORTB.7 'Или так 'Pcicr = &B00000001 ' Разрешаем прерывание на PORTB.0 - PORTB.7 '------------------------------------------------------------------------------- '------------------- Глобально разрешаем прерывания --------------------- '------------------------------------------------------------------------------- Enable Interrupts 'Или так 'Sreg.7 = 1 'Или так 'SEI '------------------------------------------------------------------------------- '*******************************************************************************
Dim Temptotal As Byte Dim Путь As Long Dim Итого As Long Dim Скорость As Integer 'Dim Flag As Bit Dim Contdata As Eram Long
Do '------------------------------------------------------------------------------- Главный_цикл:
nop
'******************************************************************************* '------------------------------------------------------------------------------- '-------------- Реакция на прерывание с вывода PIND.2 (INT0) --------------- '------------------------------------------------------------------------------- If Флаг_есть_прерывание_int0 <> 0 Then '------------------------------------------------------------------------------- '----- Сбрасываем флаг, что было прерывание --------------------------------- '------------------------------------------------------------------------------- Флаг_есть_прерывание_int0 = 0 Путь = Путь + Колесо Итого = Итого + Колесо Temptotal = Temptotal + Колесо End If
Gosub Lcd_
'------------------------------------------------------------------------------- '------- Переходим на метку, для проверки возможного нажатия --------------- '------------------------------------------------------------------------------- Goto Главный_цикл
'******************************************************************************* '------------------------------------------------------------------------------- '---------------- Реакция на прерывание с вывода PINB.0 -------------------- '------------------------------------------------------------------------------- If Флаг_есть_прерывание_pinb_0 <> 0 Then '------------------------------------------------------------------------------- '----- Сбрасываем флаг, что было прерывание --------------------------------- '------------------------------------------------------------------------------- Флаг_есть_прерывание_pinb_0 = 0 '------------------------------------------------------------------------------- '----- Запрещаем прерывание PCINT0 ----------------------------------------- '------------------------------------------------------------------------------- Disable Interrupts 'Или так 'Pcicr.0 = 0 '------------------------------------------------------------------------------- '-------- Тут делаем все, что нужно -------------------------------------------- '-------------------------------------------------------------------------------
'******************************************************************************* '------------------------------------------------------------------------------- '---------------- Реакция на прерывание с вывода PINB.1 -------------------- '------------------------------------------------------------------------------- If Флаг_есть_прерывание_pinb_1 <> 0 Then '------------------------------------------------------------------------------- '----- Сбрасываем флаг, что было прерывание --------------------------------- '------------------------------------------------------------------------------- Флаг_есть_прерывание_pinb_1 = 0 '------------------------------------------------------------------------------- '----- Запрещаем прерывание PCINT0 ----------------------------------------- '------------------------------------------------------------------------------- Disable Interrupts 'Или так 'Pcicr.0 = 0 '------------------------------------------------------------------------------- '-------- Тут делаем все, что нужно -------------------------------------------- '------------------------------------------------------------------------------- Cls Lcd "All:" ; Итого ; "m Saved!" Sound Portd.5 , 500 , 100 Contdata = Итого Waitms 2 Cls '------------------------------------------------------------------------------- '----- Разрешаем прерывание PCINT0 ----------------------------------------- '------------------------------------------------------------------------------- Enable Interrupts 'Или так 'Pcicr.0 = 1 '------------------------------------------------------------------------------- '------- Переходим на метку, для проверки возможного нажатия --------------- '------------------------------------------------------------------------------- Goto Главный_цикл End If '------------------------------------------------------------------------------- '*******************************************************************************
'******************************************************************************* '------------------------------------------------------------------------------- '---------------- Реакция на прерывание с вывода PINB.2 -------------------- '------------------------------------------------------------------------------- If Флаг_есть_прерывание_pinb_2 <> 0 Then '------------------------------------------------------------------------------- '----- Сбрасываем флаг, что было прерывание --------------------------------- '------------------------------------------------------------------------------- Флаг_есть_прерывание_pinb_2 = 0 '------------------------------------------------------------------------------- '----- Запрещаем прерывание PCINT0 ----------------------------------------- '------------------------------------------------------------------------------- Disable Interrupts 'Или так 'Pcicr.0 = 0 '------------------------------------------------------------------------------- '-------- Тут делаем все, что нужно -------------------------------------------- '------------------------------------------------------------------------------- Cls Lcd "Total clear!" Sound Portd.5 , 500 , 250 Waitms 1 Путь = 0 Cls '------------------------------------------------------------------------------- '----- Разрешаем прерывание PCINT0 ----------------------------------------- '------------------------------------------------------------------------------- Enable Interrupts 'Или так 'Pcicr.0 = 1 '------------------------------------------------------------------------------- '------- Переходим на метку, для проверки возможного нажатия --------------- '------------------------------------------------------------------------------- Goto Главный_цикл End If '------------------------------------------------------------------------------- '******************************************************************************* Goto Главный_цикл '------------------------------------------------------------------------------- Loop : End '------------------------------------------------------------------------------- '******************************************************************************* '******************************************************************************* '******************************************************************************* '******************************************************************************* '*******************************************************************************
'******************************************************************************* Lcd_: '------------------------------------------------------------------------------- '----- Запрещаем прерывание INT0 ------------------------------------------- '------------------------------------------------------------------------------- Disable Interrupts 'Или так 'Eimsk.0 = 0 '------------------------------------------------------------------------------- '-------- Выводи скорость и путь -------------------------------------------- '------------------------------------------------------------------------------- 'Toggle Portd.5 Locate 2 , 5 Lcd "km/h" Locate 2 , 3 If Скорость < 10 Then Lcd Скорость ; " " If Скорость > 9 Then Lcd Скорость Locate 1 , 1 Lcd Путь ; "m" '------------------------------------------------------------------------------- '----- Разрешаем прерывание INT0 ------------------------------------------- '------------------------------------------------------------------------------- Enable Interrupts 'Или так 'Eimsk.0 = 1 Return
Скорость_: Скорость = 0 Скорость = Temptotal Temptotal = 0 Скорость = Скорость * 7.2 Return
Обработка_прерывания_int0: nop push r24 Флаг_есть_прерывание_int0 = 1 pop r24 nop
Return '******************************************************************************* '------------------------------------------------------------------------------- Обработка_прерывания_pcint0: ' Время обработки нажатия 43 мкс до 139 мкс ' Время обработки отпускания от 67 мкс до 163 мкс '------------------------------------------------------------------------------- nop
Do Кнопка = 0 '------------------------------------------------------------------------------- '----------------- Обработка нажатия кнопки с вывода PINB.0 ---------------- '------------------------------------------------------------------------------- If Pinb.0 = 0 Then ' Время обработки 22 мкс ' Если есть нажатие кнопки PINB.0, и было отпускание кнопки PINB.0 Флаг_есть_прерывание_pinb_0 = 1 ' Время обработки 3 мкс ' Ставим флаг, что есть необработанное прерывание PINB.0 ' Время обработки нажатия 43 мкс Кнопка = 1 Goto Выход_прерывание_pcint0 ' Время обработки 3 мкс ' Переход на метку выхода из прерывания ' Время обработки нажатия 43 мкс
End If '------------------------------------------------------------------------------- '----------------- Обработка нажатия кнопки с вывода PINB.1 ---------------- '------------------------------------------------------------------------------- If Pinb.1 = 0 Then ' Если есть нажатие кнопки PINB.1, и было отпускание кнопки PINB.1 Флаг_есть_прерывание_pinb_1 = 1 ' Ставим флаг, что есть необработанное прерывание PINB.1 Кнопка = 2 Goto Выход_прерывание_pcint0 ' Переход на метку выхода из прерывания
End If '------------------------------------------------------------------------------- '----------------- Обработка нажатия кнопки с вывода PINB.2 ---------------- '------------------------------------------------------------------------------- If Pinb.2 = 0 Then ' Если есть нажатие кнопки PINB.2, и было отпускание кнопки PINB.2 Флаг_есть_прерывание_pinb_2 = 1 ' Ставим флаг, что есть необработанное прерывание PINB.2 Кнопка = 3 Goto Выход_прерывание_pcint0 ' Переход на метку выхода из прерывания
End If '------------------------------------------------------------------------------- '----------------- Выходим если что-то нажато, или отпущено ---------------- '------------------------------------------------------------------------------- Loop Until Кнопка <> 0 ' Если дребезг помешал определить состояние кнопки, повторяем '------------------------------------------------------------------------------- '-------------------- Выходим из обработки прерывания ---------------------- '------------------------------------------------------------------------------- Выход_прерывание_pcint0: '------------------------------------------------------------------------------- '------ Cброс флага "Есть необработаное прерывание" прерывания PCINT0 ------ '------------------------------------------------------------------------------- Pcifr = 1 ' Время обработки 2 мкс '------------------------------------------------------------------------------- '------------------ Возвращаемся на место, где прервались ------------------ '------------------------------------------------------------------------------- nop ' Время обработки 1 мкс
Return
Сообщение отредактировал 301992 - Среда, 17.07.2013, 20:38
Опиши, что хотел сделать, хоть коменты добавь, непонятно.
это простой велокомп. просто на нем тестирую прерывания PCINT.
на int0 висит геркон. при срабатывании этого прерывания ставим флаг, что прерывание есть, и в главнном цыкле считаем прйденный путь и выводим информацию на экран.
от таймера расчитывается скорость и тоже выводится на экран.
на pcint висят кнопки меню.
Хочу обкатать этот код с обычным индикатором, а потом впихать его в другой велокомп и экраном от сименса.
'Pcmsk0 = &B00000111 ' В данном случае выставлено: разрешить PCINT0, PCINT1, PCINT2 'Eicra = &B00000011 ' В данном случае выставлено: INT1=Falling, INT0=Rising Config Int0 = Rising '------------------------------------------------------------------------------- On Int0 _int0 Nosave ' Подпрограмма обработки прерывания INT0 '------------------------------------------------------------------------------- Config Pind.2 = Input : Set Pind.2 ' Настройка вывода МК на вход с подтяжкой к плюсовой шине питания, для прерывания INT0 '------------------------------------------------------------------------------- '******************************************************************************* '------------------------------------------------------------------------------- '------------------------ Заводим переменные --------------------------- '------------------------------------------------------------------------------- Dim Temptotal As Byte Dim Путь As Long Dim Итого As Long Dim Скорость As Integer 'Dim Flag As Bit Dim Contdata As Eram Long '******************************************************************************* '------------------------------------------------------------------------------- '------------------- Локально разрешаем прерывания --------------------- '------------------------------------------------------------------------------- Enable Int0 ' Разрешаем прерывание INT0 '------------------------------------------------------------------------------- Enable Pcint0 ' Разрешаем прерывание на PORTB.0 - PORTB.7 '------------------------------------------------------------------------------- '------------------- Глобально разрешаем прерывания --------------------- '------------------------------------------------------------------------------- Enable Interrupts '*******************************************************************************
Раньше понимал. Проблему решил, но много вопросов. Раньше выводилось на LCD значение и Byte, long, word и другие. То сейчас приходиться писать лишние строки, для перевода значений в значение String и только потом выводить. Как это решается, аедь раньше что сунеш, то и выведет на экран.