конфигурация портов следующая:
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) никак?
если что-то не верно, подправьте, плиз!
