Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 27.12.2016, 23:36  
vavan1983
Почётный гражданин KAZUS.RU
 
Аватар для vavan1983
 
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
vavan1983 на пути к лучшему
По умолчанию Внешнее прерывание INT

Всем привет.
При нажатии на любу кнопку на любом порту PORTB значения принятой лог.отображается на PORTC проблема в том что если нажать одновременно на комбинацию RB0 и любую другую RB то RB0 не передаётся.
У кого какие подходы к такой ситуации?

Нажмите на изображение для увеличения
Название: Схема.gif
Просмотров: 0
Размер:	29.2 Кб
ID:	108399

Нажмите, чтобы открыть спойлер
Код:
void main()
{
TRISB=0XFF;              //все порты B как цифровые входы
TRISC=0;                   //все порты С как цифровые выходы
PORTC=0XFF;              //все порты С определяет как лог. 1

OPTION_REG=0B00111111;   //подтягивающии резисторы 
                                        //к портам В подключены
                                        //прерывание по заднему фронту 
                                        //сигнала на входе внешнего
                                        //прерывания INT
                         
INTCON=0B11010000;       //разрешить все прерывания
                                     //разрешить все прерывания 
                                     //от переферийных устройств
                                     //разрешить внешние прерывание INT
}

void interrupt(void)       //функция, вход в обработчик прерывания
{
if(INTCON.INTF)          //проверка условия внешнего 
                                //прерывания INT на порту RB0
{
OPTION_REG.INTEDG=1;       //установка прерывания по 
                                         //переднему фронту сигнала
                                         //для перехвата когда кнопка отпущена

INTCON.INTF=0;    //принудительный сброс флага внешнего прерывания

if(PORTB==254)     //проверка нажатия одной кнопки на порту RB0
{
PORTC=PORTB;      //передача значения регистров PORTC в PORTB
                          //в данном случаи только для 
                          //изменения лог. состояния
                          //на порту RC0
}
else                     //если PORTB не равен 254 то
{
PORTC=PORTB^1;    //передача значения регистров 
                            //PORTC в PORTB в случаи
                            //если были нажаты любые
                            //другие кнопки на остальных
                            //портах PORTB от RB1-RB7 и 
                            //перевода RC0 в его исходное
                            //состояние ^1
}
if(PORTB==0xff)            //фиксирует когда были отпущены 
                                  //все кнопки так как ранее
                                  //была устаноленно 
                                  //значение OPTION_REG.INTEDG=1
{
PORTC=PORTB;
OPTION_REG.INTEDG=0;     //прерывание по заднему фронту 
                                      //сигнала для отслеживания
                                      //дальнейших нажатий кнопок на порту PORTB
}
}
}
Реклама:
vavan1983 вне форума  
Непрочитано 28.12.2016, 03:07  
RECTO
Супер-модератор
 
Регистрация: 09.06.2011
Сообщений: 2,633
Сказал спасибо: 73
Сказали Спасибо 1,793 раз(а) в 647 сообщении(ях)
RECTO на пути к лучшему
По умолчанию Re: Внешнее прерывание INT

Сообщение от vavan1983 Посмотреть сообщение
проблема в том что если нажать одновременно на комбинацию RB0 и любую другую RB то RB0 не передаётся.
Вполне логично. Поскольку такая схема не позволяет отличить одиночное нажатие RB1-RB7 от нажатия тех же кнопок одновременно с RB0. В любом случае на RB0 будет низкий уровень. Программа ваша отслеживает, есть ли низкий уровень на каком-нибудь из входов, кроме RB0, и если есть - игнорирует низкий уровень на RB0. Вот он и не передаётся...

Сообщение от vavan1983 Посмотреть сообщение
У кого какие подходы к такой ситуации?
Ну, можно сделать как-то так: (var1). Оставляем RB0 в качестве общего входа прерывания для всех кнопок, а нажатие первой кнопки принимаем на RA0. Потом в программе совмещаем принятые данные с портов А и В.

Либо, если принципиально важно читать нажатия именно с порта В - как-то так: (var2). Пока ждём прерывание, на выходе RA0 удерживается высокий уровень. Когда входим в прерывание, выдаём на RA0 низкий уровень, после чего читаем данные RB0-RB7...
Миниатюры:
Нажмите на изображение для увеличения
Название: var_1.jpg
Просмотров: 0
Размер:	229.0 Кб
ID:	108402   Нажмите на изображение для увеличения
Название: var_2.jpg
Просмотров: 0
Размер:	227.9 Кб
ID:	108403  
RECTO вне форума  
Сказали "Спасибо" RECTO
vavan1983 (28.12.2016)
Непрочитано 28.12.2016, 10:37  
makakus
Почётный гражданин KAZUS.RU
 
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,106
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
makakus на пути к лучшему
По умолчанию Re: Внешнее прерывание INT

Интересно люди живут.
Состояние кнопок с порта В передаётся в порт С с невероятными сложностями.
Лабораторная работа? судя по ашипкам обоего вида в комментариях.

Вопрос: А зачем там контроллер?
Хорошо, балуемся. Почему прерывание? Поллинг проще.
makakus вне форума  
Непрочитано 28.12.2016, 19:30  
vavan1983
Почётный гражданин KAZUS.RU
 
Аватар для vavan1983
 
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
vavan1983 на пути к лучшему
По умолчанию Re: Внешнее прерывание INT

makakus, ну это часть проекта один не большой кусочек.
vavan1983 вне форума  
Непрочитано 28.12.2016, 22:01  
Sergey_57
Вид на жительство
 
Регистрация: 12.12.2012
Сообщений: 365
Сказал спасибо: 31
Сказали Спасибо 204 раз(а) в 112 сообщении(ях)
Sergey_57 на пути к лучшему
По умолчанию Re: Внешнее прерывание INT

Сталкивался с подобной проблемой.
Если возникло прерывание , то внутри тела прерывания вы не можете прочитать RB0-этот вход занят прерыванием.
В своё время была попытка таким способом убрать дребезг кнопоки,
которая закончилась творческой неудачей.

Вне прерывания вы можете это сделать.
Например после прерывания вы например его замаскировали (по сценарию)
Читать можете без проблем.
Sergey_57 вне форума  
Непрочитано 29.12.2016, 07:46  
Вячеслав М.
Временная регистрация
 
Аватар для Вячеслав М.
 
Регистрация: 23.09.2010
Сообщений: 87
Сказал спасибо: 30
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
Вячеслав М. на пути к лучшему
По умолчанию Re: Внешнее прерывание INT

Зачем все это?
Порт В имеет прерывания по изменению состояния входов.
__________________
Школа, это место, где шлифуют булыжники и портят алмазы!
Надпись на аватаре: "Всё! Больше провода не грызу!".
Вячеслав М. вне форума  
Непрочитано 29.12.2016, 08:12  
vavan1983
Почётный гражданин KAZUS.RU
 
Аватар для vavan1983
 
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
vavan1983 на пути к лучшему
По умолчанию Re: Внешнее прерывание INT

Вячеслав М., не все только RB7 по RB4
vavan1983 вне форума  
Непрочитано 29.12.2016, 09:58  
makakus
Почётный гражданин KAZUS.RU
 
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,106
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
makakus на пути к лучшему
По умолчанию Re: Внешнее прерывание INT

Сообщение от vavan1983 Посмотреть сообщение
ну это часть проекта один не большой кусочек
Да что вы?! Прямо заинтриговали, зачем такое может быть нужно? Там же, кроме прочего, придёт непредсказуемая пачка прерываний, из-за дребезга.
makakus вне форума  
Непрочитано 29.12.2016, 10:24  
sat_art
Вид на жительство
 
Регистрация: 27.11.2007
Сообщений: 428
Сказал спасибо: 19
Сказали Спасибо 39 раз(а) в 30 сообщении(ях)
sat_art на пути к лучшему
По умолчанию Re: Внешнее прерывание INT

vavan1983,
Вообще задача не корректно описана, но если необходимо именно прерывание и 8 кнопок то Вам нужно 4 вывода (3 плюс 1 прерывание) и 16 диодов.
12 диодов - для преобразования номера кнопки от 1 до 7 на 3 вывода, плюс 3 диода с этих выводов на инт, плюс 1 диод кнопка 0 или 8 (как куму удобно).
Надеюсь понятно.
sat_art вне форума  
Непрочитано 29.12.2016, 10:55  
makakus
Почётный гражданин KAZUS.RU
 
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,106
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
makakus на пути к лучшему
По умолчанию Re: Внешнее прерывание INT

Сообщение от sat_art Посмотреть сообщение
Вам нужно 4 вывода (3 плюс 1 прерывание) и 16 диодов.
Можно ещё досыпать резисторов-конденсаторов ака "подавители дребезга". Только зачем навешивать, когда есть софт? Программируется это всё.

На вопрос ТС, по-моемк, ответил Sergey_57: "внутри тела прерывания вы не можете прочитать RB0-этот вход занят прерыванием"
Собственно, а зачем его читать? Есть прерывание - значит, нажали кнопку. Какую? Если остальные имеют высокий уровень, то только верхнюю. Нет - та, которая притянута к земле. А нажатие нескольких кнопок в общем случае не отслеживается.

Последний раз редактировалось makakus; 29.12.2016 в 11:02.
makakus вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
tdc7200 Alex_golubev Микроконтроллеры, АЦП, память и т.д 5 10.12.2016 13:26
Некорректная работа TMR0 (PIC18F4550) <VenoM> Proteus 4 18.03.2016 22:41
Мега88 внешнее прерывание по низкому уровню E_C_C Proteus 0 06.09.2012 11:47
LPC13xx Внешнее прерывание Sinopteek Микроконтроллеры, АЦП, память и т.д 3 17.02.2012 10:23
Внешнее прерывание на tiny15 livsha Микроконтроллеры, АЦП, память и т.д 8 21.04.2010 01:11


Часовой пояс GMT +4, время: 23:31.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot