fl
"РЛ" - НАЧИНАЮЩИМ
MainLoop:
CALL
GoToDisplayMode
WaitKey:
CALL
GetKey
JNZ
DoKeyWork
; тут добавим код фоновой задачи
JMP
WaitKey
DoKeyWork:
MOV
Key, A
CALL
GoToKeyWork
JMP
MainLoop
выведем информацию
получим код нажатой кнопки в аккумуляторе
если не ноль - обработаем
и подождем нажатия кнопки
обновим значение Key
вызовем нужный обработчик
и снова все сначала
Не правда ли, элегантно? Основная часть программы
всего в нескольких строках! Но самое интересное не это, а
то, что теперь вы можете элементарно увеличивать количе-
ство режимов работы и изменять количество кнопок управ-
ления - основной цикл меняться не будет! Только и потребу-
ется, что написать подпрограммы обработки новых кнопок и
вывода информации, да добавить их в таблицы! Именно для
реализации такой легкости я и ввел константу KeyCoICnt: те-
перь добавляйте сколько хотите столбцов в таблицу - ника-
ких изменений в подпрограмму GoToKeyWork вносить уже
не придется! К этому добавлю, что можно ввести еще табли-
цу фоновых задач, тогда можно будет в зависимости от ре-
жима выполнять ту или иную задачу внутри основного цик-
ла, пока ни одна кнопка не нажата ©.
Разумеется, в приведенный код можно добавить кое-ка-
кие усовершенствования, но и в этом виде он окажется вам
полезен. Главное - следить, чтобы значения переменных
Mode и Key не получали непредусмотренных значений. Кста-
ти, если в каких-то режимах часть кнопок не должна рабо-
тать, то можно занести прямо в таблицу вместо адреса под-
программы команду RET и NOP (обязательно эту пару, т.к.
все значения нашей таблицы должны бьпъ двухбайтными).
Для этой же цели можно использовать и метку, указываю-
щую на любую команду RET в вашей программе.
Небольшое отступление. Табличные переходы очень
удачно вписываются в концепцию автоматного программи-
рования17.
В завершение несколько слов о табличных вычислениях,
хотя вычисления - это слишком громко сказано ©.
Часто для решения определенных задач требуется вы-
полнять достаточно сложные математические вычисления.
Например, во многих случаях требуется масштабировать ре-
зультаты измерений, умножая или деля их на коэффициен-
ты, причем иногда дробные. Или использовать значения фун-
кций, например синуса или логарифма. Реализация вычис-
лений с плавающей точкой в микроконтроллерных устрой-
ствах является очень ресурсоемким делом, т.е. требует до-
статочно сложной и объемной программы, выполняющей-
ся достаточно длительное время. Например, программа, на-
писанная на языке Си и всего-навсего вычисляющая зна-
чение синуса числа 0,162734, занимает более 2 килобайт
памяти и выполняется больше двух миллисекунд! А для мно-
гих применений требуется гораздо большее быстродей-
ствие, причем, как правило, точностью вычислений можно
17
Черномырдин А. Автоматное программирование для
микроконтроллеров. - “Радиолюбитель”, №8, 2005 г., с. 45.
пожертвовать, т.е. одного-дбух знаков после запятой бывает
вполне достаточно. В этом случае следует рассмотреть воз-
можность замены громоздких и длительных вычислений на-
бором заранее вычисленных значений функции, помещен-
ных в таблицу. Главное условие - разумное количество эле-
ментов в таблице, т.е. дискретных значений аргумента фун-
кции. Например, функция синуса может быть определена
только для диапазона значений от 0 до
я/2,
а для остальных
аргументов значение можно получить путем простых преоб-
разований. Если ограничиться точностью аргумента в 1/256
часть этого интервала, т.е.
7г/51
2, то значения функции мож-
но разместить в таблице, содержащей 256 двухбайтных зна-
чений, причем для простоты можно использовать хранение
значения функции, умноженное на 1000 или 10000, т.е. хра-
нить 3 или 4 точных знака после запятой. Для многих приме-
нений такая точность будет даже излишней, так что можно
ограничиваться и однобайтными значениями, т.е. двумя точ-
ными знаками после запятой. Очевидно, что уменьшение точ-
ности позволяет при том же объеме таблицы хранить боль-
ше значений, т.е. либо уменьшить шаг аргумента функции,
либо упростить вычисление за счет хранения значений на
более широком интервале, т.е. от 0 до
я.
Таблицы удобно использовать и для простого масштаби-
рования величин. Например, мы получаем от АЦП 10-раз-
рядное число в “отсчетах” АЦП, а нужно вывести на дисплей
конкретное значение в вольтах, для чего результат преобра-
зования надо умножить на коэффициент 2,37. Если макси-
мальное значение напряжения не превышает, например, 255,
и достаточно выводить значение в целых вольтах, то можно
использовать таблицу из 1024 однобайтных значений, кото-
рые вычислить заранее. Только вот использовать команду
МОУС А, @ А+ЦРТЛ напрямую не выйдет - эта команда по-
зволяет напрямую работать только с таблицами до 256 бай-
тов объемом, у нас будет аж 1024. Поэтому придется вычис-
лять конкретный адрес байта в таблице, заносить его в ОРТП,
а уж потом использовать команду МОУС. В любом случае,
это займет существенно меньше времени, чем умножение
целого числа на дробное.
Думаю, принцип вам ясен, а конкретную реализацию вы
сможете выполнить и самостоятельно, если потребуется. Уч-
тите только, что для реализации табличных вычислений тре-
буется достаточно большой объем свободной памяти про-
грамм или ЕЕРЦОМ. Надеюсь, запасов, имеющихся в мик-
роконтроллере АТ8958252, вам будет достаточно ©.
Радиолюбитель - 0 3 /2 0 0 8 У
Окончание в №4/2008
43
предыдущая страница 43 Радиолюбитель 2008-03 читать онлайн следующая страница 45 Радиолюбитель 2008-03 читать онлайн Домой Выключить/включить текст