Function PWM功能不断重复我不知道为什么

Function PWM功能不断重复我不知道为什么,function,pic,microchip,mplab,xc8,Function,Pic,Microchip,Mplab,Xc8,所以我在MPLABX中创建了这个程序,我主要是用它来学习用C编写代码,以备将来的项目使用。我想在函数中加入一些硬件/寄存器的内容,以保持整洁和易于阅读。由于某些原因,我的PWM功能不断重复,无论我做什么,我都无法让它运行然后停止 以下是我所拥有的: #include <xc.h> const int sineval[320] = {125, 127, 129, 131, 133, 135, 137, 139, 141, 143, 145, 14

所以我在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);



}
#包括
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};
//功能原型
void fast_sine();
void fast_sine_off();
int main(){
OSCCONbits.SCS0=0;//该值为1,将micro设置为使用内部32KHz RC振荡器,0并使用外部OSC。
OSCCONbits.SCS1=1;
TRISA=0xFF;//这个狗屎必须在main内部!!!!将整个8位寄存器A设置为输入。
TRISD=0xFF;
TRISCbits.RC0=0;
TRISCbits.RC1=0;
TRISCbits.RC4=1;
TRISCbits.RC5=1;
TRISCbits.RC6=1;
TRISB=0x00;
//设置按钮
//int pb1=PORTDbits.RD2;
//int pb2=PORTDbits.RD3;
//int pb3=PORTCbits.RC4;
//int pb4=PORTCbits.RC5;
//定义延迟函数
#定义频率20000000
//正弦波函数测试
//对于(intz=0;z<20;z++){
快速正弦函数();
//}
快速正弦关断();
/*
而(1){
//无函数正弦波
#定义频率20000000
//正弦波
PORTCbits.RC1=0;
PR2=250;//定时器2重置值。
T2CON=4;//计时器2打开。
CCP2CON=60;
CCPR2L=0;
对于(int i=0;i<319;i++){
__延期支付(49);
CCPR2L=正弦[i];
}
}
*/
//CCP2CON=0;
//__延迟时间(10);
//快速正弦函数();
/*
如果(pb4==1&&pb1==1){
快速正弦函数();
__延迟μms(100);
}  
else if(pb1==1&&CCPR2L=1){
CCPR2L=CCPR2L-1;
LATCbits.LATC0=0;
__延迟μms(100);
}
如果(pb3==1&&PR2>=40){
PR2=PR2-1;
LATCbits.LATC0=1;
__延迟时间(40);
}

否则,如果(pb4==1&&PR2您没有告诉我们如何推断正弦不停止

您已经声明了两个函数(抱歉,如果我出错了,但是代码不是很清楚,有很多注释代码),fast\u sine和fast\u sine\u off

第一次测试: 您希望先执行fast\u sine,然后执行fast\u sine\u off,您没有定义之后会发生什么,因为您让程序到达主函数的末尾

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

如果您想确保控制这一点,我建议在关闭fast\u sine\u后放置如下指令:

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
};
第二次测试: 另一方面,您可以在足够短的时间内启用看门狗定时器,使其在快正弦函数执行结束前被触发,您将看到类似的结果,无休止地执行快正弦

尝试禁用whatchdog计时器


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

我当时正在观察示波器上的正弦波,以了解see,如果它停止。我能让它停止的唯一方法是在主循环的底部添加一个无休止的空循环,但对我来说,这似乎是一个解决办法,而不是一个真正的答案。是的,我的代码是一团乱,我应该删除注释掉的东西。那是因为我尝试了很多东西,试图让它停止,再加上其他的废话。我想虽然我曾经尝试过使用和不使用watchdog,但我认为这两种方式都是循环的。我对PICs的整个硬件方面是新的,我以前用basic编译过,有很多内置函数。我想你可能已经解决了我的问题。我仍然不明白为什么我使用函数时它只循环。非常感谢你的帮助你的帮助。我的整个反应都被抹掉了,我的意思是我想让代码做几次正弦函数,然后在Main()的末尾停止。问题是它工作得很好,直到我把它变成一个函数。Main循环或不断重置