我正在尝试以给定的频率在CTC模式下切换OC1A引脚(PB1)。但是PB1不会切换。如果我尝试使用中断切换图钉,则一切正常,但对于我的项目,则必须使其不中断。也许我错过了什么?
我在Atmega328P上使用Arduino Nano。根据数据表:
表15-2。比较输出模式,非PWM
COM1A1 / COM1B1 COM1A0 / COM1B0说明
0 0正常端口操作,OC1A / OC1B断开。
0 1在比较匹配时切换OC1A / OC1B。
1 0比较匹配时清除OC1A / OC1B(将输出设置为低电平)。
1 1在比较匹配时设置OC1A / OC1B(将输出设置为高电平)。
如果我是对的,则可以将COM1A0位置1,并且当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 :(得分:1)
问题是您假设未设置的那些寄存器中所有位的值均为0。Arduino代码出于自身目的使用计时器,因此这不是一个好假设。您应该设置/清除所有您关心的值。
答案 1 :(得分:-1)
您忘记设置名为sei()的全局中断标志。 您的代码准备了一切,但未设置全局中断标志。 在void setup()中添加sei()以启用它,并在cli()中禁用全局中断标志。