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

 
 
> 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



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

 


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


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