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