Как передать 10-битное значение в два регистра? - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь передать значение DC обоим CCPR1L, DC1B1 и DC1B0, сейчас я делаю это вручную, но есть ли способ использовать значение DC напрямую?

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

Прямо сейчас я не использую DC, потому что я не знаю, как правильно передать значение в регистры.DC - это 10-битное значение, DC1B1 и DC1B0 должны иметь биты 1 и 2, а CCPR1L должны иметь биты 3 - 10.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Попробуйте это:

void SetDCPWM1(unsigned int DC){
    CCPR1L = (DC >> 2);
    DC1B1  = (DC & 0x0002) ? 1: 0;
    DC1B0  = (DC & 0x0001) ? 1: 0;
}
0 голосов
/ 22 октября 2018

Если предположить, что 10-биты рабочего цикла ШИМ являются младшими 10-битами параметра функции, то это должно сделать то, о чем вы просили.

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

Этот код должен содержать комментарий отМайк:

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

Кроме того, два младших бита рабочего цикла ШИМ теперь обновляются в одном и том же цикле команд.

...