Например TDA7294

Форум РадиоКот :: Просмотр темы - Как решить вопрос с прерываниями
Форум РадиоКот
https://radiokot.ru/forum/

Как решить вопрос с прерываниями
https://radiokot.ru/forum/viewtopic.php?f=58&t=155184
Страница 1 из 1

Автор:  Олег88135 [ Вс май 27, 2018 15:01:29 ]
Заголовок сообщения:  Как решить вопрос с прерываниями

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

Автор:  Albert_V [ Вс май 27, 2018 15:16:56 ]
Заголовок сообщения:  Re: Как решить вопрос с прерываниями

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

Автор:  pyzhman [ Вс май 27, 2018 15:25:04 ]
Заголовок сообщения:  Re: Как решить вопрос с прерываниями

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

Код:
;
;Светофор
;
#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   ;конец программы

Автор:  Albert_V [ Вс май 27, 2018 15:47:20 ]
Заголовок сообщения:  Re: Как решить вопрос с прерываниями

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

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

Автор:  pyzhman [ Вс май 27, 2018 16:14:36 ]
Заголовок сообщения:  Re: Как решить вопрос с прерываниями

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

Автор:  Олег88135 [ Вс май 27, 2018 16:37:17 ]
Заголовок сообщения:  Re: Как решить вопрос с прерываниями

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

Автор:  Albert_V [ Вс май 27, 2018 16:42:41 ]
Заголовок сообщения:  Re: Как решить вопрос с прерываниями

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

Автор:  BOB51 [ Пн май 28, 2018 08:51:00 ]
Заголовок сообщения:  Re: Как решить вопрос с прерываниями

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

Автор:  Олег88135 [ Вт май 29, 2018 13:16:05 ]
Заголовок сообщения:  Re: Как решить вопрос с прерываниями

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

Автор:  pyzhman [ Вт май 29, 2018 13:22:21 ]
Заголовок сообщения:  Re: Как решить вопрос с прерываниями

Провокация.

Автор:  Albert_V [ Вт май 29, 2018 13:37:43 ]
Заголовок сообщения:  Re: Как решить вопрос с прерываниями

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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/