因此,我尝试在Atmega644 MCU的XTAL1和XTAL2引脚之间放置一个16 MHz的晶体振荡器。但是我不起作用。
我先定义
volatile unsigned int input_timer = 150;
ISR (TIMER0_COMPA_vect) {
if (input_timer>0){
input_timer--;
}
}
我已经按照以下步骤启动了计时器
TIMSK0 = (1 << OCIE0A); //Compare match enabled
TCCR0A = (1 << WGM01); //CTC mode
TCCR0B = ~(1 << CS02) | (1 << CS01) |( 1 << CS00); //DIVIDE 64
OCR0A = 125;
为了测试是否有效,我正在执行以下操作
int p = 0;
while(1)
{
if (input_timer == 0) {
lcd_clrscr();
char c[7]
itoa(p,c,10);
lcd_puts(c);
p++;
}
所以基本上,每次计数器从150倒数到0时,我都会一次更新LCD屏幕。如果是16 MHz的osc,应该每隔(16e6 /(150 * 125 * 64)= 13.3更新/秒
如果使用F_CPU完成,则应该每隔(1e6 /(125 * 150 * 64))= 0.83次更新/秒发生一次,这就是现在发生的情况。
那么,我实际上如何在XTAL1和XTAL2引脚上正确实现振荡器。应该注意的是,我现在没有使用正确的去耦电容器,不确定是否有问题。
答案 0 :(得分:1)
您还需要设置保险丝,以使您的微型麦克风正在使用外部时钟。
答案 1 :(得分:0)
您的问题在这里TCCR0B = ~(1 << CS02) | (1 << CS01) |( 1 << CS00); //DIVIDE 64
~(1<<CS02)
将CSem的每个位都设置为 EXCEPT 。因此,不是将00000011
放入TCCR0B,而是将11111011
放入TCCR0B。这意味着您将WGM设置为保留值,而不是将其保留在CTC模式下。 (因为位3是WGM设置的一部分)。
指示要在该位位置放置零的首选方法是(0<<CS02)
。