ЖК-дисплей 16*2 не отображает мой результат

Я работаю над проектом по расчёту частоты линии методом обратного счёта с помощью Arduino. Пытаюсь вывести результат на ЖК-дисплей 16*2, но он ничего не отображает. Он просто включается и зависает. Подробности проекта я взял с этого сайта Частотомер линии на основе обратного счёта

Я модифицировал стандартную программу для работы с ЖК-дисплеем, но она не работает. Вот код, который я использую:

//Для чтения и отображения частоты линии
//используя метод обратного подсчета
//clk для «Счетчика времени» генерируется с помощью функции «Тон»
//«Счетчик времени» — это физический счетчик T1
// «Счетчик событий» — это программный счетчик
#define Fin 6      // входной контакт для сигнала частоты линии
#define clk 7      // вход для счетчика «Время»
#include<LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
boolean FState;   // статус сигнала 50 Гц
int countS;       // Количество сигналов
int countC=0;     // Счетчик часов
int LineFreq;     // Результат

void setup() {
  tone(8, 5000); // генерирует опорную частоту 5000 Гц на выводе 8
  pinMode(Fin, INPUT); // устанавливаем вывод Fin как INPUT
  pinMode(clk, INPUT); // устанавливаем вывод clk как ВХОД
  lcd.begin(16, 2);
}

void loop() {  
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Frequency of signal");       
  // чтобы избежать частичных циклов, сначала определите передний фронт
  while(digitalRead(Fin)) {
    //ждем состояния «0» сигнала
    delayMicroseconds(10);
  }
  //здесь состояние '0'
  while(!digitalRead(Fin)) {
    //ждем состояния «1»
    delayMicroseconds(10);
  }
  //это восходящий край плавника
  //отсчёт можно начать отсюда
  // очистить счетчик ВРЕМЕНИ T1
  counterStart1();
  //подсчитайте 50 сигналов частоты линии
  while(countS<50) {
    while(digitalRead(Fin)) {
      //ждем состояния «0»
      delayMicroseconds(1);
    }    
    //здесь состояние '0'
    while(!digitalRead(Fin)) {
      //ждем состояния «1»
      delayMicroseconds(1);
    }
    // здесь состояние «1»
    // здесь один цикл только что закончился
    //увеличиваем счетчик событий
    countS=countS+1;
  }
  //здесь 50 циклов сигнала
  // прочитать содержимое T1 и вычислить частоту
  countC = getCount1();
  LineFreq = 25000000/countC;

  //отправить на дисплей
  lcd.setCursor(0,1);
  lcd.print(LineFreq);
  lcd.print(" Hz");
  delay(500);  
  delay(100);
  // очистить счетчик
  countS=0;
  // повторить
}

//Следующий код взят из онлайн-статей, находящихся в открытом доступе
void counterStart1() {
 // настройка аппаратного счетчика для 16-битного таймера/счетчика Timer1
 TCCR1A=0; // сброс регистра управления таймером/счетчиком A
 TCCR1B=0; // сброс регистра управления таймером/счетчиком B
 TCNT1=0; // инициализируем значение счетчика 0; этот регистр хранит текущий счет
  // устанавливаем аппаратный таймер/счетчик 1 как счетчик; он считает события на выводе Tn (вывод 5 Arduino)
 TCCR1B = TCCR1B | 7; // Источник тактового сигнала счетчика = контакт Tn (контакт 5 Arduino), начинаем отсчет сейчас
 // 7 в двоичном коде — это 0111; операция ИЛИ установит CS10, 11, 12 в 1
return;
}

// следующий код получен из онлайн-статей в открытом доступе
// Подпрограмма для получения текущего счетчика
unsigned int getCount1() {
 unsigned int count; // эта переменная возвращает текущий счет из счетного регистра
 TCCR1B = TCCR1B & ~7; // Затвор выключен / Счетчик T1 остановлен,
 // эта операция очищает биты (CS10,11,12)
 count = TCNT1; // прочитать регистр счета
 TCCR1B = TCCR1B | 7; // перезапускаем счет, сбросив биты (CS10,11,12)
 return count; // вернуть полученное значение счетчика в вызывающую функцию
}

У меня пустой экран, но самая первая строка кода «Частота сигнала» печатается правильно.

Что не так с кодом и какие изменения мне нужно внести?

Заранее спасибо!

, 👍0

Обсуждение

Что происходит? Ничего не отображается или отображается только «Частота сигнала»?, @Gerben

Я исправил отступ, так как его было практически невозможно читать., @Gerben

В последнем случае, похоже, сигнал на контакте 6 отсутствует или слишком слабый. В итоге ваш код ожидает 50 переходов, которых просто нет?, @Gerben

Он отображает только частоту сигнала, указанную в начале кода. После этого ничего не работает. Я проверил сигнал на выводе 6, и он работал нормально., @Joy Mukherjee


1 ответ


2

Ваши переменные — это int, которые в Arduino по умолчанию являются 2-байтовыми знаковыми типами и имеют диапазон от -32768 до 32767.

Когда вы выполняете:

LineFreq = 25000000/countC;

Результат вычисления — 2-байтовое int или 4-байтовое long? В любом случае, вы, вероятно, присваиваете 4-байтовое значение int.

Вы можете объявить LineFreq как тип long, а также добавить L в конец константы 25000000, чтобы принудительно применить математику long, так что у вас получится:

long LineFreq;
[...]
LineFreq = 25000000L/countC;
,