Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

Как решить вопрос с прерываниями

Вс май 27, 2018 15:01:29

Осваиваю прерывания, делаю таймер на PIC16f676, вобщем, прога работает, но когда происходит прерывание(у меня по изменению уровня на порте а)прога не выходит из обработчика, перепробовал массу способов но никак! Кто-нить сталкивался с подобным?

Re: Как решить вопрос с прерываниями

Вс май 27, 2018 15:16:56

После входа в подпрограмму обработки прерываний и после того как выяснили от кого получено прерывание, нужно сбросить флаг прерывания.

Re: Как решить вопрос с прерываниями

Вс май 27, 2018 15:25:04

Отрывок из рабочего листинга:

Код:
;
;Светофор
;
#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

Опасное место в коде:
interrupt
btfss INTCON,T0IF ;проверяем флаг прерывания от таймера
retfie ;если не таймер, то выходим из п/п

...
m1
bcf INTCON,T0IF ;сбрасываем флаг прерывания от таймера
retfie ;выход из п/п обработки прерывания
Дело в том, что "просто так" попасть в обработку прерываний вы не можете, а если уж попали - проверяйте по какому условию и сбрасывайте соответствующий флаг прерывания.
В противном случае, есть шанс не "вылезть" из обработчика прерываний (не понимая, при этом, какого ххх туда заходит программа)...

Re: Как решить вопрос с прерываниями

Вс май 27, 2018 16:14:36

Согласен. Исправлять не стал, т.к. разработка теоретическая.

Re: Как решить вопрос с прерываниями

Вс май 27, 2018 16:37:17

У меня только от изменения уровня на порте а. Соответствующий флаг я сбрасываю в самом начале обработчика, только это не помогает.

Re: Как решить вопрос с прерываниями

Вс май 27, 2018 16:42:41

Выкладывайте текст программы и полную схему устройства.
Если программа на asm - постараюсь помочь. Если на другом языке программирования - кто-нибудь подскажет.
P.S.
А вообще то, "реагировать" на мех. кнопку по прерыванию (с кнопки) - не советую (если только не хотите вначале создать себе проблемы, а потом их разгребать).

Re: Как решить вопрос с прерываниями

Пн май 28, 2018 08:51:00

У ПИКов при нескольких одновременно задействованных источниках прерываний надо предобработку определения источника сначала делать.
Для начинающего проще сначала научится работать с одним источником (тот же таймер), а обработку кнопок проводить программно.
Или отработать отдельно кнопки отдельно таймер, а уж затем составить обработчик/селектор для обеих источников прерываний.
:roll:

Re: Как решить вопрос с прерываниями

Вт май 29, 2018 13:16:05

Решил проблему-просто вставил #include <p16f84.inc> и всё. Работает как задумано. Хотел еще спросить-какие МК лучше-PIC или AVR?

Re: Как решить вопрос с прерываниями

Вт май 29, 2018 13:22:21

Провокация.

Re: Как решить вопрос с прерываниями

Вт май 29, 2018 13:37:43

Олег88135 писал(а):Решил проблему-просто вставил #include <p16f84.inc> и всё. Работает как задумано.
Что за хрень? :facepalm:
Т.е., для PIC16f676 подкинули файл с картой регистров и пр. от PIC16f84 и считаете это нормальным?
Это, приблизительно, как в навигаторе подменить карту текущего местоположения на карту другого города. Далеко уедете?
Олег88135 писал(а):какие МК лучше-PIC или AVR?
Те, которые знаешь лучше, чем пальцы на руке и которые более подходят под разрабатываемое изделие. :)))
Ответить