如何将 10 位值传递给两个寄存器?
How to pass a 10 bit value to two registers?
我正在尝试将 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。
假设 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 现在在同一指令周期内更新。
试试这个:
void SetDCPWM1(unsigned int DC){
CCPR1L = (DC >> 2);
DC1B1 = (DC & 0x0002) ? 1: 0;
DC1B0 = (DC & 0x0001) ? 1: 0;
}
我正在尝试将 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。
假设 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 现在在同一指令周期内更新。
试试这个:
void SetDCPWM1(unsigned int DC){
CCPR1L = (DC >> 2);
DC1B1 = (DC & 0x0002) ? 1: 0;
DC1B0 = (DC & 0x0001) ? 1: 0;
}