|
Прерывания от ноги PIOA, AT91SAM7S32 |
|
|
|
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; }
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|