Страница 1 из 1
Как решить вопрос с прерываниями
Добавлено: Вс май 27, 2018 15:01:29
Олег88135
Осваиваю прерывания, делаю таймер на PIC16f676, вобщем, прога работает, но когда происходит прерывание(у меня по изменению уровня на порте а)прога не выходит из обработчика, перепробовал массу способов но никак! Кто-нить сталкивался с подобным?
Re: Как решить вопрос с прерываниями
Добавлено: Вс май 27, 2018 15:16:56
Albert_V
После входа в подпрограмму обработки прерываний и после того как выяснили от кого получено прерывание, нужно сбросить флаг прерывания.
Re: Как решить вопрос с прерываниями
Добавлено: Вс май 27, 2018 15:25:04
pyzhman
Отрывок из рабочего листинга:
Код: Выделить всё
;
;Светофор
;
#include <p16f84.inc> ;подключаем файл определений мк
...
org 0 ;начальный адрес программы
clrf INTCON ;запрет всех прерываний
goto START ;переход на начало
org 04h ;вектор прерываний
goto interrupt ;переход на подпрограмму обработки прерываний
;
START
bsf STATUS, RP0 ;включаем BANK1
movlw b'11111000' ;RA0,RA1,RA2 - выходы
movwf TRISA ;запись в TRISA
movlw b'00000011' ;RB7..RB2 - выходы
movwf TRISB ;запись в TRISB
movlw b'00000100' ;определение прескалера для таймера 1:32
movwf OPTION_REG ;запись в OPTION_REG
bcf STATUS,RP0 ;включаем BANK0
clrw ;обнуляем рабочий регистр
movwf PORTA ;устанавливаем на выходах порта А нули(гасим лампы)
movwf PORTB ;устанавливаем на выходах порта B нули(гасим лампы)
movlw 0x3D ;начальное состояние счетчика
movwf counter ;в переменную
movlw .31 ;начальное количество тактов
movwf takt ;в переменную
movlw b'10100000' ;взводим биты нужных прерываний
movwf INTCON ;разрешаем прерывание от таймера и общее разрешение
loop
goto loop ;зацикливаемся на метке loop
;************************
;
;************************
interrupt
btfss INTCON,T0IF ;проверяем флаг прерывания от таймера
retfie ;если не таймер, то выходим из п/п
...
m1
bcf INTCON,T0IF ;сбрасываем флаг прерывания от таймера
retfie ;выход из п/п обработки прерывания
;
;Подпрограмма возвращает данные для ламп
;Такты перебираются от 31-го до 1-го и далее, по кругу.
;
; b'D7 D6 D5 D4 D3 D2 D1 D0'
;
;D0 - красный светофора_1 и светофора_3
;D1 - желтый светофора_1 и светофора_3
...
end ;конец программы
Re: Как решить вопрос с прерываниями
Добавлено: Вс май 27, 2018 15:47:20
Albert_V
Опасное место в коде:
interrupt
btfss INTCON,T0IF ;проверяем флаг прерывания от таймера
retfie ;если не таймер, то выходим из п/п
...
m1
bcf INTCON,T0IF ;сбрасываем флаг прерывания от таймера
retfie ;выход из п/п обработки прерывания
Дело в том, что "просто так" попасть в обработку прерываний вы не можете, а если уж попали - проверяйте по какому условию и сбрасывайте соответствующий флаг прерывания.
В противном случае, есть шанс не "вылезть" из обработчика прерываний (не понимая, при этом, какого ххх туда заходит программа)...
Re: Как решить вопрос с прерываниями
Добавлено: Вс май 27, 2018 16:14:36
pyzhman
Согласен. Исправлять не стал, т.к. разработка теоретическая.
Re: Как решить вопрос с прерываниями
Добавлено: Вс май 27, 2018 16:37:17
Олег88135
У меня только от изменения уровня на порте а. Соответствующий флаг я сбрасываю в самом начале обработчика, только это не помогает.
Re: Как решить вопрос с прерываниями
Добавлено: Вс май 27, 2018 16:42:41
Albert_V
Выкладывайте текст программы и полную схему устройства.
Если программа на asm - постараюсь помочь. Если на другом языке программирования - кто-нибудь подскажет.
P.S.
А вообще то, "реагировать" на мех. кнопку по прерыванию (с кнопки) - не советую (если только не хотите вначале создать себе проблемы, а потом их разгребать).
Re: Как решить вопрос с прерываниями
Добавлено: Пн май 28, 2018 08:51:00
BOB51
У ПИКов при нескольких одновременно задействованных источниках прерываний надо предобработку определения источника сначала делать.
Для начинающего проще сначала научится работать с одним источником (тот же таймер), а обработку кнопок проводить программно.
Или отработать отдельно кнопки отдельно таймер, а уж затем составить обработчик/селектор для обеих источников прерываний.

Re: Как решить вопрос с прерываниями
Добавлено: Вт май 29, 2018 13:16:05
Олег88135
Решил проблему-просто вставил #include <p16f84.inc> и всё. Работает как задумано. Хотел еще спросить-какие МК лучше-PIC или AVR?
Re: Как решить вопрос с прерываниями
Добавлено: Вт май 29, 2018 13:22:21
pyzhman
Провокация.
Re: Как решить вопрос с прерываниями
Добавлено: Вт май 29, 2018 13:37:43
Albert_V
Олег88135 писал(а):Решил проблему-просто вставил #include <p16f84.inc> и всё. Работает как задумано.
Что за хрень?
Т.е., для PIC16f676 подкинули файл с картой регистров и пр. от PIC16f84 и считаете это нормальным?
Это, приблизительно, как в навигаторе подменить карту текущего местоположения на карту другого города. Далеко уедете?
Олег88135 писал(а):какие МК лучше-PIC или AVR?
Те, которые знаешь лучше, чем пальцы на руке и которые более подходят под разрабатываемое изделие.
