代码之家  ›  专栏  ›  技术社区  ›  oliver

为什么TCNT1不能在Atmega328上计数?

  •  0
  • oliver  · 技术社区  · 8 年前

    我有下面的代码为Arduino与Atmega328和一个共同的16x2液晶屏。LCD正在工作,但它始终显示计时器1计数器TCNT1的起始值“333”。为什么?我反复阅读了328的数据表,但我不明白。

        #include <LiquidCrystal.h>
    
        const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
        LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
    
        const int lcdContrastPin = 6, lcdBackligthPin = 10;
    
        void setup() 
        {
          // tutn on LCD backlight and contrast
          pinMode(lcdContrastPin, OUTPUT);
          pinMode(lcdBackligthPin, OUTPUT);
    
          // fine-tuning contrast could be done by PWM on lcdContrastPin
          digitalWrite(lcdContrastPin, LOW);
          digitalWrite(lcdBackligthPin, HIGH);
    
          lcd.begin(16, 2);
    
          // configure Timer1
          TCCR1A = 0; // no waveform generation
          TCCR1B = 0x00000010; // frequency divider 8 (i.e. counting with 2 MHz)
          TCCR1C = 0;
          TIFR1 = 0x00100000; // clear Input Capture Flag
          TCNT1 = 333;
        }
    
        void loop() 
        {
          int currentTimerValue = TCNT1;
    
          lcd.setCursor(0, 0);
          lcd.print("TCNT1=");
          lcd.print(currentTimerValue);
          lcd.println("      ");
    
          delay(50); 
        } 
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   oliver    8 年前

    我真蠢!在意识缺失时,我将0x00000010作为二进制数,而不是十六进制数。因此,我将所有时钟选择位设置为0,这意味着计时器停止。

    将0x00000010替换为0b00000010(真正的二进制数)后,现在一切正常:

          TCCR1B = 0b00000010; // frequency divider 8 (i.e. counting with 2 MHz)
          TCCR1C = 0;
          TIFR1 = 0b00100000; // clear Input Capture Flag
    
    推荐文章