Например TDA7294

Форум РадиоКот :: Просмотр темы - PIC32 обработчик прерывания "не успевает"
Форум РадиоКот
https://radiokot.ru/forum/

PIC32 обработчик прерывания "не успевает"
https://radiokot.ru/forum/viewtopic.php?f=58&t=137381
Страница 1 из 1

Автор:  kaws03 [ Сб окт 29, 2016 20:17:39 ]
Заголовок сообщения:  PIC32 обработчик прерывания "не успевает"

Всем доброго вечера.
В программировании PIC новичок, всего пару месяцев "играюсь".
Имеется МК PIC32MX440F256H и задача для него
Задача состоит в выдаче импульсов на двух ножках (позже они будут положительным и отрицательным) с заданными временными параметрами (К примеру 1- Положительный импульс = 4мкс, 2- Задержка до отрицательного = 5мкс, 3- Отрицательный импульс= 2мкс, 4- финальная задержка, для обеспечения заданной частоты импульсов). Но это, впрочем, не так важно.
МК работает на 80mhz (проверено)
Проблема в том, что при установке времени в 1мкс- вся эта хубалда зависает (а точнее только таймер), не смотря на то, что обработка прерывания происходит всего за 5 строк кода
Код:
void setOuts(){
    LATDbits.LATD1 = signalStates[curStep][0];
    LATGbits.LATG6 = signalStates[curStep][1];
}

void signalProcessor(){
    curStep = signalSequence[curStep]; //Picking up next state number
   
    setOuts();                                      //Setting outs with new state
   
    PR4 = signalDelaysInt[curStep];         //Setting timing of next state
}

void __ISR(_TIMER_5_VECTOR, IPL3SOFT) signalIntHandler (void){
    signalProcessor();
   
    IFS0bits.T5IF = 0;                         //Reset interrupt flag
}

По-идее, чисто математически, время обработки не должно превышать и 0,07 мкс (чего хватает с головой). Ведь насколько я понял из даташита МК выполняет машинный цикл за один период частоты
Так выглдит инициализация
Код:
//setup clock  = 80000000
   
    #pragma config FPLLMUL  = MUL_16        // PLL Multiplier
    #pragma config FPLLIDIV = DIV_2         // PLL Input Divider
    #pragma config FPLLODIV = DIV_1         // PLL Output Divider
    #pragma config FPBDIV   = DIV_1         // Peripheral Clock divisor
    #pragma config POSCMOD  = HS            // Primary Oscillator
    #pragma config FSOSCEN  = OFF           // Secondary Oscillator Enable (KLO was off)
    #pragma config FNOSC    = PRIPLL        // Oscillator Selection

    // setup pbdiv, pre-fetch cache and wait time
    SYSTEMConfigPerformance(80000000);


Других прерываний в системе нет, остальное крутится в мейне (опрос клавиатуры и вывод на дисплей)

Подскажите, пожалуйста, куда копать

Автор:  Аlex [ Сб окт 29, 2016 21:22:03 ]
Заголовок сообщения:  Re: PIC32 обработчик прерывания "не успевает"

А время входа в прерывание и выхода из него не считаете ? А сохранение и восстановление контекста ? Посмотрите дизасм и будете неприятно удивлены.
И ещё. Где Вы насчитали 0.07 мкс ? Вы каждую строку кода считаете за 1 МЦ ?
0.07 us (на кругло возьмём 0.1 us) - это 8 тактов МК. 8 тактов будет занимать только одна строка :
Код:
LATDbits.LATD1 = signalStates[curStep][0];
Если не больше.

Опять же - смотрите дизасм, шагайте по коду, используйте stopwach, ... В общем, весь инструмент у Вас в руках...

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/