如何将10位值传递给两个寄存器?

时间:2018-10-20 23:23:22

标签: c pic mplab xc8

我正在尝试将DC的值传递给CCPR1LDC1B1DC1B0,现在我是手动进行的,但是直接使用DC的值的方法?

void SetDCPWM1(unsigned int DC){
    CCPR1L = 0b01011010;
    DC1B1 = 0;
    DC1B0 = 0;
}

现在我不使用DC,因为我不知道如何正确地将值传递给寄存器。 DC是10位值,DC1B1DC1B0必须具有位1和2,CCPR1L必须具有位3-10。

2 个答案:

答案 0 :(得分:2)

尝试一下:

void SetDCPWM1(unsigned int DC){
    CCPR1L = (DC >> 2);
    DC1B1  = (DC & 0x0002) ? 1: 0;
    DC1B0  = (DC & 0x0001) ? 1: 0;
}

答案 1 :(得分:1)

假设PWM占空比的10位是功能参数的低10位,那么这应该可以满足您的要求。

void SetDCPWM1(unsigned int DC){
    CCPR1L = (DC >> 2);
    DC1B1 = 0;
    DC1B0 = 0;
    if (DC & 2) DC1B1 = 1;
    if (DC & 1) DC1B0 = 1;
}

此代码应处理Mike的评论:

void SetDCPWM1(unsigned int DC){
    CCP1CONbits.DC1B = (unsigned char)(DC) & 0x03;
    CCPR1L = (unsigned char)(DC>>2);
}

此外,PWM占空比的两个LSB现在在同一指令周期中更新。