PCNT- как изменять уже установленный counter_h_lim

Здравствуйте. Есть проект на ESP32 (aruinoespressive). В Setup создал конфигурацию модуля счётчика. Запустил. Он работает. В проекте требуется изменять counter_h_lim. То увеличивать, то уменьшать. Просмотрел весь pcnt.h-ничего не нашёл.
Как это делается?

void setup()
...
pcnt_config_t pcntConf = { }; // Создаем конфигурацию модуля счетчика 
pcntConf.unit = PCNT_UNIT_7; // Выбираем номер модуля
pcntConf.pulse_gpio_num = metr_count;// PIO
pcntConf.pos_mode = PCNT_COUNT_INC;  // задаем действие для фронта импульса (есть еще спад импульса - .neg_mode)
                                       // PCNT_COUNT_INC - увеличение счета, PCNT_COUNT_DEC - уменьшение, PCNT_COUNT_DIS - нет счета
pcntConf.counter_h_lim =dlina;       // Максимальное значение счетчика (есть еще минимальное .counter_l_lim)
pcnt_unit_config(&pcntConf);         // Применяем конфигурацию и запускаем счетчик
pcnt_counter_pause(PCNT_UNIT_7);     // Останавливаем счетчик 
pcnt_counter_clear(PCNT_UNIT_7);     // и сбрасываем в ноль, т.к. еще надо настроить фильтр и прерывание по переполнению

pcnt_set_filter_value(PCNT_UNIT_7, 1023); // Установка фильтра подавления дребезга. Макс-1023.
                                            // Задержка на дребезг: 1 = 12,5 нс (1023 = около 13 мкс)
pcnt_filter_enable(PCNT_UNIT_7);          // Запуск фильтра
pcnt_event_enable(PCNT_UNIT_7, PCNT_EVT_H_LIM);        // Запускаем событие прерывания по переполнению счетчика
                                                        
pcnt_isr_service_install(7);
pcnt_isr_handler_add(PCNT_UNIT_7, summator, NULL);
pcnt_counter_resume(PCNT_UNIT_7);         // Рестарт счетчика

...

Так вот же, изменяй значение dlina и всё.

Не выходит так.
Ошибка при компиляции:

Compiling .pio\build\esp32dev\src\main.cpp.o
src/main.cpp: In function 'void loop()':
src/main.cpp:559:13: error: 'pcntConf' was not declared in this scope
             pcntConf.counter_h_lim =dlina;
             ^~~~~~~~
src/main.cpp:559:13: note: suggested alternative: 'pathconf'
             pcntConf.counter_h_lim =dlina;
             ^~~~~~~~
             pathconf
*** [.pio\build\esp32dev\src\main.cpp.o] Error 1

Код покажи, причем весь.
И ссылки на используемые библиотеки желательно.

Библиотека pcnt уже встроена. Ничего дополнительного для счётчиков не подключал. Вот часть кода, где возникает ошибка. Крутится непосредственно в loop. Не достаточно?

switch (Encoder.tick())
  {
    case 5:
            Encoder.resetState();
            status_on_tft(2); // статус установки метража
            tft.setTextColor(TFT_GREEN, TFT_BLACK);
            tft.setTextSize(3);
            while (Encoder.tick() != 5)
                {
                      if (Encoder.right())
                          dlina = dlina + Oborotov_v_metre;
                        if (Encoder.left())
                          dlina = dlina - Oborotov_v_metre;
                    if (dlina * multiplikator < 99.5)
                      {
                          tft.setTextColor(TFT_BLACK, TFT_BLACK);
                          tft.drawFloat(0, 0, 36, 95, 1); // затираем
                      };
                    tft.setTextColor(TFT_GREEN, TFT_BLACK);
                    tft.drawFloat(dlina * multiplikator, 0, 0, 95, 1);
                }
            tft.setTextColor(TFT_ORANGE, TFT_BLACK); // устанавливаем цвет текста и фона
            Encoder.resetState();
            status_on_tft(0); // статус паузы
            //EEPROM.writeUShort(0, 500);//для записи в первый раз. Потом заменить на сл.строку
            EEPROM.writeUShort(0, dlina);
            EEPROM.commit();
           
            pcntConf.counter_h_lim =dlina;
            
     break;
    case 4:     //нажать и вправо это 5мм
            Encoder.resetState();
            EEPROM.writeUChar(4, 5);
            EEPROM.commit();
            smena_shnura(5);
    break;

Давай так. Если ты пришел за помощью - ВЫКЛАДЫВАЙ ВЕСЬ КОД, а не отдельные фрагменты.

Если помощь не нужна - можешь и дальше тупить.

И не пытался оскорбить, но видимо иначе вообще всё «мимо ушей».

Вынеси свой pcntConf наружу из функции. Пущай будет глобальной переменной. И все у тебя заработает.

Это

void setup()
...
pcnt_config_t pcntConf = { };

поменяй на это (нолик тоже добавь, так веселее):

static pcnt_config_t pcntConf = { 0 };
void setup()
...
1 лайк

Компиляция прошла без ошибок.Ура! Чуть позже залью в esp, проверю. Тему пока не закрываю. С меня лайк, уже поставил.

Зачем тут модификатор static?

ну, чтобы наружу не торчал из файла. До этого исправления был локальной переменной и тоже никуда не торчал. Но я обычно глобальные все статиками делаю, если не нужна глобальная видимость. Всем проще - и линкеру и компилятору :slight_smile:

@vvb333007, поздравляю! Вы показали чайнику, что можно решить проблему и без выкладывания кода. Не удивляйтесь, когда завтра он будет качать права на эту тему.

2 лайка

А всё начинается с малого. Сначала скетч можно выложить абы как, без тега, затем объяснить абы-как через пень-колоду. Но тут же “умные” люди, все как на подбор, готовы копошиться в этом говне, и предлагать свои условия. Ну просто делать людям нечего, ну и себя ни во что не ценят.(

как будто не отгадывали эти мелодии без нот, хорошо, что я не успел, ещё и попинать хотел, нахрена тут весь код )))

Ну, будет качать - не будем отвечать :0)

Та не, с такими каши не сваришь.)

Спасибо, всё сработало. Я понял свою ошибку: структура была локальная. Сделал её глобальной и проблема исчезла.

1 лайк

Нет, так и не понял. Главная ошибка – Вы не выложили код, как Вас просили.

1 лайк

знаем мы вас, стырите, а потом конторе какой нибудь продадите )))

Есть опыт?
Выдать свой ремонт за чужой)))