In einem Register nur einzelne Bits ändern

Gast #1798902
Lesenswert?
• ▲
▼
Hallo,

ich möchte eine Variable:

unsigned int duty_cycle

die die Werte von 0 bis 1023 annehmen kann in folgende Register 
schreiben:

CCPR1L für die höherwertigen 8 Bits und CCP1CON, wobei die Bits 
0b00xx0000 die zwei LSBs sind.

wie mache ich das jetzt am geschicktesten?

bisher habe ich es so:
1
CCPR1L = duty_cycle >> 2;
2
CCP1CON = ( 16 * (duty_cycle - (CCPR1L << 2)))  //duty cycle 2 LSBs
3
  | ( 1 * PWM_MODE );

den PWM Mode möchte man ja eigentlich nicht jedes mal neu einstellen. 
Nur wie schreib ich die Bits da rein ohne die anderen Bits zu verändern?
Gast #1799018
Lesenswert?
• ▲
▼
>wobei die Bits
>0b00xx0000 die zwei LSBs sind.
>bisher habe ich es so:
>
>CCPR1L = duty_cycle >> 2;
>CCP1CON = ( 16 * (duty_cycle - (CCPR1L << 2)))  //duty cycle 2 LSBs
>  | ( 1 * PWM_MODE );

Ja, ziemlicher Schwachsinn den Microchip da verzapft hat.

CCP1CON &= ~0x30;
CCP1CON |= (duty_cycle & 0x03) << 4;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren