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

 
 
2 страниц V   1 2 >  
Closed TopicStart new topic
> Прерывания в AT91SAM7S, Помогите!!!Я в очаянии....
DAPA
сообщение Oct 17 2009, 13:12
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 4-03-09
Пользователь №: 45 664



1111493779.gif wassat.gif Привет Всем. Помогите, уже несколько дней мучаюсь на д прерыванием IRQ1 в AT91SAM7S256, перепробовал уйму вариантов, увы wassat.gif 1111493779.gif
Вот один из вариантов:

CODE
#include "Board.h"

#define EXT_OC 18432000 // Exetrnal ocilator MAINCK
#define MCK 48054857
//=================================================================
#define IRQ_1 (1<<30)
#define LED_1 (1<<26)
///////////////////////////////////////////////////////////////////
#define IRQ1_INTERRUPT_LEVEL 5

char flag = 0;
char dum;
//обработчик прерывания от IRQ1
void button(void){

AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LED_1);
/*
if( flag ==1 )
{
AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LED_1);
flag = 0;
}
else
{
AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, LED_1);
flag = 1;
};
*/
dum = AT91C_BASE_PIOA->PIO_ISR;//разрешить следующее прерывание IRQ1(сброс ВСЕХ прерываний)
dum = dum;
};
//инициализация внешнего прерывания на линии IRQ1
void irq_interrupt_init(void){

AT91F_PIO_CfgInput(AT91C_BASE_PIOA, IRQ_1);
AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, IRQ_1, 0);
AT91F_PIO_CfgInputFilter(AT91C_BASE_PIOA, IRQ_1);//включение входного фильтра для линии IRQ1

AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, AT91C_ID_IRQ1 );
AT91C_BASE_AIC->AIC_IDCR = (1<<31);
AT91C_BASE_AIC->AIC_SMR[31] = (0x1<<5)|(0x6);
AT91C_BASE_AIC->AIC_SVR[31] = (unsigned int)button;
AT91C_BASE_AIC->AIC_IECR = (1<<31);
// AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_IRQ1, 2, 2, button);
//идентификатор устройства, приоритет, тип чувствительности, указателт на обработчик
// AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_IRQ1);
};

int main( void ){
AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5<<24);

AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, LED_1);

irq_interrupt_init();

for (;;)
{


}
}
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 17 2009, 15:49
Сообщение #2


Гуру
******

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



Цитата(DAPA @ Oct 17 2009, 17:12) *
dum = AT91C_BASE_PIOA->PIO_ISR;//разрешить следующее прерывание IRQ1(сброс ВСЕХ прерываний)

Это сброс прерывания PIO, к внешним IRQx никакого отношения не имеет.
Еще забыли запись AIC_EOICR в конце обработки прерывания.

Цитата(DAPA @ Oct 17 2009, 17:12) *
AT91F_PIO_CfgInputFilter(AT91C_BASE_PIOA, IRQ_1);//включение входного фильтра для линии IRQ1

Входной фильтр распространяется только на модуль PIO, к периферийным входам пин всегда подключен напрямую.

Цитата(DAPA @ Oct 17 2009, 17:12) *
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, AT91C_ID_IRQ1 );

В этом тоже нет необходимости.

Если честно, не вижу причин почему бы прерыванию не срабатывать.
Не забыли ли включить прерывания глобально?
Как организована обработка вектора (0x18) прерывания?
Go to the top of the page
 
+Quote Post
DAPA
сообщение Oct 17 2009, 17:18
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 4-03-09
Пользователь №: 45 664



Прошу прощения, разве глобальные прерывания разрешаются не в регистрах AIC?

AT91C_BASE_AIC->AIC_IECR = (1<<31);

Цитата
Как организована обработка вектора (0x18) прерывания?

Что это за вектор прерывания, и зачем его обрабатывать?
Ведь номер вектора соответствует номеру переферии: (0x18)=24.
А векторы с 15 по 29 зарезервированы.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 17 2009, 18:01
Сообщение #4


Гуру
******

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



Цитата(DAPA @ Oct 17 2009, 21:18) *
Прошу прощения, разве глобальные прерывания разрешаются не в регистрах AIC?

Нет, разрешаются битом I регистра PSR.

Цитата(DAPA @ Oct 17 2009, 21:18) *
Что это за вектор прерывания, и зачем его обрабатывать?

Вектор, на который процессор переходит по сигналу nIRQ. Вектора AIC'а совсем из другой оперы.
Go to the top of the page
 
+Quote Post
DAPA
сообщение Oct 17 2009, 19:01
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 4-03-09
Пользователь №: 45 664



Цитата
Вектор, на который процессор переходит по сигналу nIRQ. Вектора AIC'а совсем из другой оперы.

Процессор переходит на него по ЛЮБОМУ сигналу nIRQ?
И зачем его обрабатывать в этом случае?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 17 2009, 19:12
Сообщение #6


Гуру
******

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



Цитата(DAPA @ Oct 17 2009, 23:01) *
Процессор переходит на него по ЛЮБОМУ сигналу nIRQ?
И зачем его обрабатывать в этом случае?

У процессора ARM7TDMI есть только две линии прерываний - nIRQ и nFIQ. При получении сигнала по первой, он переходит на вектор 0x18, по второй - на вектор 0x1C.
AIC является лишь надстройкой над родной системой прерываний.
Вот я и пытаюсь выяснить, что в вашей программе накручено по адресу 0x18.
Go to the top of the page
 
+Quote Post
DAPA
сообщение Oct 17 2009, 19:15
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 4-03-09
Пользователь №: 45 664



Цитата
Нет, разрешаются битом I регистра PSR.

В даташите сказано что регистр PSR тоько для чтения
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 17 2009, 19:20
Сообщение #8


Гуру
******

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



Цитата(DAPA @ Oct 17 2009, 23:15) *
В даташите сказано что регистр PSR тоько для чтения

Вы часом CPSR/SPSR с PIO_PSR не путаете, а?
Go to the top of the page
 
+Quote Post
DAPA
сообщение Oct 17 2009, 19:43
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 4-03-09
Пользователь №: 45 664



Я ничего не делал с адресом 0x18, просто в литературе на эту тему ни чего не нашёл.
(я только начинаю разбираться с ARM, пока что освоил, только: таймер(режим генератора), вывод синхросигналов на PCKn и PWM) laughing.gif
А прерывания nIRQ, необходимо для приёма стробов от внешнего устройства, с частотой, примерно, 20000 выборок в секунду.

Цитата
Вы часом CPSR/SPSR с PIO_PSR не путаете, а?

Я имел в виду PIO_PSR.

Да, и подскажите, пожалуйсто, алгоритм настройки какого либо устройства в составе AT91SAM7S
(если можно, на примере раннее описаной проблемы) unsure.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 17 2009, 19:48
Сообщение #10


Гуру
******

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



Цитата(DAPA @ Oct 17 2009, 23:43) *
Я ничего не делал с адресом 0x18, просто в литературе на эту тему ни чего не нашёл.

Почитайте вот этот документ. Собственно с него и стоило начинать изучение.
Go to the top of the page
 
+Quote Post
DAPA
сообщение Oct 17 2009, 20:38
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 4-03-09
Пользователь №: 45 664



Пардон, а не подскажите как в IAR называется регистр CPSR( что-то вроде AT91.._BASE_CPSR)?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 17 2009, 21:04
Сообщение #12


Гуру
******

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



Цитата(DAPA @ Oct 18 2009, 00:38) *
Пардон, а не подскажите как в IAR называется регистр CPSR( что-то вроде AT91.._BASE_CPSR)?

Никак он не называется. Доступ к нему из-под "C" возможен только с помощью intrinsic-функций или asm-вставок.
Go to the top of the page
 
+Quote Post
DAPA
сообщение Oct 17 2009, 22:20
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 4-03-09
Пользователь №: 45 664



Кстати о регистре CPSR, в файле Cstartup.s обнаружил следующее:
...
I_BIT DEFINE 0x80
F_BIT DEFINE 0x40
...
;- Disable Interrupt and switch back in IRQ mode
msr CPSR_c, #I_BIT | IRQ_MODE
...
Go to the top of the page
 
+Quote Post
DAPA
сообщение Oct 18 2009, 15:51
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 4-03-09
Пользователь №: 45 664



Урррррааааааа!!!!
Заработало.
Всё оказалось элементарно, необходимо было ипользовать intrinsic функцию:

__enable_interrupt();

Которая, как и говорилось, глобально влючает прерывания.

08.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif 08.gif
Go to the top of the page
 
+Quote Post
DAPA
сообщение Oct 18 2009, 19:28
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 4-03-09
Пользователь №: 45 664



laughing.gif Прошу прощения, что не по адресу laughing.gif
А как закрыть тему?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 15:08
Рейтинг@Mail.ru


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