Современная электроника №8/2020

ИНЖЕНЕРНЫЕ РЕШЕНИЯ 52 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 8 2020 Если в программе организовать мас- сив байт, соответствующих выводимым цифрам (от 0 до 9), т.е. массив размер- ностью 10 (например, М[10]), и придать значения элементам массива равными кодам выводимых цифр, соответству- ющих местоположению элементов массива, то вывод цифр существенно упрощается. Другими словами, если, Другими словами, если индекс масси- ва j = 5, то для вывода, например, цифры «5» необходимо просто вывести М[5], и в этом случае цифра «5» появится на дис- плее. Для того чтобы поставить точку после двойки, можно, например, логи- чески сложить M[2] с 1, т.е. вывести M[2] | 1 (знак «|» – оператор побитного логи- ческого сложения). Второй момент касается интерфей- са, по которому требуется выводить цифры на дисплей. Для вывода байт в контроллеры КР1820ВГ1 из микрокон- троллера имеется как минимум три воз- можности. Первая состоит в том, что каждый бит выводимого байта «вручную» (про- граммно) выводится через один из пор- тов микроконтроллера, а стробирую- щий сигнал также «вручную» – через второй. Для этого порты устанавлива- ются в определённое состояние (лог. 0 или лог.1) через необходимые проме- жутки времени в соответствии с вре- менной диаграммой вывода, показан- ной в [6, 7]. Однако при таком выводе необходимо будет сформировать мас- су временных задержек, что неизбежно приведёт к усложнению подпрограм- мы подобного вывода. Второй способ – вывод байт через асинхронный приёмопередатчик (UART) микроконтроллера (ТТЛ- аналог интерфейса RS-232), работаю- щий в синхронном режиме, когда байт выводится по линии RxD, а стробиру- ющий сигнал – по линии TxD. Однако такой синхронный режим работы UART поддерживают далеко не все микрокон- троллеры. Например, если микрокон- троллер C8051F060 и поддерживает такой режим работы UART, то ни один из микроконтроллеров EFM8 не под- держивает (у них имеется только асин- хронный режим работы UART). Третий способ – вывод байта по интерфейсу SPI. В этом интерфейсе в качестве данных используется линия MOSI, а в качестве стробирующего импульса – линия SCK. Вывод байта по SPI очень простой. Для вывода бай- та необходимо записать его в регистр SPI0DAT, дождаться окончания уста- новки бита передачи и сбросить этот бит. Всё остальное сделают аппаратные средства. Что касается совпадения тре- буемой для КР1820ВГ1 временной диа- граммы с временной диаграммой выво- да по SPI, то здесь проблем нет. При использовании интерфейса SPI имеют- ся два регистра управления: это регистр полярности (POL), определяющий каким способом – фронтом (POL = 0) или спадом (POL = 1) импульса SCK – будет производиться стробирование бит данных (для КР1820ВГ1 требуется фронт) и регистр фазы (PHA), опреде- ляющий первым (PHA = 0) или вторым (PHA = 1) импульсом SCK будет стро- бироваться первый бит данных (тре- буется первым). Таким образом, при POL = 0 и PHA = 0 временная диаграм- ма вывода байт по SPI будет логически совпадать с требуемой. Кстати, эти зна- чения (POL = 0 и PHA = 0) приняты в микроконтроллерах EFM8 по умолча- нию. Однако для полного совпадения требуется ещё настроить необходи- мую скорость передачи (или частоту следования импульсов SCK). Эта ско- рость передачи определяется значени- ем делителя частоты тактового генера- тора микроконтроллера, которая равна 72 МГц. В среде Simplicity Studio можно выбрать либо скорость (частоту SCK), тогда автоматически посчитается зна- чение коэффициента делителя, либо значение коэффициента делителя, тог- да автоматически посчитается тактовая частота импульсов SCK. Максимальная частота стробирующих импульсов для КР1820ВГ1 равна 500 кГц. Если выбрать коэффициент делителя равным, напри- мер, 90, то тактовая частота SCK уста- новится равной 395,604 кГц (см. далее в программных средствах), т.е. около 400 кГц. На первый взгляд, кажется, что при выводе байт по интерфейсу SPI про- блем нет. Практически так оно и есть, за исключением одной трудности. Дело в том, что КР1820ВГ1 требует вывод бай- та младшим битом вперёд, т.е, напри- мер, при выводе цифры это бит деся- тичной точки (бит H – см. рис. 3), а в интерфейсе SPI принят обратный поря- док следования бит: первым выводится старший бит байта. Для решения этой проблемы надо заранее переписать код каждой цифры (в том числе и слу- жебные коды) задом наперёд. Если код пятёрки был 1011011b = B7h, то, пере- писав биты в обратном порядке, полу- чим: 11101101b = EDh. На рисунке 3 переписанные коды цифр, отражаемых на ЖКИ, показаны в скобках. Если такие переписанные коды вставить в массив цифр от 0 до 9, о котором говорилось выше, то всё будет работать. Служебные полубайты и полубайты чёрточек так- же необходимо переписать задом напе- рёд. Это и было сделано в подпрограм- ме вывода информации на дисплей. Третий момент касается вопроса вывода на дисплей числа с плавающей точкой, полученного в результате ана- лого-цифрового преобразования. При- чём в зависимости от диапазона изме- рения десятичная точка может стоять как после первой цифры, так и после второй. Пусть такое число с плаваю- щей запятой, например, равно 18,5047 (см. рис. 3). В памяти микроконтрол- лера число с плавающей запятой, как известно, занимает 4 байта, и где в этих байтах искать сами цифры и десятич- ную точку? В языке программирова- ния Си есть функция вывода printf() . Функция производит форматирован- ный вывод символов в стандартный поток вывода. Под стандартным пото- ком вывода может подразумевать- ся вывод символов через какой-либо интерфейс (например, UART). Но есть ещё одна функция – sprint() , кото- рая вместо вывода символов в стан- дартный поток данных заполняет эти- ми символами определённую область оперативной памяти микроконтролле- ра, а именно – массив, название кото- рого присутствует в параметрах этой функции. Если, например, число с пла- вающей запятой F = 18,5047, то записав sprintf(buf3,“%7.4f”,F), мы получим в массиве buf3 семь сим- волов (байт), из которых 6 будут сим- волами цифр, а один (3-й) будет симво- лом десятичной точки. Вывод символов функцией sprintf() осуществляется в коде ASCII. Символ «0» кодируется как 30h, «1» – как 31h, «2» – как 32h и т.д. Таким образом, «убрав» тройку из каж- дого старшего полубайта цифры, мож- но получить искомые цифры (которые уже далее вывести на дисплей). Как убрать эту тройку? Можно от каждого элемента массива buf3 просто отнять 30h, но лучше просто вообще обнулить старший полубайт, логически умножив каждый элемент массива buf3 на чис- ло 0fh, записав buf3[i]& = 0x0f, где i – индекс массива buf3 (он изменяется от 0 до 7), а & – оператор побитного логического умножения в Си. Формат “%7.4f” в функции sprintf() означает, что выводится число с плавающей запятой, состоящее из 7 символов, у которого

RkJQdWJsaXNoZXIy MTQ4NjUy