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

标签 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 时,我都会更新一次液晶屏。如果使用 16 MHz 振荡器,则应该每隔 (16e6/(150*125*64) = 13.3 更新/秒。

如果使用 F_CPU 完成,则应该每隔 (1e6/(125*150*64))= 0.83 更新/秒发生一次,这就是现在正在发生的情况。

那么我该如何正确地在 XTAL1 和 XTAL2 引脚上实现振荡器呢?应该注意的是,我现在没有使用正确的去耦电容器,不确定它是否重要。

最佳答案

您还需要设置 fuse ,让您的微型计算机知道您正在使用外部时钟。

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

关于c - 为什么我的 TIMER0 不使用 Atmega644 Controller 上 XTAL1 和 XTAL2 之间的振荡器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55734219/

相关文章:

c - 在两个增量和间接运算符的情况下,C 如何处理运算优先级?

c - 搜索列表时出现运行时错误

针对写入优化的并发数据结构

java - 单击按钮时显示并启动带有绘制动画的 JPanel

java - Swing - 计时器不按时间间隔触发事件

c - 链接列表仅打印第一个列表的第一个值

ruby-on-rails - 如何在测验应用程序中包含 "Timer control"

linux - USB 设备枚举失败 : "device descriptor read/64, error -32"

c - ARM C中main中声明的全局变量和变量的区别

DSP/微 Controller 和 PC 应用程序之间的接口(interface)