opérations au niveau du bit
-
30-09-2019 - |
Question
// 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 */;
Ai-je compris ce droit?
11111111 Arithmetic gauche-shift-by-deux de 0 ou 1 ou 2
Moyens:
T2CON = 1 << 2 | 0 = 1111 1100
T2CON = 1 << 2 | 1 = 1111 1000
T2CON = 1 << 2 | 2 = 1111 0000
Cordialement, Sonite
La solution
Contexte:
TCON2
est un registre de minuterie PIC MCUs, où les deux derniers bits configurer le prédiviseur.
-
T2CKPS[1:0]
=0b00
= 0 => / 1 prédiviseur -
T2CKPS[1:0]
=0b01
= 1 => / 4 prédiviseur -
T2CKPS[1:0]
=0b1x
= 2 ou 3 => / 16 prédiviseur
Bit 2 passe effectivement la minuterie, il doit toujours être réglé sur quoi que ce soit, d'où le 1 << 2
(qui devrait vraiment être écrit 1 << T2CON_TMR2ON_bit
avec T2CON_TMR2ON_bit
étant défini dans une tête CPU configuration)
Tout compte fait, les trois paramètres sont 0b100
, 0b101
et 0b110
, qui dépendent de la minuterie et le tweak prédiviseur pour obtenir les fréquences mentionnées dans les commentaires.
En outre, en utilisant un enum
avec un élément est à peu près inutile; utilisation #define
.
Autres conseils
1 << 2 = 100b
avec le OU:
100b | 1 = 101b
100b | 2 = 110b
En supposant que vous jouez avec un microcontrôleur avec des registres 8 bits.
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