побитовые операции - PullRequest
       18

побитовые операции

0 голосов
/ 23 августа 2010
// PWM frequency:
// 0 - 48 kHz
// 1 - 12 kHz
// 2 -  3 kHz
enum { MOTOR_FREQUENCY = 1 };

// Configure Timer 2 w. 250x period.
T2CON = 1 << 2 | MOTOR_FREQUENCY /* << 0 */;

Понял ли я это правильно?

11111111 Арифметическое сдвиг влево на два из 0 или 1 или 2

Средства:

T2CON = 1 << 2 | 0 = 1111 1100    
T2CON = 1 << 2 | 1 = 1111 1000    
T2CON = 1 << 2 | 2 = 1111 0000

С уважением, Sonite

Ответы [ 3 ]

4 голосов
/ 23 августа 2010
1 << 2 = 100b

То же самое с ИЛИ:

100b | 1 = 101b
100b | 2 = 110b
3 голосов
/ 23 августа 2010

Предполагается, что вы играете с микроконтроллером с 8-битными регистрами.

0000 0001 << 2 = 0000 0100
then 
0000 0100 OR 0000 0000 = 0000 0100
-----
0000 0001 << 2 = 0000 0100
then 
0000 0100 OR 0000 0001 = 0000 0101
-----
0000 0001 << 2 = 0000 0100
then 
0000 0100 OR 0000 0010 = 0000 0110
2 голосов
/ 23 августа 2010

Контекст:

TCON2 является регистром таймера на микроконтроллерах PIC, где последние два бита конфигурируют прескалер.

TCON2 configuration register on PICs

  • T2CKPS[1:0] = 0b00 = 0 => / 1 прескалер
  • T2CKPS[1:0] = 0b01 = 1 => / 4 прескалер
  • T2CKPS[1:0] = 0b1x = 2 или 3 => / 16 прескалер

Бит 2 фактически включает таймер, поэтому его всегда нужно настраивать на что-либо, следовательно, 1 << 2 (который действительно должен быть записан как 1 << T2CON_TMR2ON_bit с T2CON_TMR2ON_bit, определенным в некотором заголовке конфигурации процессора)

Все сказано и сделано, три параметра: 0b100, 0b101 и 0b110, которые включают таймер и настраивают прескалер, чтобы получить частоты, упомянутые в комментариях.

Кроме того, использование enum с одним элементом практически бессмысленно; используйте #define.

...