首页 > 解决方案 > 为什么我的 TIMER0 不使用 Atmega644 控制器上 XTAL1 和 XTAL2 之间的振荡器?

问题描述

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

标签: ctimermicrocontrolleratmega

解决方案


您还需要设置保险丝,以让您的微机知道您正在使用外部时钟。

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


推荐阅读