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

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top