Lỗi các hàm ngắt

bigboy061293

Thành Viên PIF
Dạo này khi code cho launchpad, em thường xuyên gặp tình trạng chương trình bĩ nhảy vào hàm FaultISR(void) (hình như là hàm lỗi ngắt). Lúc chạy được, lúc không. Chương trình dùng 3 ngắt là timer, adc, uart. Có ai biết trường hợp này không ?
 

honghiep

Cố Vấn CLB
Staff member
Dạo này khi code cho launchpad, em thường xuyên gặp tình trạng chương trình bĩ nhảy vào hàm FaultISR(void) (hình như là hàm lỗi ngắt). Lúc chạy được, lúc không. Chương trình dùng 3 ngắt là timer, adc, uart. Có ai biết trường hợp này không ?
Việc chương trình nhảy vào FaultISR có nhiều nguyên nhân
Nguyên nhân hay gặp nhất là chưa enable các peripheral sử dụng trong chương trình hoặc config chưa đủ cho các peripheral
 

bigboy061293

Thành Viên PIF
đã tìm ra chổ sai nhưng chưa biết nguyên nhân, cụ thể là như vầy

Code:
void Timer0IntHandler(void) // ngat timer
{
// Clear the timer interrupt
 
    TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
 
 
    if (abcd>15)
        {
            abcd = 0;
            board<<=1;
            if (board > 64)
                {
                    board = 4;
                    boardNum = -1;
 
                }
         
 
//GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6,~(int)pow((float)2,(float)board)); --> chổ này bị lỗi
            GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6,~board);
 
        }
        GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3,abcd);
        abcd++;
        boardNum++;
        putXySerial(boardNum,adcResult);
     
}
khi chạy dòng đó mà để timer ngắt > 1000khz thì chương trình nhảy vào FaultISR ngay. Ông biết tại sao không honghiep ?
 

honghiep

Cố Vấn CLB
Staff member
Cho mình coi cái code phần config clock với config timer được không?
 

bigboy061293

Thành Viên PIF
Cho mình coi cái code phần config clock với config timer được không?

Code:
void initTimer()
{
    //timer base + interrupt : can sua trong ccsstartup phan ngat, ham ngat cho timer0a
        SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
        TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_TIMER); // sua lai TIMER_CFG_32_BIT_TIMER thay vi TIMER_CFG_32_BIT_PER
 
 
        per = (SysCtlClockGet() /  1000); //cho timer quet 1Khz
     
        TimerLoadSet(TIMER0_BASE, TIMER_A, per -1);
        IntEnable(INT_TIMER0A_BLIZZARD); // sua lai co them phan _BLIZZARD thay vi INT_TIMER0A
        TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
 
        TimerEnable(TIMER0_BASE, TIMER_A);
 
}
clock thì config như trong cái workbook á
hiện tại thì tui bỏ dòng đó, thay bằng dòng dưới thì nó chạy được. Có thể do kiểu số thực ?
 

honghiep

Cố Vấn CLB
Staff member
Mình nghĩ là do trong ngắt timer chạy hơi nhiều so với tần số vào ngắt. Khi tính toán kiểu float MCU sẽ tính lâu hơn dẫn đến việc chương trình ngắt vào liên tục. Trong chế độ debug MCU cũng xử lí chậm hơn so với khi chạy realtime nên dễ nhảy vào FaultISR.
Khi thoát debug chương trình có thể chạy được, tuy nhiên để đảm bảo chương trình chạy đúng mình thấy nên hạn chế xử lí những việc không cần thiết trong ngắt
 
Top