Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: PIO IRQ AT91RM9200
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
quantum
В общем на 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
aaarrr
Странный метод опроса:
- Необходимость задержки обусловлена, по всей видимости, схемотехникой входных цепей - не успевают установится уровни за те немногие наносекунды, что проходят между выбором ряда и опросом.
- Как будет сгенерировано прерывание, если ряд не выбран мультиплексором? Отсюда, наверное, и "залипания".

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


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

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

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


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

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

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

P.S. Мелочь, конечно, но глаз режет: кнопок у Вас 6, а биты 0..5
quantum
Цитата(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)
aaarrr
Цитата(quantum @ Oct 16 2007, 06:12) *
тогда на моменте инициализации:
выбираем ряд 0

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

Это замечательно, конечно, только ряд 1 срабатывать перестанет smile.gif
quantum
тогда полностью на PIOB IRQ повешать никак!
либо таймер или опрос в цикле...
aaarrr
Цитата(quantum @ Oct 16 2007, 07:07) *
тогда полностью на PIOB IRQ повешать никак!
либо таймер или опрос в цикле...

Или поменять схемотехнику. Но лучше все же задействовать таймер.
PrSt
Цитата(quantum @ Oct 16 2007, 02:42) *
В общем на PIOB висит клавиатура с мультиплексором.
...
А что глитча(Glitch) нет разве на этом порту?
на сколько я помню - помоему есть, так вот это и еть защелка от дребезга по тригерному принципу

.
aaarrr
Цитата(PrSt @ Oct 16 2007, 09:45) *
А что глитча(Glitch) нет разве на этом порту?
на сколько я помню - помоему есть, так вот это и еть защелка от дребезга по тригерному принципу

Мультиплексор и триггер - мягко говоря, немного разные вещи.
И Glitch Filter от дребезга клавиатуры помочь не может в принципе.
PrSt
Цитата(aaarrr @ Oct 16 2007, 08:52) *
Мультиплексор и триггер - мягко говоря, немного разные вещи.
И Glitch Filter от дребезга клавиатуры помочь не может в принципе.

Да, это верно, но зато позволяет с другой плоскости посмотреть на необходимость использования delay

.
quantum
в общем я на прерывание таймера-счётчика повешал опрос клавиш с управлением мультиплексора (системный таймер уже занят).

получилось красиво! и от delay избавился - при первом вызове прерывания рулим мультиплексором. При втором - сканим клавиши. Далее всё посторяется.

А глитч и дребезг - отношения к delay не имеет. Задержка нужна, потому что:

1) ядро работает на частоте в 2 раза большей чем периферия
2) мультиплексор достаточно медленный
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.