Как создать таймер/часы, которые могут отправлять свое значение обратно, сохраненное в переменной, ТОЛЬКО сделанное с задержками в C и на микроСе

Как новичок в C, я изо всех сил пытаюсь решить эту мою проблему:

Я работаю над проектом, в котором мне в основном нужно запрограммировать PIC (микрочип) на C с использованием платформы mikroC.

Чего я пытаюсь добиться, так это всего лишь одним переключателем/кнопкой, мне придется переключаться с трех разных «модулей» (как я их называю «модули», они соответствуют разным световым эффектам, создаваемым светодиодами) в зависимости от времени. потрачено на нажатие переключателя/кнопки. В моем случае, через 500 мс поднимается модуль 1, через 1500 мс поднимается модуль 2 и через 3500 мс поднимается модуль 3 (и все это должно быть в бесконечно повторяющемся цикле, так как я должен иметь возможность изменить модуль в ЛЮБОЕ ВРЕМЯ во время операции).

Моя единственная проблема заключается в том, чтобы заставить таймер/часы запускаться в начале программы и продолжать отсчитывать время до тех пор, пока не будет достигнут стоп-сигнал (например, конец цикла или что-то в этом роде).

Это может быть неуместно спрашивать это сообщество, но тем не менее я здесь.

Я понимаю, что это скорее проблема «алгоритмики/логики», чем что-либо еще, но я пытался всю последнюю неделю, не зная, как решить эту проблему...

Никаких результатов, так как код вообще не готов.


person SorryNotAsSorry    schedule 18.04.2019    source источник
comment
Даже если код еще не готов, сложно дать разумный ответ, не видя вашего кода. Поэтому, пожалуйста, отредактируйте свой вопрос и добавьте незавершенный код. Отформатируйте его как блок кода, например. с помощью инструмента {} поля редактора.   -  person Bodo    schedule 18.04.2019
comment
Похоже, вы пытаетесь спросить, какой регистр/функцию в микроСе на ПОС нужно прочитать/вызвать, чтобы получить текущее время в миллисекундах. circuitdigest.com/microcontroller-projects/. Конечно, это не может быть реализовано только с помощью задержек (если то, что вы подразумеваете под задержкой, находится в занятом цикле ожидания в течение определенного периода времени). Вам нужно засечь, как долго кнопка нажата, выполнить устранение дребезга переключателя и так далее.   -  person fdk1342    schedule 18.04.2019


Ответы (2)


Существует библиотека mikroC для обработки нажатий кнопок.. В следующем примере (из ссылки) представлен скелетный пример обнаружения нажатия кнопки...

bit oldstate;                                    // Old state flag

void main() {

  ANSEL  = 0;                                    // Configure AN pins as digital I/O
  ANSELH = 0;
  C1ON_bit = 0;                                  // Disable comparators
  C2ON_bit = 0;

  TRISB0_bit = 1;                                // set RB0 pin as input

  TRISC = 0x00;                                  // Configure PORTC as output
  PORTC = 0xAA;                                  // Initial PORTC value
  oldstate = 0;

  do {
    if (Button(&PORTB, 0, 1, 1)) {               // Detect logical one
      oldstate = 1;                              // Update flag
    }
    if (oldstate && Button(&PORTB, 0, 1, 0)) {   // Detect one-to-zero transition
      PORTC = ~PORTC;                            // Invert PORTC
      oldstate = 0;                              // Update flag
    }
  } while(1);                                    // Endless loop
}

Существует также коллекция Примеры MicroE, которые включают примеры таймеров, такие как эти и этот. Каждый из них предоставляет базовые примеры кода, которые можно адаптировать для создания функции, которая может быть обернута вокруг разделов в коде нажатия кнопки для получения длительности времени.

Надеюсь, это поможет.

person ryyker    schedule 18.04.2019

Когда кнопка нажата, вам нужно инициализировать модуль таймера соответствующего микроконтроллера, проверить флаг прерывания и поместить его в цикл. увеличивайте значение до тех пор, пока кнопка не будет отпущена, и после этого сравните полученное значение с указанными пределами, это было вы можете решить, как долго кнопка будет нажата, и последовательно вы сможете переключать свой вывод. Это единственный способ, если вы хотите точно отслеживать задержку, не прерывая текущее выполнение программы.

person Mufaddal Darbar    schedule 21.06.2021