Почему TCNT1 не рассчитывает на Atmega328? - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть следующий код для Arduino с Atmega328 и обычным ЖК-дисплеем 16x2. ЖК-дисплей работает, но он всегда показывает начальное значение «333» счетчика Таймера 1 TCNT1. Зачем? Я перечитывал таблицу данных 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 Ответ

0 голосов
/ 09 сентября 2018

Глупый я! В упадке сознания я принял 0x00000010 как двоичное число, а не как шестнадцатеричное, как оно есть. В результате я установил все биты выбора часов на 0, что означает, что таймер останавливается.

После замены 0x00000010 на 0b00000010 (истинное двоичное число) теперь все работает как положено:

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