27.12.2016, 23:36
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
|
Внешнее прерывание INT
Всем привет.
При нажатии на любу кнопку на любом порту PORTB значения принятой лог.отображается на PORTC проблема в том что если нажать одновременно на комбинацию RB0 и любую другую RB то RB0 не передаётся.
У кого какие подходы к такой ситуации?
Нажмите, чтобы открыть спойлер
Код:
|
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
}
}
} |
|
|
|
|
28.12.2016, 03:07
|
|
Супер-модератор
Регистрация: 09.06.2011
Сообщений: 2,633
Сказал спасибо: 73
Сказали Спасибо 1,793 раз(а) в 647 сообщении(ях)
|
Re: Внешнее прерывание INT
Сообщение от vavan1983
|
проблема в том что если нажать одновременно на комбинацию RB0 и любую другую RB то RB0 не передаётся.
|
Вполне логично. Поскольку такая схема не позволяет отличить одиночное нажатие RB1-RB7 от нажатия тех же кнопок одновременно с RB0. В любом случае на RB0 будет низкий уровень. Программа ваша отслеживает, есть ли низкий уровень на каком-нибудь из входов, кроме RB0, и если есть - игнорирует низкий уровень на RB0. Вот он и не передаётся...
Сообщение от vavan1983
|
У кого какие подходы к такой ситуации?
|
Ну, можно сделать как-то так: (var1). Оставляем RB0 в качестве общего входа прерывания для всех кнопок, а нажатие первой кнопки принимаем на RA0. Потом в программе совмещаем принятые данные с портов А и В.
Либо, если принципиально важно читать нажатия именно с порта В - как-то так: (var2). Пока ждём прерывание, на выходе RA0 удерживается высокий уровень. Когда входим в прерывание, выдаём на RA0 низкий уровень, после чего читаем данные RB0-RB7...
|
|
|
|
28.12.2016, 10:37
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,106
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Внешнее прерывание INT
Интересно люди живут.
Состояние кнопок с порта В передаётся в порт С с невероятными сложностями.
Лабораторная работа? судя по ашипкам обоего вида в комментариях.
Вопрос: А зачем там контроллер?
Хорошо, балуемся. Почему прерывание? Поллинг проще.
|
|
|
|
28.12.2016, 19:30
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
|
Re: Внешнее прерывание INT
makakus, ну это часть проекта один не большой кусочек.
|
|
|
|
28.12.2016, 22:01
|
|
Вид на жительство
Регистрация: 12.12.2012
Сообщений: 365
Сказал спасибо: 31
Сказали Спасибо 204 раз(а) в 112 сообщении(ях)
|
Re: Внешнее прерывание INT
Сталкивался с подобной проблемой.
Если возникло прерывание , то внутри тела прерывания вы не можете прочитать RB0-этот вход занят прерыванием.
В своё время была попытка таким способом убрать дребезг кнопоки,
которая закончилась творческой неудачей.
Вне прерывания вы можете это сделать.
Например после прерывания вы например его замаскировали (по сценарию)
Читать можете без проблем.
|
|
|
|
29.12.2016, 07:46
|
|
Временная регистрация
Регистрация: 23.09.2010
Сообщений: 87
Сказал спасибо: 30
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
|
Re: Внешнее прерывание INT
Зачем все это?
Порт В имеет прерывания по изменению состояния входов.
__________________
Школа, это место, где шлифуют булыжники и портят алмазы!
Надпись на аватаре: "Всё! Больше провода не грызу!".
|
|
|
|
29.12.2016, 08:12
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
|
Re: Внешнее прерывание INT
Вячеслав М., не все только RB7 по RB4
|
|
|
|
29.12.2016, 09:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,106
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Внешнее прерывание INT
Сообщение от vavan1983
|
ну это часть проекта один не большой кусочек
|
Да что вы?! Прямо заинтриговали, зачем такое может быть нужно? Там же, кроме прочего, придёт непредсказуемая пачка прерываний, из-за дребезга.
|
|
|
|
29.12.2016, 10:24
|
|
Вид на жительство
Регистрация: 27.11.2007
Сообщений: 428
Сказал спасибо: 19
Сказали Спасибо 39 раз(а) в 30 сообщении(ях)
|
Re: Внешнее прерывание INT
vavan1983,
Вообще задача не корректно описана, но если необходимо именно прерывание и 8 кнопок то Вам нужно 4 вывода (3 плюс 1 прерывание) и 16 диодов.
12 диодов - для преобразования номера кнопки от 1 до 7 на 3 вывода, плюс 3 диода с этих выводов на инт, плюс 1 диод кнопка 0 или 8 (как куму удобно).
Надеюсь понятно.
|
|
|
|
29.12.2016, 10:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,106
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Внешнее прерывание INT
Сообщение от sat_art
|
Вам нужно 4 вывода (3 плюс 1 прерывание) и 16 диодов.
|
Можно ещё досыпать резисторов-конденсаторов ака "подавители дребезга". Только зачем навешивать, когда есть софт? Программируется это всё.
На вопрос ТС, по-моемк, ответил Sergey_57: "внутри тела прерывания вы не можете прочитать RB0-этот вход занят прерыванием"
Собственно, а зачем его читать? Есть прерывание - значит, нажали кнопку. Какую? Если остальные имеют высокий уровень, то только верхнюю. Нет - та, которая притянута к земле. А нажатие нескольких кнопок в общем случае не отслеживается.
Последний раз редактировалось makakus; 29.12.2016 в 11:02.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:31.
|
|