|
Прерывания от ноги PIOA, AT91SAM7S32 |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 16)
|
Jul 7 2008, 08:18
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(Tcom @ Jul 7 2008, 12:05)  Привет! Скажите, можно ли организовать прерывания от любой ноги/ног PIOA. Проц AT91SAM7S32 и если можно, небольшой примерчик. Спасибо. Код #define E_SCL (1<<5) // PA5 #define E_SDA (1<<8) // PA8
void I2C_Handler(void) { ... }
void main (void) { AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_PIOA,4,AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE,I2C_Handler); AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA,E_SCL|E_SDA); AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_PIOA); //IRQ //AT91F_AIC_ForceIt (AT91C_BASE_AIC, AT91C_ID_PIOA); //FIQ
wait(1); }
|
|
|
|
|
Jul 7 2008, 13:32
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(aaarrr @ Jul 7 2008, 17:18)  А зачем, если есть PIO_ISR? У меня в sam7s256 почему-то он содержал 1 на всех изменивших своё состояния ногах с момента предыдущего чтения (даже тех, по которым не генерилось прерывание). Поэтому сделал так. When an input change is detected on an I/O line, the corresponding bit in PIO_ISR (Interrupt Status Register) is set. If the corresponding bit in PIO_IMR is set, the PIO Controller interrupt line is asserted. The interrupt signals of the thirty-two channels are ORed-wired together to generate a single interrupt signal to the Advanced Interrupt Controller. When the software reads PIO_ISR, all the interrupts are automatically cleared. This signifies that all the interrupts that are pending when PIO_ISR is read must be handled.
Сообщение отредактировал _4afc_ - Jul 7 2008, 13:37
|
|
|
|
|
Jul 8 2008, 06:02
|

Местный
  
Группа: Свой
Сообщений: 360
Регистрация: 3-01-06
Из: Украина Запорожская обл.
Пользователь №: 12 792

|
У меня задача состоит в улавливании еденицы на 5 ногах. И каждый источник прерывания (нога) выполняет свои действия. Может наступить момент когда 1 будет одновременно на 2-5 ногах. Сработает ли такой код Код void pio_interrupt(void) { unsigned int a;
a = AT91C_BASE_SYS->PIOA_ISR; //--------------------------------- if(a & SW0) { a++; } //--------------------------------- if(a & SW1) { b++; } //--------------------------------- if(a & SW2) { c++; } //--------------------------------- AT91C_BASE_SYS->AIC_EOICR = 0; }
|
|
|
|
|
Apr 29 2009, 14:04
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 18-05-06
Пользователь №: 17 226

|
Плата AT91SAM7-P64 от OLIMEX, хочу прицепить оптрон на ножку PA3.  Никак не получается воспользоваться примерами от aaarrr: Код __irq void pio_interrupt( void ) { AT91C_BASE_SYS->PIOA_ISR;
AT91C_BASE_SYS->AIC_EOICR = 0; }
1й вариант
int main( void ) { AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5<<24); AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA );
AT91C_BASE_SYS->PIOA_ODR = AT91C_PIO_PA3; AT91C_BASE_SYS->PIOA_IFER = AT91C_PIO_PA3; AT91C_BASE_SYS->PIOA_PER = AT91C_PIO_PA3;
AT91C_BASE_SYS->PIOA_IDR = 0xffffffff; AT91C_BASE_SYS->PIOA_IER = AT91C_PIO_PA3;
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_PIOA] = (unsigned int)pio_interrupt; AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = 0; AT91C_BASE_AIC->AIC_IECR = (0x01 << AT91C_ID_PIOA);
AT91C_BASE_PMC->PMC_PCER = (0x01 << AT91C_ID_PIOA);
for (;;) { delay(); } }
2й вариант
int main( void ) { AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5<<24); AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA );
AT91C_BASE_SYS->PIOA_ODR = AT91C_PIO_PA3; AT91C_BASE_SYS->PIOA_PPUDR = AT91C_PIO_PA3; AT91C_BASE_SYS->PIOA_IFER = AT91C_PIO_PA3; AT91C_BASE_SYS->PIOA_PER = AT91C_PIO_PA3;
AT91C_BASE_PMC->PMC_PCER = (1UL << AT91C_ID_PIOA);
AT91C_BASE_SYS->PIOA_IDR = ~0; AT91C_BASE_SYS->PIOA_IER = AT91C_PIO_PA3; AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = 0; AT91C_BASE_AIC->AIC_SVR[AT91C_ID_PIOA] = (unsigned int)pio_interrupt; AT91C_BASE_AIC->AIC_IECR = (1UL << AT91C_ID_PIOA);
for (;;) { delay(); } } в прерывание не входит, постоянно крутится в delay().
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|