Как ждать одну секунду на микроконтроллере 8051? - PullRequest
4 голосов
/ 10 марта 2010

Я должен написать программу, которая будет отправлять некоторые значения в регистры, затем ждать одну секунду, а затем изменять значения. Дело в том, что я не могу найти инструкцию, которая остановит операции на одну секунду.

Ответы [ 3 ]

10 голосов
/ 10 марта 2010

Как насчет настройки прерывания по таймеру?

Некоторые полезные советы и фрагменты кода в этом Замечании по применению Keil 8051.

4 голосов
/ 10 марта 2010

Я бы настроил таймер так, чтобы он прерывался каждые 10 мс. В этом прерывании увеличивайте переменную.

Вам также потребуется написать функцию для отключения прерываний и чтения этой переменной.

В вашей основной программе вы прочитаете переменную таймера и подождите, пока она не станет на 10 100 больше, чем при запуске.

Не забудьте следить за изменением таймера.

3 голосов
/ 11 марта 2010

Нет такой «инструкции». Однако нет никаких сомнений, по крайней мере, один периферийный аппаратный таймер (точный набор периферийных устройств зависит от того, какую именно часть вы используете). Получите таблицу данных / руководство пользователя для части, которую вы используете, и выясните, как запрограммировать таймер; затем вы можете опросить его или использовать прерывания. Обычно вы настраиваете таймер для генерации периодического прерывания, которое затем увеличивает переменную счетчика.

Две вещи, которые вы должны знать о прерываниях таймера: во-первых, если ваша переменная счетчика больше 8-битной, доступ к ней не будет атомарным, поэтому вне контекста прерывания вы должны либо временно отключить прерывания, чтобы прочитать его, либо прочитайте его дважды подряд с тем же значением, чтобы подтвердить его. Во-вторых, переменная счетчика таймера должна быть объявлена ​​volatile, чтобы компилятор не оптимизировал доступ к ней; это верно для всех переменных, общих для прерываний и потоков.

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

В любом случае вам нужно пройтись по документации, относящейся к детали. Если бы вы могли сообщить нам точную часть, вы можете получить помощь с этим.

Третье решение - использовать специальное ядро ​​RTOS 8051, которое обеспечит именно ту функцию периодической задержки, которую вы ищете, а также многопоточность и IPC.

...