Прерывание по таймеру 16F84A
|
|
buller |
Дата: Пт, 07.10.2011, 10:00 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
10
Замечания:
±
На сайте с 07.10.2011
Статус:
Offline
|
Не происходит прерывание. Уже не знаю что делать. Вроде все делал как написано в книжке. Я только начинаю работать с ПИК і протоном. Поетому иногда нужен чей нибудь совет.
P.S. Еще вопрос как при отладке в протеусе можно сделать так чтоб в окне PIC CPU Variables виводились переменные
Сообщение отредактировал
buller - Пт, 07.10.2011, 10:05
|
|
|
|
MasterPic |
Дата: Пт, 07.10.2011, 16:49 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
186
Замечания:
±
На сайте с 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 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 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 Строчки, выделенные красным, убрать однозначно! У Вас задержка в 200 мс! А если в это время произойдёт прерывание?.. Пурга будет!
|
|
|
|
MasterPic |
Дата: Вс, 09.10.2011, 10:32 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
186
Замечания:
±
На сайте с 22.11.2008
Статус:
Offline
|
Это не у меня а у ТС. Я его поправил по прерываниям
|
|
|
|
mikhail09p |
Дата: Вс, 09.10.2011, 11:29 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Quote (MasterPic) Это не у меня а у ТС. Я его поправил по прерываниям Да, не обратил внимания, откуда цитировал. Имел ввиду bullerа.
|
|
|
|
buller |
Дата: Вс, 09.10.2011, 20:42 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
10
Замечания:
±
На сайте с 07.10.2011
Статус:
Offline
|
"В прерывании нужно находиться как можно меньше времени - поставил флаг - вышел - в программе проверил, флаг стоит - выполняем действия(задержки и.т.д)"
Большое спасибо. На счет флага я как то не задумывался, но это как раз то решение которое мне нужно. Тем более теперь я могу видеть переменные при отладке в протеусе. Еще раз спасибо за полезную информацию.
|
|
|
|
dimitriy-bc |
Дата: Чт, 05.04.2012, 23:10 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
150
Замечания:
±
На сайте с 19.03.2012
Статус:
Offline
|
Всем доброго времени суток. Осваиваю прерывания в протеусе. Прерывания по RB_0 отработало на ура, а с RB_4 проблема. Прогоняя в MPLAB вижу, что сброс флага INTCON.0 прописан, программа на эту строку заходит, а сброса с первого захода не получается. Соответственно программа идет на второй круг и только после этого происходит обнуление флага INTCON.0.
|
|
|
|
DAlexV |
Дата: Пт, 06.04.2012, 00:11 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (dimitriy-bc) что сброс флага INTCON.0 прописан, программа на эту строку заходит, а сброса с первого захода не получается. Соответственно программа идет на второй круг и только после этого происходит обнуление флага INTCON.0 Что бы этого не происходило, нужно сначала считать данные из порта, а потом уже сбрасывать флаг прерывания.(В мануале это описано)
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
dimitriy-bc |
Дата: Сб, 07.04.2012, 12:47 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
150
Замечания:
±
На сайте с 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
Хотя делаю вроде как в книжке показано.
Сообщение отредактировал
dimitriy-bc - Сб, 07.04.2012, 13:10
|
|
|
|