реклама на сайте
подробности

 
 
> PIO IRQ AT91RM9200, прерывание по PIOB
quantum
сообщение Oct 15 2007, 23:42
Сообщение #1





Группа: Новичок
Сообщений: 12
Регистрация: 1-10-07
Пользователь №: 30 959



В общем на PIOB висит клавиатура с мультиплексором. 7 в 14. Тоесть PIOB 0..6 - входы с подтягивающими резисторами. PIOB бит 7 - выход. Если=0 то анализируются первые 7 кнопок, если=1, то вторые 7 кнопок. Таким образом, имеем возможность опрашивать параллельно 14 кнопок с помощью восьми линий(7 ввод+1вывод)

конфигурация портов следующая:

PIO_PER 0x7F //энаблим PIO
PIO_PDR ~0x7F
PIO_OER 0x3F //биты 0..6 на выход 7-на ввод
PIO_ODR ~0x3F
PIO_IFER 0x3F //биты 0..6 вкл. фильтр выбросов
PIO_IFDR ~0x3F
PIO_SODR 0x0
PIO_CODR 0x40 //бит 7 выход=0
PIO_IER 0x3F //изменение на входах 0..6 влечёт прерывание
PIO_IDR ~0x3F
PIO_MDER 0x0
PIO_MDDR 0x0
PIO_PUER 0x3F //подтягивающие резисторы на 0..6
PIO_PUDR ~0x3F
PIO_ASR 0x0
PIO_BSR 0x0
PIO_OWER 0x40 //разрешаем менять бит 7 на вывод
PIO_OWDR ~0x40


потом идёт обработчик прерывания PIOB:

volatile unsigned char Pin1,Pin2;


void Key(void) __irq
{
PIOB_ODSR&=(~0x40); //первая линия мультиплексора (первые 7 кнопок)
Delay(100); //simple delay loop of 100 iterations. Без "задержки не работает"!
Pin1=PIOB_PDSR&0x3F; //считываем биты 0..6(первые 7 кнопок)
PIOB_ODSR|=0x40; //вторая линия мультиплексора (вторые 7 кнопок)
Delay(100); //simple delay loop of 100 iterations. Без "задержки не работает"!
Pin2=PIOB_PDSR&0x3F; //считываем биты 0..6(вторые 7 кнопок)
PIOB_ISR; //читаем регистр статуса прерывания PIOB
AIC_EOICR=0; //пишем что-нить для "End Of Interrupt
}


Настраивал AIC так:
AIC_IECR=(1<<3); //Enable PIOB interrupt
AIC_IDCR=~(1<<3);
PMC_PCER|=(1<<3); //Enable PIOB clock
PMC_PCDR&=~(1<<3)
//далее конфигурим PIOB (см. выше)
AIC_SVR3=(unsigned long int)Key; //адрес обработчика прерывания
AIC_SMR3=(7<<0)|(2<<5); //высший приоритет, срабатывание по изменению


В общем всё работает, НО: иногда клавиши залипают. Почему?

опрос клавиш в цикле работает нормально!

И почему без задержки delay(100) никак?

если что-то не верно, подправьте, плиз! 1111493779.gif

Сообщение отредактировал quantum - Oct 15 2007, 23:46
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Oct 16 2007, 00:38
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Странный метод опроса:
- Необходимость задержки обусловлена, по всей видимости, схемотехникой входных цепей - не успевают установится уровни за те немногие наносекунды, что проходят между выбором ряда и опросом.
- Как будет сгенерировано прерывание, если ряд не выбран мультиплексором? Отсюда, наверное, и "залипания".

Такой опрос логичнее делать на таймере: по событию опросили ряд, выбрали следующий, по следующему событию опросили его и т.д.
Go to the top of the page
 
+Quote Post
quantum
сообщение Oct 16 2007, 01:00
Сообщение #3





Группа: Новичок
Сообщений: 12
Регистрация: 1-10-07
Пользователь №: 30 959



Цитата(aaarrr @ Oct 16 2007, 03:38) *
Как будет сгенерировано прерывание, если ряд не выбран мультиплексором? Отсюда, наверное, и "залипания".


прерывание генерируется, если хоть одна из ножек(биты 0..6) изменила своё состояние!
0 - клавиша нажата, 1- отжата. Как только мы что-то нажимаем - вызывается прерывание в котором идёт опрос ВСЕХ кнопок - тоесть вначале сканим кнопки ряда 0, потом сканим кнопки ряда 1.

По-моему всё логично.

Цитата(aaarrr @ Oct 16 2007, 03:38) *
Такой опрос логичнее делать на таймере: по событию опросили ряд, выбрали следующий, по следующему событию опросили его и т.д.


в моём случае обязательно нажатие кнопок на прерывание PIO садить. Таймер нельзя! -таково задание.

Если что, предлагайте другие методы опроса клавиш в прерывании PIOB
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 16 2007, 01:32
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(quantum @ Oct 16 2007, 05:00) *
прерывание генерируется, если хоть одна из ножек(биты 0..6) изменила своё состояние!
0 - клавиша нажата, 1- отжата.

Представьте, что в данный момент у Вас выбран ряд 1 (что и наблюдается при выходе из прерывания), а нажали кнопку из ряда 0 - как это отразится на входах?

P.S. Мелочь, конечно, но глаз режет: кнопок у Вас 6, а биты 0..5
Go to the top of the page
 
+Quote Post
quantum
сообщение Oct 16 2007, 02:12
Сообщение #5





Группа: Новичок
Сообщений: 12
Регистрация: 1-10-07
Пользователь №: 30 959



Цитата(aaarrr @ Oct 16 2007, 04:32) *
Представьте, что в данный момент у Вас выбран ряд 1 (что и наблюдается при выходе из прерывания), а нажали кнопку из ряда 0 - как это отразится на входах?


Респект, товарищ!!! a14.gif
Понятно в чём дело! smile.gif
действительно, так и будет - актуальный ряд не выбран, а прерывание идёт с предыдущим рядом! lol.gif

тогда на моменте инициализации:
выбираем ряд 0

в обработчике:
проверяем ряд 0
выбираем ряд 1
проверяем ряд 1
выбираем ряд 0


Цитата(aaarrr @ Oct 16 2007, 04:32) *
P.S. Мелочь, конечно, но глаз режет: кнопок у Вас 6, а биты 0..5


Ошибся маленько smile.gif Кнопок всего 12 (биты 0..5) мультиплекс-руль(бит 6)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 22:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01392 секунд с 7
ELECTRONIX ©2004-2016