所以我试图在我的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引脚上实际正确实现振荡器呢?应该注意的是,我现在没有使用正确的去耦电容,不确定它是否重要。
您还需要设置保险丝,以便了解您使用外部时钟的微型设备。
你的问题在这里TCCR0B = ~(1 << CS02) | (1 << CS01) |( 1 << CS00); //DIVIDE 64
~(1<<CS02)
设置每一点除了CS02。因此,不是将00000011
放入TCCR0B,而是放11111011
。这意味着您将WGM设置为保留值,而不是将其保留在CTC模式下。 (因为第3位是WGM设置的一部分)。
表示你想在该位置放置零的首选方法是(0<<CS02)
。