Как решить вопрос с прерываниями
- Сообщения: 3
- Зарегистрирован: Вс май 27, 2018 14:55:05
Осваиваю прерывания, делаю таймер на PIC16f676, вобщем, прога работает, но когда происходит прерывание(у меня по изменению уровня на порте а)прога не выходит из обработчика, перепробовал массу способов но никак! Кто-нить сталкивался с подобным?
- Реклама
После входа в подпрограмму обработки прерываний и после того как выяснили от кого получено прерывание, нужно сбросить флаг прерывания.
Отрывок из рабочего листинга:
Код: Выделить всё
;
;Светофор
;
#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 ;конец программы
Docendo discimus
Опасное место в коде:
В противном случае, есть шанс не "вылезть" из обработчика прерываний (не понимая, при этом, какого ххх туда заходит программа)...
Дело в том, что "просто так" попасть в обработку прерываний вы не можете, а если уж попали - проверяйте по какому условию и сбрасывайте соответствующий флаг прерывания.interrupt
btfss INTCON,T0IF ;проверяем флаг прерывания от таймера
retfie ;если не таймер, то выходим из п/п
...
m1
bcf INTCON,T0IF ;сбрасываем флаг прерывания от таймера
retfie ;выход из п/п обработки прерывания
В противном случае, есть шанс не "вылезть" из обработчика прерываний (не понимая, при этом, какого ххх туда заходит программа)...
Согласен. Исправлять не стал, т.к. разработка теоретическая.
Docendo discimus
- Реклама
- Сообщения: 3
- Зарегистрирован: Вс май 27, 2018 14:55:05
У меня только от изменения уровня на порте а. Соответствующий флаг я сбрасываю в самом начале обработчика, только это не помогает.
Выкладывайте текст программы и полную схему устройства.
Если программа на asm - постараюсь помочь. Если на другом языке программирования - кто-нибудь подскажет.
P.S.
А вообще то, "реагировать" на мех. кнопку по прерыванию (с кнопки) - не советую (если только не хотите вначале создать себе проблемы, а потом их разгребать).
Если программа на asm - постараюсь помочь. Если на другом языке программирования - кто-нибудь подскажет.
P.S.
А вообще то, "реагировать" на мех. кнопку по прерыванию (с кнопки) - не советую (если только не хотите вначале создать себе проблемы, а потом их разгребать).
У ПИКов при нескольких одновременно задействованных источниках прерываний надо предобработку определения источника сначала делать.
Для начинающего проще сначала научится работать с одним источником (тот же таймер), а обработку кнопок проводить программно.
Или отработать отдельно кнопки отдельно таймер, а уж затем составить обработчик/селектор для обеих источников прерываний.

Для начинающего проще сначала научится работать с одним источником (тот же таймер), а обработку кнопок проводить программно.
Или отработать отдельно кнопки отдельно таймер, а уж затем составить обработчик/селектор для обеих источников прерываний.
- Сообщения: 3
- Зарегистрирован: Вс май 27, 2018 14:55:05
Решил проблему-просто вставил #include <p16f84.inc> и всё. Работает как задумано. Хотел еще спросить-какие МК лучше-PIC или AVR?
Провокация.
Docendo discimus
Что за хрень?Олег88135 писал(а):Решил проблему-просто вставил #include <p16f84.inc> и всё. Работает как задумано.
Т.е., для PIC16f676 подкинули файл с картой регистров и пр. от PIC16f84 и считаете это нормальным?
Это, приблизительно, как в навигаторе подменить карту текущего местоположения на карту другого города. Далеко уедете?
Те, которые знаешь лучше, чем пальцы на руке и которые более подходят под разрабатываемое изделие.Олег88135 писал(а):какие МК лучше-PIC или AVR?


