Прерывание по таймеру 16F84A - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Прерывание по таймеру 16F84A (Помогите разобратся почему не работает прерывание)
Прерывание по таймеру 16F84A
buller Дата: Пт, 07.10.2011, 10:00  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 10
Репутация: 0   ±
Замечания:   ±
На сайте с 07.10.2011

Статус: Offline

Не происходит прерывание. Уже не знаю что делать. Вроде все делал как написано в книжке.
Я только начинаю работать с ПИК і протоном. Поетому иногда нужен чей нибудь совет.

P.S. Еще вопрос как при отладке в протеусе можно сделать так чтоб в окне PIC CPU Variables виводились переменные
Прикрепления: My_Int.rar(15Kb)

Сообщение отредактировал buller - Пт, 07.10.2011, 10:05
ЯНДЕКС Дата: 07.10.2011
MasterPic Дата: Пт, 07.10.2011, 16:49  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 196
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

Не надо пользоваться Disable - resume - Enable - это какая-то непонятная хрень на программном уровне. Нужно писать так:
Code


'-------------------------- Описание проекта ---------------------------------
'Проект :  My_Int                        
                    
'Автор :                    
'                    
'Версия : 1.0.0 от 06.10.2011   
'                    
'-------------------------- Опции компилятора --------------------------------
                    
DECLARE  SHOW_SYSTEM_VARIABLES = ON   ' При симуляции в Proteus показать внутренние переменные
DECLARE  FSR_CONTEXT_SAVE = OFF   ' Не заботиться о сохранении содержимого регистра FSR
DECLARE  REMINDERS = OFF    ' Выключить напоминания компилятора  
DECLARE  WARNINGS = OFF   ' Выключить предупреждения компилятора  
DECLARE  OPTIMISER_LEVEL 0    ' Выключить оптимизацию программы  
                    
;-------------------------- Общие настройки------------------------------------
                    
DEVICE = 16F84A   ' Используемый микроконтроллер
XTAL = 10   ' Частота осциллятора  10 МГц
                    
'-------------------------- Конфигурация программирования --------------------
                    
CONFIG  CP_OFF, PWRTE_ON, WDT_OFF, HS_OSC  
                    
'-------------------------- Настройки для клавиатуры --------------------------
                    
DECLARE   KEYPAD_PORT   PORTA    ' Порт для матрицы клавиш
                    
'-------------------------- Настройки портов ---------------------------------
                    
PORTB_PULLUPS = ON   ' Включить подтягивающие резисторы на PORTB
DECLARE  ALL_DIGITAL = ON   ' Установить все порты цифровыми входами/выходами
                    
'-------------------------- Регистры специального назначения-------------------
                    
'-------------------------- OPTION_REG ----------------------------------------
                    
SYMBOL PS0 = OPTION_REG.0      ' Бит установки предделителя TMR0
SYMBOL PS1 = OPTION_REG.1      ' Бит установки предделителя TMR0
SYMBOL PS2 = OPTION_REG.2      ' Бит установки предделителя TMR0
SYMBOL PSA = OPTION_REG.3      ' Выбор включения предделителя
SYMBOL T0SE = OPTION_REG.4     ' Выбор фронта приращения TMR0 при внешнем тактовом сигнале
SYMBOL T0CS = OPTION_REG.5     ' Выбор тактового сигнала для TMR0  
SYMBOL INTEDG = OPTION_REG.6   ' Выбор активного фронта сигнала на входе внешнего прерывания INT
SYMBOL NOT_RBPU = OPTION_REG.7 ' Включение подтягивающих резисторов на PORTB
                    
'-------------------------- INTCON --------------------------------------------
                    
SYMBOL RBIF = INTCON.0 ' Флаг внешнего прерывания по PORTB.4-PORTB.7
SYMBOL INTF = INTCON.1 ' Флаг внешнего прерывания по PORTB.0(INT)
SYMBOL T0IF = INTCON.2 ' Флаг переполнения TMR0
SYMBOL RBIE = INTCON.3 ' Бит разрешения прерывания по PORTB.4-PORTB.7
SYMBOL INTE = INTCON.4 ' Бит разрешения прерывания по PORTB.0(INT)  
SYMBOL T0IE = INTCON.5 ' Бит разрешения прерывания по переполнению TMR0
SYMBOL PEIE = INTCON.6 ' Бит разрешения прерывания от периферийных устройств
SYMBOL GIE = INTCON.7  ' Бит глобального разрешения прерываний

                    
'-------------------------- Определение символов -----------------------------
                    
SYMBOL   B0 = PORTB.2
                    
'-------------------------- Начало -------------------------------------------
                    
'-------------------------- Настройка TMR0 для прерываний --------------------
OPTION_REG = %00000111
TMR0 = $00' Значение регистра TMR0
T0IE = 1   ' Разрешение прерывания при переполнении TMR0 с частотой 76,293945 Гц
                    
GIE = 1    ' Разрешение глобального прерывания
TRISB=0
PORTB=0                    
ON_INTERRUPT GOTO  Int_Label
GOTO  MainProgram
                    
'-------------------------- Прерывания--------------------------                    
Int_Label:
CONTEXT SAVE
  IF T0IF = 1 THEN
     T0IF = 0
  ENDIF
B0=1
DELAYMS 100
B0=0

DELAYMS 100

CONTEXT RESTORE
                    
               ' Возврат из обработчика прерывания
                    
'-------------------------- Главная программа -------------------------
                    
MainProgram:
PORTB.1=1
DELAYMS 100                    
PORTB.1=0                    
DELAYMS 100                    
GOTO  MainProgram   ' Возврат на начало основной программы
   


Потом - очень дурной тон использовать задержки в прерывании.
В прерывании нужно находиться как можно меньше времени - поставил флаг - вышел - в программе проверил, флаг стоит - выполняем действия(задержки и.т.д)
Директивами Context Save и Context Restore мы даем команду компилятору автоматически сохранить значения системных регистров - аккумулятора и Status, чтобы при выходе из пп прерывания не потерять контекст прерванной программы, а также корректно выйти из пп прерывания. Код выше работает хорошо. Если при отладке не видно переменных, то это скорей всего, версия протона глючная, это обсуждалось. Сейчас можно скачать самую свежую версию компилятора и IDE - здесь версия 3.5.2.5 для XP и семерки
mikhail09p Дата: Вс, 09.10.2011, 10:24  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 495
Репутация: 10   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Quote (MasterPic)
Потом - очень дурной тон использовать задержки в прерывании.

Quote (MasterPic)
Int_Label:
CONTEXT SAVE
IF T0IF = 1 THEN
T0IF = 0
ENDIF
B0=1
DELAYMS 100
B0=0

DELAYMS 100

CONTEXT RESTORE

Строчки, выделенные красным, убрать однозначно! cool
У Вас задержка в 200 мс! А если в это время произойдёт прерывание?.. Пурга будет!
MasterPic Дата: Вс, 09.10.2011, 10:32  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 196
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

Это не у меня а у ТС. Я его поправил по прерываниям
mikhail09p Дата: Вс, 09.10.2011, 11:29  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 495
Репутация: 10   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Quote (MasterPic)
Это не у меня а у ТС. Я его поправил по прерываниям

Да, не обратил внимания, откуда цитировал. Имел ввиду bullerа.
buller Дата: Вс, 09.10.2011, 20:42  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Новенький
Сообщений: 10
Репутация: 0   ±
Замечания:   ±
На сайте с 07.10.2011

Статус: Offline

"В прерывании нужно находиться как можно меньше времени - поставил флаг - вышел - в программе проверил, флаг стоит - выполняем действия(задержки и.т.д)"

Большое спасибо. На счет флага я как то не задумывался, но это как раз то решение которое мне нужно. Тем более теперь я могу видеть переменные при отладке в протеусе. Еще раз спасибо за полезную информацию.
dimitriy-bc Дата: Чт, 05.04.2012, 23:10  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 190
Репутация: 1   ±
Замечания:   ±
На сайте с 19.03.2012

Статус: Offline

Всем доброго времени суток. Осваиваю прерывания в протеусе. Прерывания по RB_0 отработало на ура, а с RB_4 проблема. Прогоняя в MPLAB вижу, что сброс флага INTCON.0 прописан, программа на эту строку заходит, а сброса с первого захода не получается. Соответственно программа идет на второй круг и только после этого происходит обнуление флага INTCON.0.
Прикрепления: ENCODER_1.rar(143Kb)
DAlexV Дата: Пт, 06.04.2012, 00:11  |                                                                                                                Сообщение # 8
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (dimitriy-bc)
что сброс флага INTCON.0 прописан, программа на эту строку заходит, а сброса с первого захода не получается. Соответственно программа идет на второй круг и только после этого происходит обнуление флага INTCON.0

Что бы этого не происходило, нужно сначала считать данные из порта, а потом уже сбрасывать флаг прерывания.(В мануале это описано)
Прикрепления: 2055190.png(10Kb)


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)
dimitriy-bc Дата: Сб, 07.04.2012, 12:47  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 190
Репутация: 1   ±
Замечания:   ±
На сайте с 19.03.2012

Статус: Offline

Всем доброго времени суток. DAlexV, спасибо за подсказку. В MPLAB теперь все замечательно по прерываниям RB 4-7 и RB 0. А с протеусом непонятки. Прерывания по RB 4_7 отрабатывают, как и предполагалось, на выходе RB 1 сигнал меняется по каждому фронту. При использовании прерывания по RB 0, на выходе RB 1 получаю короткие импульсы, а должен быть меандр (входной сигнал/2). Еще раз повторюсь, в симуляторе MPLAB программа работает, так как и должна.

И еще вопрос. Пробую записать текст

INT_0:
If B1=1 Then
B1=0
Else
B1=1
EndIf
INTCON.0 = 0
GoTo OUUT

в одну строку

INT_0:
If B1=1 Then B1=0: Else B1=1
INTCON.0 = 0
GoTo OUUT

Протон ругается.

general syntax error.
cannot assign a variable to a numeric constant

Хотя делаю вроде как в книжке показано.
Прикрепления: interruptions.rar(75Kb)

Сообщение отредактировал dimitriy-bc - Сб, 07.04.2012, 13:10
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Прерывание по таймеру 16F84A (Помогите разобратся почему не работает прерывание)
Страница 1 из 11
Поиск: