Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: вопрос по LPC2138
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
tolik_zp
почему не работает прерывание от таймера? код такой:

T0PR=1000;
T0TCR=2;
T0MCR=3;
T0MR0=100000;
T0TCR=1;
VICIntSelect=(1<<4);
VICIntEnable=(1<<4);

обработчик:
#pragma vector=0x1C
__fiq __arm void FIQ_ISR_Handler (void)
{
IO0SET=(1<<31);
for (int j=0;j<3;j++);
IO0CLR=(1<<31);
T0MR0=10000;
T0IR=2;
}

в памяти по адресу 0x1c действительно находится переход на обработчик.


RTFM блин.... особенно первые страницы smile.gif
zltigo
Если бы дали себе труд по-человечески описать биты, то ошибки и не было.
Как Вы думаете, очень интересно копаться в россыпи мутных 1,2,3.... даже если хочется помочь?
Код
T0PR=1000;
T0TCR=TCR_RESET;
T0MCR=(MCR_MR0INT | MCR_MR0RES);
T0MR0=100000;
T0TCR=TCR_ENABLE;
VICIntSelect |=(1<<VIC_TIMER0); // !!! потенциальный bug
VICIntEnable=(1<<VIC_TIMER0);

обработчик:
#pragma vector=0x1C
__fiq __arm void FIQ_ISR_Handler (void)
{
volatile int j;
IO0SET=(1<<31);
//for (int j=0;j<3;j++);  // Да не будет этого цикла - будет j = 3 :)
for (j=0;j<3;j++);
IO0CLR=(1<<31);
//T0MR0=10000;   Лишнее
T0IR=IR_MR0INT; // Bug!!! было IR_MR1INT
}
tolik_zp
спасибо за совет, обязательно прийму к сведению.
вобщем прерывание у меня заработало - я просто забыл включить его в CPSR.
теперь другая проблема. по таймеру прерывание срабатывает, но обработчик ведет себя очень странно. есть следующий код:

#pragma vector=0x1C
__fiq __arm void Timer0Int (void)
{
volatile int r,g;

for (g=0;g<100000;g++)
{
IO0SET=(1<<31);
for (r=0;r<1000;r++);
IO0CLR=(1<<31);
for (r=0;r<1000;r++);
}

при прерывании от таймера пару раз дергается нога р0.31, после чего все безвозвратно виснет. что за чудеса?
Может в настройках иара надо что-то сделать? я там ничего не менял, кроме формата выходного файла. Работаю все время в режиме администратора. Может в линкере проблема? Вот кусок скрипта линкера:

-D_CSTACK_SIZE=1000
-D_IRQ_STACK_SIZE=400
-D_FIQ_STACK_SIZE=200
-D_SVC_STACK_SIZE=200
-D_ABT_STACK_SIZE=0
-D_UND_STACK_SIZE=0
-D_HEAP_SIZE=2000

-Z(DATA)CSTACK+_CSTACK_SIZE=RAMSTART-RAMEND
-Z(DATA)IRQ_STACK+_IRQ_STACK_SIZE=RAMSTART-RAMEND
-Z(DATA)FIQ_STACK+_FIQ_STACK_SIZE=RAMSTART-RAMEND
-Z(DATA)SVC_STACK+_SVC_STACK_SIZE=RAMSTART-RAMEND
-Z(DATA)ABT_STACK+_ABT_STACK_SIZE=RAMSTART-RAMEND
-Z(DATA)UND_STACK+_UND_STACK_SIZE=RAMSTART-RAMEND
-Z(DATA)HEAP+_HEAP_SIZE=RAMSTART-RAMEND




и еще вот что. если из обработчика все убрать, т.е. в нем только сброс флага, то все работает нормально. такое впечатление, что что-то не то с регистрами.
jorikdima
а в main() бесконечный цикл то есть??

А вообще я правильно понимаю, что вы просто поморгать диодиком хотите? В этом случае у вас не разумно построен код- в обработчике таких больших задержек не делают. Надо в обработчике делать XOR пина, а не ждать 2 раза по 1000
tolik_zp
Цитата(jorikdima @ Apr 19 2007, 16:37) *
а в main() бесконечный цикл то есть??


есть. в нем моргает светодиод. но после первого входа в прерывание (если оно не пустое), то светодиод перестает моргать насовсем.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.