aaarrr 63 23 сентября, 2008 Опубликовано 23 сентября, 2008 · Жалоба А какого поведения вы ожидаете от контроллера после AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_PIOA,PIO_INTERRUPT_LEVEL, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, pio_c_irq_handler);? Здесь-то как раз все правильно: прерывание по pin level change, поэтому источник внутренний и уровень высокий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Balaganoff 0 23 сентября, 2008 Опубликовано 23 сентября, 2008 · Жалоба Прерывания же от PIO считаются внутренними, а "значения активных уровней внутренних прерываний для пользователя не имеют значения" . Там только 1.AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL ( поле SRCTYPE регистра AIC_SMR0[n] =0). В этом случае прерывается постоянно даже без его инициализации джойстиком . 2.AT91C_AIC_SRCTYPE_POSITIVE_EDGE (поле SRCTYPE регистра AIC_SMR0[n] =1). В этом случае в этом случае прерывания не наступает ни при каких действиях . 3.AT91C_AIC_SRCTYPE_HIGH_LEVEL (поле SRCTYPE регистра AIC_SMR0[n] =2) . Как в п 1. 4.AT91C_AIC_SRCTYPE_POSITIVE_EDGE поле SRCTYPE регистра AIC_SMR0[n] =3) . Как в п.2. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 23 сентября, 2008 Опубликовано 23 сентября, 2008 · Жалоба Прерывания же от PIO считаются внутренними, а "значения активных уровней внутренних прерываний для пользователя не имеют значения" .Да, ступил, признаю. Тогда надо проверять, что подтяжки действительно включены, что сигнал от джойстика приходит на нужную ногу, смотреть, в каком виде хочет второй параметр AT91F_PIO_InterruptEnable() и чему равна SW4_MASK Больше у меня версий нет. Вот этот код работает: void CMX_init() { AT91C_BASE_PIOA->PIO_IER = (1UL<<19); // FFSK_CLK // AIC AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | AT91C_AIC_PRIOR_LOWEST + 1; AT91C_BASE_AIC->AIC_SVR[AT91C_ID_PIOA] = (uint32_t)CMX469_Int_Handler; AT91C_BASE_AIC->AIC_IECR = (1<<AT91C_ID_PIOA); // enable ints } OS_INTERRUPT void CMX469_Int_Handler() { OS::TISRW ISR; if(AT91C_BASE_PIOA->PIO_ISR & (1<<19)) { FFSK_modem.put(signal(FFSK_DATA), ADC.RSSI()); } AT91C_BASE_AIC->AIC_EOICR = 0; // Reset AIC logic } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Balaganoff 0 23 сентября, 2008 Опубликовано 23 сентября, 2008 · Жалоба Ух! Все заработало. Сразу хочу сказать большое всем спасибо за помощь, ценные советы и оказанное внимание. Какой же я олух!!! С прерываниями от джостика не получалось,в итоге я параллелно начал работать только с одной ногой PIOB2, чтобы последовательно и наглядно без всяких там масок типа SW4_MASK все разобрать (благо все пины они введены на колодку ). В итоге что-то комментарил , что разкомментарил , а обработчик был один для двух версий программ!!! В конце его сброс регистра статуса dummy =AT91C_BASE_PIOA->PIO_ISR, но я то-работал уже c PIOB. Т.е. я думаю было так, я коротил PIOB2 на землю с влюченной подтяжкой, наступало прерывание как и должно быть,но в конце програмым обработки нужный регистр статуса не сбрасывался. И получается вновь вход в перрывание и так постоянно. В итоге исправил dummy =AT91C_BASE_PIOA->PIO_ISR, на dummy =AT91C_BASE_PIOB->PIO_ISR Так по памяти, может еще что где исправлял, но вроде бы так было. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 23 сентября, 2008 Опубликовано 23 сентября, 2008 · Жалоба В итоге исправил dummy =AT91C_BASE_PIOA->PIO_ISR, на dummy =AT91C_BASE_PIOB->PIO_ISR Исправьте еще dummy =AT91C_BASE_PIOB->PIO_ISR просто на AT91C_BASE_PIOB->PIO_ISR; Не нужно плодить лишние переменные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться