|
|
  |
PIO IRQ AT91RM9200, прерывание по PIOB |
|
|
|
Oct 15 2007, 23:42
|
Группа: Новичок
Сообщений: 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) никак? если что-то не верно, подправьте, плиз!
Сообщение отредактировал quantum - Oct 15 2007, 23:46
|
|
|
|
|
Oct 16 2007, 01:00
|
Группа: Новичок
Сообщений: 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
|
|
|
|
|
Oct 16 2007, 02:12
|
Группа: Новичок
Сообщений: 12
Регистрация: 1-10-07
Пользователь №: 30 959

|
Цитата(aaarrr @ Oct 16 2007, 04:32)  Представьте, что в данный момент у Вас выбран ряд 1 (что и наблюдается при выходе из прерывания), а нажали кнопку из ряда 0 - как это отразится на входах? Респект, товарищ!!! Понятно в чём дело!  действительно, так и будет - актуальный ряд не выбран, а прерывание идёт с предыдущим рядом! тогда на моменте инициализации: выбираем ряд 0в обработчике: проверяем ряд 0 выбираем ряд 1 проверяем ряд 1 выбираем ряд 0Цитата(aaarrr @ Oct 16 2007, 04:32)  P.S. Мелочь, конечно, но глаз режет: кнопок у Вас 6, а биты 0..5 Ошибся маленько  Кнопок всего 12 (биты 0..5) мультиплекс-руль(бит 6)
|
|
|
|
|
Oct 16 2007, 03:07
|
Группа: Новичок
Сообщений: 12
Регистрация: 1-10-07
Пользователь №: 30 959

|
тогда полностью на PIOB IRQ повешать никак! либо таймер или опрос в цикле...
|
|
|
|
|
Oct 16 2007, 05:45
|

http://uschema.com
   
Группа: Свой
Сообщений: 708
Регистрация: 16-02-06
Из: UK(Ukrainian_Kingdom) Kharkov
Пользователь №: 14 394

|
Цитата(quantum @ Oct 16 2007, 02:42)  В общем на PIOB висит клавиатура с мультиплексором. ... А что глитча(Glitch) нет разве на этом порту? на сколько я помню - помоему есть, так вот это и еть защелка от дребезга по тригерному принципу .
--------------------
|
|
|
|
|
Oct 16 2007, 23:45
|
Группа: Новичок
Сообщений: 12
Регистрация: 1-10-07
Пользователь №: 30 959

|
в общем я на прерывание таймера-счётчика повешал опрос клавиш с управлением мультиплексора (системный таймер уже занят).
получилось красиво! и от delay избавился - при первом вызове прерывания рулим мультиплексором. При втором - сканим клавиши. Далее всё посторяется.
А глитч и дребезг - отношения к delay не имеет. Задержка нужна, потому что:
1) ядро работает на частоте в 2 раза большей чем периферия 2) мультиплексор достаточно медленный
Сообщение отредактировал quantum - Oct 16 2007, 23:47
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|