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

 
 
> Freescale 56F800/E., Нет перехода в обработчик прерывания 56F8013.
Индеец
сообщение May 19 2008, 11:25
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 20
Регистрация: 10-05-07
Из: spb
Пользователь №: 27 634



Здравствуйте!
Осваиваю семейство 56F800/E. Не удается активировать механизм прерываний на кристалле. Кто работает с этим семейством, помогите пожалуйста разобраться - уже не первый день ломаю голову, все даташиты прочитал wacko.gif .
Девайс: 56F8013. CW Development Studio v.8.0.

Тестовая программа при установке f_event = true, устанавливает бит в регистре IASSRT порта C, чем вызывает software interrupt.

Через отладчик видно:
1. Bit0 регистра IASSRT действительно устанавливается - Ok. Что приводит:
1.1. Устанавливается bit0 регистра IPEND - Ok.
1.2. Сбрасывается в 0 соответствующий номеру вектора прерывания (23) bit регистра IRQP1 - Ok.
2. Однако не устанавливается bit INT регистра ICTRL, говорящий о том, что interrupt is being sent to the 56800E core - NOT Ok.
3. Bit INT_DIS регистра ICTRL, запрещающий все прерывания не установлен - Ok.
4. Перехода в программу-обработчик прерывания не происходит.

Фрагмент кода:
Цитата
Код
#define PC_BASE__    0xF120
#define PC_IASSRT    *(unsigned short volatile *)(PC_BASE__ + 4)

volatile int w_dummy;
volatile bool f_event;
#pragma interrupt off

void main (void)
{
    ioctl(SYS, SYS_INIT, NULL);
    ioctl(INTC, INTC_INIT, NULL);
    
    ioctl(GPIO_A, GPIO_INIT, NULL);
    ioctl(GPIO_B, GPIO_INIT, NULL);
    ioctl(GPIO_C, GPIO_INIT, NULL);
    ioctl(GPIO_D, GPIO_INIT, NULL);
    
    while(1)
    {
        if(f_event)                        //устанавливается в отладчике                
        {
            f_event = false;                                      
            PC_IASSRT |= 0x01;                     //вызов software interrupt
        }
    }
}

#pragma interrupt on
void ISR_test(void)
{
    w_dummy++;
}
#pragma interrupt reset


В Graphic Configuration Tool в разделе INTC - Interrupt Controller указал имя обработчика прерывания и приоритета, на что в файле appconfig.h добавились строки:
Цитата
Код
#define INTC_ICTL_INIT                    0x0000
#define INT_VECTOR_ADDR_23                ISR_test
#define INT_PRIORITY_LEVEL_23             INTC_LEVEL1

Ну что ему не нравится???!!! sad.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
repairDV
сообщение May 19 2008, 12:23
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 578
Регистрация: 7-11-06
Из: Хабаровск
Пользователь №: 22 044



А прерывание-то чего? По порту С?
У них есть работающий пример прерываний по порту В, опробован.

asm (bfclr #$0300,sr); /* allow lowest priority */
asm (bfset #$C000,X:IPR1); /* turn on GPIO B ISR level 2 priority */
asm(bfset #$0020,X:GPIO_B_IENR); /* set bits in interrupt enable reg */


void gpioB_ISR(void)
{
unsigned int * pGPIO_B_IESR = (unsigned int *)GPIO_B_IESR;

/* debounce key with delay for simplicity, disadvantage:
1. high latency
2. no repoll of switch state after deounce delay */

if (((*pGPIO_B_IESR) & 0x0020) == 0x0020)
{
delay ();

/* Standard C library call */
// puts("GPIO_B_IESR detected: EVM pushbutton #2");
asm(move.w #$0020,X:GPIO_B_IESR); /* clear IESR */
}

}

В файле "MC56F801x_vector_isr_led.asm.asm" записано:

jsr >FgpioB_ISR ; GPIO B ($30)

Думаю, для порта С должно быть аналогично.


--------------------
Маленький нанайца. А-а. А-а. Оморочком плыл. Маленький проточка. Осетра ловил.
Go to the top of the page
 
+Quote Post



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

 


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


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