Форум РадиоКот 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: Как решить вопрос с прерываниями |
У ПИКов при нескольких одновременно задействованных источниках прерываний надо предобработку определения источника сначала делать. Для начинающего проще сначала научится работать с одним источником (тот же таймер), а обработку кнопок проводить программно. Или отработать отдельно кнопки отдельно таймер, а уж затем составить обработчик/селектор для обеих источников прерываний. ![]() |
Автор: | Олег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> и всё. Работает как задумано. Что за хрень? ![]() Т.е., для PIC16f676 подкинули файл с картой регистров и пр. от PIC16f84 и считаете это нормальным? Это, приблизительно, как в навигаторе подменить карту текущего местоположения на карту другого города. Далеко уедете? Олег88135 писал(а): какие МК лучше-PIC или AVR? Те, которые знаешь лучше, чем пальцы на руке и которые более подходят под разрабатываемое изделие. ![]() |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |