为什么我的TIMER0在我的Atmega644控制器上使用XTAL1和XTAL2之间的振荡器?

问题描述 投票:0回答:2

所以我试图在我的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引脚上实际正确实现振荡器呢?应该注意的是,我现在没有使用正确的去耦电容,不确定它是否重要。

c timer microcontroller atmega
2个回答
1
投票

您还需要设置保险丝,以便了解您使用外部时钟的微型设备。

http://www.ladyada.net/learn/avr/fuses.html


0
投票

你的问题在这里TCCR0B = ~(1 << CS02) | (1 << CS01) |( 1 << CS00); //DIVIDE 64

~(1<<CS02)设置每一点除了CS02。因此,不是将00000011放入TCCR0B,而是放11111011。这意味着您将WGM设置为保留值,而不是将其保留在CTC模式下。 (因为第3位是WGM设置的一部分)。

表示你想在该位置放置零的首选方法是(0<<CS02)

© www.soinside.com 2019 - 2024. All rights reserved.