int led_pin = 9;
int duty_cycle = 63; //in %
int freq_OC = 16000; //in Hz
int freq_clk = 16000000; //in Hz
int prescaler = 1;
void setup() {
//setting the port B pin (D9) as output for OC1A to override the normal port functionality
DDRB = DDRB|(1 << led_pin);
//clearing the counter/timer registers
TCCR1A = 0;
TCCR1B = 0;
//setting the prescaler 1
TCCR1B = TCCR1B|(1 << CS10);
//setting the mode 14 fast PWM
TCCR1B = TCCR1B|((1 << WGM13)|(1 << WGM12));
TCCR1A = TCCR1A|(1 << WGM11);
//setting the fast PWM in non-inverting mode
TCCR1A = TCCR1A|(1 << COM1A1);
ICR1 = (freq_clk/(freq_OC*prescaler)) - 1;
OCR1A = ICR1/(100/duty_cycle);
}
void loop() {
}
为什么当引脚 D9 被初始化为上面写的输出引脚 OC1A 时,此代码不起作用?但它适用于...
DDRB = DDRB|(1 << PB1);
有什么原因吗?就 ATMEGA328P 的数据表而言,它引用了“如果将 COM1X1:0 位中的一个或两个写入 1,OC1X 将覆盖它所连接的 I/O 引脚的正常端口功能”。那么这是否意味着 PB1(或 D9)引脚不再用作 I/O 引脚,因此我无法使用变量名称对其进行初始化?
答案 0 :(得分:0)
DDRB
是一个 8 位寄存器,其中没有第 9 位。
您将 led_pin
变量设置为 9,因此操作 DDRB = DDRB|(1 << led_pin)
无效。
ATmega328P 上没有 D9 引脚。但看起来你在谈论 Arduino 板。你可以谷歌“Arduino UNO Pinout”。例如。 this
您可以看到板子的 D9 引脚连接到 MCU 的 PB1 引脚。因此,您必须使用 DDRB |= (1 << 1)
(使用值 1,而不是 9)