Проблема с получением Uno32 для запуска прерывания по таймеру 1 с ожидаемой частотой - PullRequest
1 голос
/ 12 июня 2019

Я пытался настроить Таймер 1 на моей плате разработки на базе pic32mx320f128h (Uno32 от Digilent).Предполагается, что тактовая частота составляет 80 МГц, что означает, что каждый тактовый цикл занимает 12,5 нс.сигнал 500 Гц должен занимать 2 000 000 нс.По этой логике это 160000 тактов.Я решил использовать прескаляр 8, чтобы 16-битный таймер 1 не переворачивался.Это должно означать, что таймер достигает значения 20000 для частоты 500 Гц.

Однако на моем осциллографе я измеряю гораздо более низкую частоту, составляющую всего 1,57 Гц

. Если я изменяю предскаляр на 1, скорость возрастает, как и ожидалось, до 1,57х8 = 12,56 Гц.Однако, если я тогда уменьшу PR1 вдвое до 9999, скорость не удваивается, в результате чего получается только 25,2 Гц

Я должен что-то здесь упустить, может кто-нибудь подсказать мне, что я могу попробовать?

Я попытался отрегулировать уровни приоритета и использовать не многовекторные прерывания, но безрезультатно. Я также попытался использовать таймер 2 с аналогичными проблемами скорости.

#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <plib.h>

#define TICKS_PER_SECOND 80000000 //80MHz

#define PIN2_TRIS TRISDbits.TRISD8
#define PIN2_BIT PORTDbits.RD8
#define PIN2_LAT LATDbits.LATD8

#define PIN3_TRIS TRISDbits.TRISD0
#define PIN3_BIT PORTDbits.RD0
#define PIN3_LAT LATDbits.LATD0

#define PINA0_TRIS TRISBbits.TRISB2
#define PINA0_BIT PORTBbits.RB2
#define PINA0_LAT LATBbits.LATB2

int8_t pwmActive = 0;


void __ISR(_TIMER_1_VECTOR, IPL5SOFT) Timer1ISR(void){

    PIN3_LAT = ~PIN3_LAT;

    IFS0bits.T1IF = 0; //set timer 1 int flag back to off
}

int main(int argc, char** argv) {



//    PIN2_TRIS = 1;
//    PINA0_TRIS = 1;
//    
//    PIN3_LAT = 0;


    INTDisableInterrupts();
    T1CONbits.TCKPS = 1; //prescale 8
    T1CONbits.TCS = 0; //80MHz internal source
    PR1 = 19999; //500Hz period
    TMR1 = 0; //start timer at 0
    T1CONbits.ON = 1; //start the timer

    IPC1bits.T1IP = 5; //int priority 5
    IPC1bits.T1IS = 0; //sub int priority 0
    IFS0bits.T1IF = 0; //set timer 1 int flag off
    IEC0bits.T1IE = 1; //enable interrupt for timer 1
    INTEnableSystemMultiVectoredInt();


    PIN3_TRIS = 0;

    while(1){

    }

    return (EXIT_SUCCESS);
}

Я ожидаю, что на частоте прямоугольной волны 500 Гц будет включенконтакт 3, но вместо этого частота намного ниже на 1,57 Гц

...