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

时间:2019-04-17 18:51:33

标签: c timer microcontroller atmega

因此,我尝试在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引脚上正确实现振荡器。应该注意的是,我现在没有使用正确的去耦电容器,不确定是否有问题。

2 个答案:

答案 0 :(得分:1)

您还需要设置保险丝,以使您的微型麦克风正在使用外部时钟。

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

答案 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)