Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Freescale 56F800/E.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры
Индеец
Здравствуйте!
Осваиваю семейство 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
repairDV
А прерывание-то чего? По порту С?
У них есть работающий пример прерываний по порту В, опробован.

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)

Думаю, для порта С должно быть аналогично.
Индеец
Цитата(repairDV @ May 19 2008, 16:23) *
А прерывание-то чего? По порту С?

Да, по порту С. Контроллер пишет в специально предназначенный для эмуляции прерывания порта регистр IASSRT, вызывая тем самым прерывание.

Цитата(repairDV @ May 19 2008, 16:23) *
У них есть работающий пример прерываний по порту В, опробован.
...
...
Думаю, для порта С должно быть аналогично.

Спасибо, буду пробовать.
Не могли бы Вы указать документ, откуда взят фрагмент кода?
repairDV
Из примеров в каталоге CodeWarrior
Нажмите для просмотра прикрепленного файла
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.