-1

所以我在 MPLABX 中创建了这个程序,我主要使用它来学习用 C 语言编写未来的项目。我想将一些硬件/寄存器的东西放入函数中,以保持整洁和易于阅读。出于某种原因,我的 PWM 功能不断重复,尽管我做了什么,但我无法让它运行然后停止。

这是我所拥有的:

    #include <xc.h>








        const int sineval[320] = {125, 127, 129, 131, 133, 135, 137, 139, 141, 143, 145, 146, 148, 150, 152, 
154, 156, 158, 160, 161, 163, 165, 167, 169, 170, 172, 174, 176, 177, 179, 181, 182, 184, 185, 187, 
188, 190, 191, 193, 194, 196, 197, 198, 200, 201, 202, 204, 205, 206, 207, 208, 209, 210, 211, 212, 
213, 214, 215, 216, 217, 217, 218, 219, 219, 220, 221, 221, 222, 222, 223, 223, 223, 224, 224, 224, 
225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 224, 224, 224, 223, 223, 223, 222, 222, 221, 
221, 220, 219, 219, 218, 217, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, 204, 
202, 201, 200, 198, 197, 196, 194, 193, 191, 190, 188, 187, 185, 184, 182, 181, 179, 177, 176, 174, 
172, 170, 169, 167, 165, 163, 161, 160, 158, 156, 154, 152, 150, 148, 146, 145, 143, 141, 139, 137, 
135, 133, 131, 129, 127, 125, 123, 121, 119, 117, 115, 113, 111, 109, 107, 105, 104, 102, 100, 98, 
96, 94, 92, 90, 89, 87, 85, 83, 81, 80, 78, 76, 74, 73, 71, 69, 68, 66, 65, 63, 62, 60, 59, 57, 56, 
54, 53, 52, 50, 49, 48, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 33, 32, 31, 31, 30, 
29, 29, 28, 28, 27, 27, 27, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 27, 
27, 27, 28, 28, 29, 29, 30, 31, 31, 32, 33, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 
48, 49, 50, 52, 53, 54, 56, 57, 59, 60, 62, 63, 65, 66, 68, 69, 71, 73, 74, 76, 78, 80, 81, 83, 85,
87, 89, 90, 92, 94, 96, 98, 100, 102, 104, 105, 107, 109, 111, 113, 115, 117, 119, 121, 123};

        //function prototypes
        void fast_sine();
        void fast_sine_off();

        int main() {






    OSCCONbits.SCS0 = 0;    //This as 1 sets the micro to use the internal 32KHz RC Oscillator, 0 and it uses external OSC.
    OSCCONbits.SCS1 = 1;
    TRISA = 0xFF;           //This shit has to be inside main!!!! Setting the whole 8 bit register A to inputs.
    TRISD = 0xFF;
    TRISCbits.RC0 = 0;
    TRISCbits.RC1 = 0;
    TRISCbits.RC4 = 1;
    TRISCbits.RC5 = 1;
    TRISCbits.RC6 = 1;
    TRISB = 0x00;












    //Setup Buttons      
    //int pb1 = PORTDbits.RD2;
    //int pb2 = PORTDbits.RD3;
    //int pb3 = PORTCbits.RC4;
    //int pb4 = PORTCbits.RC5;     

    //define for delay funtion
    #define _XTAL_FREQ 20000000  




    //sinewave function test

    //for (int z = 0; z < 20; z++){
    fast_sine();

    //}

    fast_sine_off();





    /*
    while (1) {

        //sinewave without function
        #define _XTAL_FREQ 20000000
        //Sine wave
        PORTCbits.RC1 = 0;
        PR2 = 250; //Timer2 reset value.
        T2CON = 4; //TIMER 2 ON.
        CCP2CON = 60;
        CCPR2L = 0;
        for (int i = 0; i < 319; i++) {
            __delay_us(49);
            CCPR2L = sineval[i];
        }
    }
    */



    //CCP2CON = 0;
    //__delay_ms(10);
    //fast_sine();


    /*

     if (pb4 == 1 && pb1 == 1 ){
        fast_sine();
     __delay_ms(100);  
    }  

     else if (pb1 == 1  && CCPR2L <= 13) {
     CCPR2L = CCPR2L + 1; 
     LATCbits.LATC0 = 1;
     __delay_ms(100); 
     }


     else if (pb2 == 1 && CCPR2L >= 1  ){
     CCPR2L = CCPR2L - 1;
     LATCbits.LATC0 = 0;
    __delay_ms(100); 
     }

     else if (pb3 == 1 && PR2 >= 40){             
     PR2 = PR2 - 1;
     LATCbits.LATC0 = 1;
     __delay_ms(40); 
     }

    else if (pb4 == 1 && PR2 <= 133 ){           
     PR2 = PR2 + 1; 
     LATCbits.LATC0 = 0; 
     __delay_ms(40); 
    }

     */

    //} 

}

void fast_sine() {

        //#define _XTAL_FREQ 20000000
        //Sine wave
        PORTCbits.RC1 = 0;
        PR2 = 250; //Timer2 reset value.
        T2CON = 4; //TIMER 2 ON.
        CCP2CON = 60;
        CCPR2L = 0;
        for (int i = 0; i < 319; i++) {
        __delay_us(49);
        CCPR2L = sineval[i];
        }
    LATCbits.LATC0 = 0;


 }



void fast_sine_off(){

        //Sine wave off
        PORTCbits.RC1 = 0;
        LATCbits.LATC0 = 0;
        TRISCbits.RC1 = 1;
        PR2 = 0; //Timer2 reset value.
        T2CON = 0x00; //TIMER 2 ON.
        CCP2CON = 0x00;
        CCPR2L = 0;
        LATCbits.LATC0 = 1; 
        __delay_ms(10);
        LATCbits.LATC0 = 0; 
        __delay_ms(10);



}
4

1 回答 1

0

您还没有告诉我们如何推断正弦不停止。

你已经声明了两个函数(对不起,如果我错了,但代码不是很清楚,很多注释代码),fast_sine 和 fast_sine_off。

第一个测试:您希望先执行 fast_sine 然后执行 fast_sine_off,您还没有定义之后会发生什么,因为您让程序到达 main 函数的末尾。

在 HiTech 和新的 XC 编译器中,这会导致执行结束,但由于这不是从终端调用的程序,因此执行结束通常会导致受控或不受控的复位。由于您正在使用的 PIC 将重新启动,您可能会看到主代码无休止地重复。

如果你想确保控制它,我建议在调用 fast_sine_off 之后放置这样的指令:

while(true){ // if true is not recognized you an place while(1){
 CLRWDT(); // just in case you have enabled watchdog timer, refresh it so you don't let it reset the CPU
};

第二次测试:另一方面,您可以在足够短的时间内启用看门狗定时器,使其在达到 fast_sine 函数执行结束之前被触发,您将看到类似的结果,无休止地执行 fast_sine。

尝试禁用 whatchdog 计时器。

在这两种情况中的任何一种情况下,我都建议您尝试在 PICKIT3 或类似工具上模拟代码,或者回退到 MPLAB 模拟器,并验证您的代码是否达到了 sine_off 函数。如果您使用任何 ICD 工具甚至模拟器进行调试,您可能会很快发现问题。

于 2015-11-03T11:27:02.903 回答