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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Прерывания от ноги PIOA, AT91SAM7S32
Tcom
сообщение Jul 7 2008, 08:05
Сообщение #1


Местный
***

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



Привет! Скажите, можно ли организовать прерывания от любой ноги/ног PIOA.
Проц AT91SAM7S32 и если можно, небольшой примерчик. Спасибо.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 7 2008, 08:12
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Можно:

Код
#define PIN            (0x01UL << 0x00)
#define PIO_IRQ_PRIORITY    0x00

void alrm_ini(void)
{
    AT91C_BASE_SYS->PIOA_ODR = PIN;
    AT91C_BASE_SYS->PIOA_IFER = PIN;
    AT91C_BASE_SYS->PIOA_PER = PIN;

    AT91C_BASE_SYS->PIOA_IDR = 0xffffffff;
    AT91C_BASE_SYS->PIOA_IER = PIN;

    AT91C_BASE_AIC->AIC_SVR[AT91C_ID_PIOA] = (u_int)pio_interrupt;
    AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = PIO_IRQ_PRIORITY;
    AT91C_BASE_AIC->AIC_IECR = (0x01 << AT91C_ID_PIOA);

    AT91C_BASE_PMC->PMC_PCER = (0x01 << AT91C_ID_PIOA);
}

__irq void pio_interrupt(void)
{
    u_int a;

    a = AT91C_BASE_SYS->PIOA_ISR;
    if(a & PIN)
    {
        ...
    }
    AT91C_BASE_SYS->AIC_EOICR = 0;
}
Go to the top of the page
 
+Quote Post
_4afc_
сообщение Jul 7 2008, 08:18
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 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);
}
Go to the top of the page
 
+Quote Post
Tcom
сообщение Jul 7 2008, 08:45
Сообщение #4


Местный
***

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



А возможны ли вложенные прерывания,
от разных ног?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 7 2008, 09:02
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Нет. Только в SAM7X, если ноги на разных контроллерах.
Go to the top of the page
 
+Quote Post
Tcom
сообщение Jul 7 2008, 11:26
Сообщение #6


Местный
***

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



Получается что когда происходит прерывание от PIO, нада проанализировать на какой ноге 1, и таким образом определять откуда прерывание?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 7 2008, 11:31
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Не обязательно "1" - прерывание генерируется по любому изменению уровня.
Go to the top of the page
 
+Quote Post
_4afc_
сообщение Jul 7 2008, 13:04
Сообщение #8


Профессионал
*****

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



Цитата(Tcom @ Jul 7 2008, 15:26) *
Получается что когда происходит прерывание от PIO, нада проанализировать на какой ноге 1, и таким образом определять откуда прерывание?


Надо хранить предыдущее значение PIO, тогда NEW^OLD дадут на какой ноге изменился уровень, а NEW - чему он равен.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 7 2008, 13:18
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(_4afc_ @ Jul 7 2008, 17:04) *
Надо хранить предыдущее значение PIO, тогда NEW^OLD дадут на какой ноге изменился уровень, а NEW - чему он равен.

А зачем, если есть PIO_ISR?
Go to the top of the page
 
+Quote Post
_4afc_
сообщение Jul 7 2008, 13:32
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 7 2008, 13:42
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Так и должно быть:
Цитата
1 = At least one Input Change has been detected on the I/O line since PIO_ISR was last read or since reset.

Только проще все же маску наложить, чем хранить где-то предыдущее значение.
Go to the top of the page
 
+Quote Post
_4afc_
сообщение Jul 7 2008, 14:02
Сообщение #12


Профессионал
*****

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



Цитата(aaarrr @ Jul 7 2008, 17:42) *
Так и должно быть:

Только проще все же маску наложить, чем хранить где-то предыдущее значение.


Мне показалось, что использование ISR как сигнализатора изменения, а OLD и NEW дающие разъяснение - что же изменилось - удобнее. Возможно потому, что я делал обработчик FIQ, а там всё равно свободные регистры, а событие обрабатывалось переходом по таблице, индекс получался OLD^NEW c наложением маски.
Go to the top of the page
 
+Quote Post
Tcom
сообщение Jul 8 2008, 06:02
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 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;
}
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 8 2008, 08:07
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Нет, не сработает: в PIOA_ISR будут установлены биты для тех ног, на которых просто было изменение уровня, не важно, 0->1 или 1->0.

Если нужно ловить только переход 0->1, то можно сделать так:
Код
a = AT91C_BASE_SYS->PIOA_ISR & AT91C_BASE_SYS->PIOA_PDSR;
Go to the top of the page
 
+Quote Post
uriy
сообщение Jul 8 2008, 09:33
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Если вас устроит время реакции несколько миллисекунд, вполне можно по таймеру опрашивать порт.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 27th July 2025 - 07:30
Рейтинг@Mail.ru


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