gpt4 book ai didi

c - 引脚在 CTC 模式下无法切换

转载 作者:行者123 更新时间:2023-11-30 19:26:11 25 4
gpt4 key购买 nike

我正在尝试以给定频率将 OC1A 引脚 (PB1) 切换为 CTC 模式。但 PB1 不会切换。如果我尝试使用中断来切换引脚,则一切正常,但对于我的项目,有必要使其不中断。也许我错过了什么?

我在 Atmega328P 上使用 Arduino Nano。根据数据表:

Table 15-2. Compare Output Mode, non-PWM

COM1A1/COM1B1 COM1A0/COM1B0 Description

0 0 Normal port operation, OC1A/OC1B disconnected.

0 1 Toggle OC1A/OC1B on compare match.

1 0 Clear OC1A/OC1B on compare match (set output to low level).

1 1 Set OC1A/OC1B on compare match (set output to high level).

如果我是对的,可以设置 COM1A0 位,并且当 TCNT1 达到 TOP 值时 OC1A 将切换。但在我的代码中它不起作用:

#include <Arduino.h>

void setup() {
DDRB |= (1<<PB1);
PORTB &= ~(1<<PB1);
TCCR1B |= (1<<CS11)|(1<<WGM12); //prescaler 8 CTC mode with TOP on OCR1A
TCCR1A |= (1<<COM1A0); //toggle PB1
TCNT1 = 0;
OCR1A = 30000;
}

void loop() {

}

如果我使用中断端口进行切换,但 OCR1A 的更改对频率没有影响。

#include <Arduino.h>

void setup() {
DDRB |= (1<<PB1);
PORTB &= ~(1<<PB1);
TCCR1B |= (1<<CS11)|(1<<WGM12); //prescaler 8 CTC mode with TOP on OCR1A
TCCR1A |= (1<<COM1A0); //toggle PB1
TCNT1 = 0;
OCR1A = 30000;
TIMSK1 |= (1<<OCIE1A);
}

void loop() {

}

ISR(TIMER1_COMPA_vect)
{
PINB = (1<<PB1);
}

在 CTC 中使用 OCR1A 作为 TOP 时是否可以切换 OC1A?或者我必须使用 WGM13:0=12 和 ICR1 作为 TOP?

最佳答案

问题是您假设那些寄存器中您未设置的所有位的值都是 0。Arduino 代码将计时器用于其自身目的,因此这不是一个好的假设。您应该设置/清除您关心其值的所有位。

关于c - 引脚在 CTC 模式下无法切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57846605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com