Программные средства
Программа для МК в уже готовом загрузочном формате (EFM8SB20F16G-A-QFN24_6.hex) доступна для скачивания в разделе Загрузки. Её можно запрограммировать в МК вышеприведенным способом с помощью USB DEBUG адаптера. Однако для тех, кто хочет самостоятельно написать свою программу, автор хотел бы поделиться некоторыми её моментами, в основном связанными с изменёнными по сравнению с [1] портами МК и выводом информации на дисплей.
В связи с тем, что в МК используются два интерфейса SPI, второй (SPI1) настраивается также как и первый (Рисунок 3а), а для включения обоих SPI в работу необходимо поставить «галочки» по каждому из них (Рисунок 3б). Скорость обмена по обоим интерфейсам одна и та же и составляет 5 МБод (точнее частота импульсов SCK составляет 5 МГц – SPI Clock Frequency (Actual), Рисунок 3а). Конфигурация портов для SPI0 и SPI1 (Рисунок 3в) соответствует МК DD1 на схеме Рисунок 1. Для обоих SPI сигналы SCK и MOSI настраиваются как цифровые выходы, а сигналы MISO – как цифровые входы. Порты P0.1 (CSB), P0.5 (RES), P0.6 (D/C) и P0.7 (CSD) настраиваются как цифровые выходы, а порт P0.4 (BUSY) – как цифровой вход.
|
|||||
Рисунок 3. | Настройки конфигурации устройств в МК. |
Таймер RTC настраивается в соответствии с Рисунком 3г. Необходимо обратить внимание, что нагрузочную емкость (Load Capacitance Programmed Value) для кварцевого резонатора нужно установить ту, что указана в его справочном листке, в данном случае – 12.5 пФ. Также необходимо установить частоту для кварцевого резонатора, равную 32,768 Гц. Для получения 30-минутного интервала измерений (Actual Alarm Period) потребуется установить значение, загружаемое в счетчик RTC (Alarm Programmed Value), равное 58,982,400. Остальные настройки на Рисунке 3г, на взгляд автора, в комментариях не нуждаются. При таких настройках погрешность по времени составила около одной секунды в сутки.
Здесь следует заметить, что автор проверял эту погрешность по своим наручным кварцевым часам, которые также имеют свою погрешность. Запустив программу за 5 секунд до полуночи, т.е. в 23:59:55, на следующие сутки, т.е. через 24 часа, автор стал наблюдать, когда сменится информация на дисплее и построится второй столбец гистограммы, равный первому. Это произошло ровно в 23:59:56. На следующие сутки – в 23:59:57 и так до 7 суток, когда был построен последний (8-й) столбец гистограммы. Другими словами, часы RTC по сравнению с наручными часами спешили примерно на одну секунду в сутки. Далее, проверив погрешность наручных часов по сигналам точного времени, передаваемым по радио, автор получил, что эти часы отстают примерно на 1 секунду в сутки. Отсюда был сделан вывод, что часы RTC идут даже более точно, чем наручные часы. Этот довольно странный вывод немало удивил автора. То ли кварц попался хорошо настроенный, то ли еще что-то, но факт остается фактом…
В соответствии с Рисунком 3в и схемой на Рисунке 1 биты портов в программе были установлены следующим образом:
sbit CSB = P0^1; // - для BME
sbit CSD = P0^7; // - для EPD
sbit D_C = P0^6; // - для EPD
sbit RSTD = P0^5;// - для EPD
sbit BUSY = P0^4;// - для EPD
Подпрограмма вывода по SPI1 аналогична подпрограмме для SPI0:
void outspi1(uint8_t byte) {
SPI1DAT = byte; // Вывод байта по SPI1
while (!SPI1CN0_SPIF); // Ожидание установки флага SPI1CN0_SPIF
SPI1CN0_SPIF = 0; // Сброс флага окончания передачи.
}
При входе и выходе в/из sleep-режима запрет и разрешение SPI1 устанавливаются так же, как и для SPI0:
// Вход в sleep-режим
//----------------------
SPI0CN0 &= 0xfe; //Запрет SPI0
SPI1CN0 &= 0xfe; //Запрет SPI1
CLKSEL=0x83; //SYSCLK=генератор RTC (32768 Гц)
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
PMU0CF=0x84; //Вход в sleep и разрешение
// выхода по alarm от RTC(30 минут)
//------------------------
// Выход из sleep-режима
//------------------------
CLKSEL=0x04; //SYSCLK=LPOSC (20 МГц)
DEL10MS();
while ((CLKSEL & 0x80)==0); //Ожидание установки SYSCLK=LPOSC.
PMU0CF=0x24; //Сброс всех флагов и разрешение alarm по RTC.
SPI0CN0 |= 0x01; //Разрешение SPI0.
SPI1CN0 |= 0x01; //Разрешение SPI1.
Теперь по поводу вывода информации на дисплей. Этот вывод условно можно разделить на 3 типа.
Первый тип – вывод цифровых значений давления, температуры и влажности. В отличие от программы в [1], где вывод осуществлялся в 2 строки и подробно объяснен, в настоящей программе вывод производится в 3 строки, и практически ничем не отличается от программы в [1], поэтому, чтобы не повторяться, на взгляд автора, в подробном объяснении не нуждается и поэтому не приводится.
Второй тип – вывод вертикальных координат гистограммы. Для этого в программе LCD Font Maker была буквально нарисована картинка (*.bmp), которая опциями этой программы затем была перевернута вверх ногами и отражена по горизонтали (Рисунок 4). Размер картинки – 152×32 пикселя. Минимальное значение давления (710 мм рт. ст.) и максимальное (780 мм рт. ст.) были выбраны в связи с тем, что по данным многолетних наблюдений минимальное давление в Москве (709 мм рт. ст.) было зафиксировано 25 ноября 1973 года, а максимальное (782 мм рт. ст.) – 14 декабря 1944 года. Реальный диапазон давлений, который показывал прибор, существенно ýже: от 725 до 774 мм рт. ст. А среднее давление в Москве составляет 750 мм рт. ст.
Рисунок 4. | Картинка *.bmp с координатами гистограммы в программе LCD Font Maker. |
После того как картинка нарисована, специальной опцией (красная стрелка Рисунке 4) необходимо выбрать формат вывода (Рисунок 5а). Далее, нажав опцию получения кодов картинки (зеленая стрелка на Рисунке ), можно получить все необходимые коды картинки (Рисунок 5б), а нажав кнопку Export (синяя стрелка на Рисунке 5б) и назвав файл, можно получить файл с этими кодами.
|
|||||
Рисунок 5. | Выбор опций в программе LCD Font Maker. |
Поскольку картинка имеет размер 152×32 пикселя, количество байт в массиве для нее равно 152×32/8 = 608, т.е. массив должен состоять из 608 однобайтовых элементов, например, BMP[608].
Вывод этого массива в дисплей с учетом левых и правых пробелов примитивен:
//---- Вывод картинки BMP ----
out_probel (3);
for(BM = 0; BM<608; BM++)
{EPD_WRITE_DAT(0xff-BMP[BM]);}
out_probel (5);
Третий тип – вывод столбцов гистограммы давления. Чтобы вывести столбец, необходимо выяснить его высоту в зависимости от значения давления. Для этого из значения давления (P) нужно вычесть минимальное его значение: P-710. Далее, поскольку каждый мм рт. ст. занимает 2 пикселя, нужно узнать, сколько целых байт (CP) занимает один столбец. Для этого значение (P-710) нужно умножить на 2 и разделить на 8: CP=((P-710)*2)/8, или, сократив на 2, получим: CP=(P-710)/4. Аналогично можно получить и остаток OSTP=(P-710)%4 (знак % означает, что при делении на 4 результат будет равен остатку).
Теперь необходимо сформировать выводимый массив MP[19], состоящий из 19 байт, т.к. разрешение дисплея по вертикали составляет 152 пикселя или 19 однобайтных строк.
Вначале выводим в массив 1 пробел, после этого выводим целую часть байт.
Теперь, если остаток равен нулю, необходимо дополнительно вывести один байт, у которого 2 нулевых старших бита (нулевые биты соответствуют черным пикселям), поскольку, как указывалось выше, 1 мм рт. т. занимает 2 пикселя (и столько же пикселей занимает ширина отметок на картинке – см. Рисунок 4).
Если же остаток ненулевой, нужно вывести количество нулей, равное удвоенному остатку + 2 бита, соответствующих двум вышеуказанным пикселям. Для этого можно, например, взять число 0xff и сдвинуть его вправо на 2*OSTP + 2 бит. Здесь необходимо напомнить, что при сдвиге беззнакового числа вправо освободившиеся от сдвига биты заполняются нулями (если число со знаком, то эти биты заполняются битом знака). Перед числом 0xff можно, конечно, поставить в скобках, что это число беззнаковое, например, (uint8_t) 0xff, указав на это более внятно, однако, как показала практика, транслятор посчитал, что число 0xff и так беззнаковое и писать (uint8_t) не обязательно.
После того как заполнены все пиксели столбца, необходимо вывести в массив оставшиеся (до 19 строк) пробелы.
В конце необходимо вывести в дисплей заполненный массив MP[19] столько раз (N), какова ширина столбца.
Несмотря на такое «пространное» объяснение, программа довольно незатейлива, и, с учетом вышесказанного, понять ее довольно просто:
void OUTSTOLB(uint8_t N, uint16_t P)
{
uint8_t xdata MP[19],i,CP,OSTP,k;
MP[0]=0xff; //нижний пробел
CP=(P-710)/4; //целая часть
OSTP=(P-710)%4; //остаток
for (i=1; i<(CP+1);i++)
{MP[i]=0x00;} //черные пикселы столбца
if (OSTP==0)
{MP[CP+1]=0x3f;} //2 черных пиксела
else
{MP[CP+1]=0xff>>((2*OSTP)+2);} //остаток
for (i=CP+2;i<19;i++)
{MP[i]=0xff;} //верхние пробелы
//--- Вывод массива на дисплей ---
for (k=0;k { for (i=0;i<19;i++)
{EPD_WRITE_DAT(MP[i]);}
}
}
Обращение к этой подпрограмме также очень простое. Ширина сегодняшнего столбца была выбрана равной 15 пикселям, ширина остальных столбцов – 6 пикселям, а пробел между столбцами – 4-м пикселям. С учетом трех пробелов, пропущенных после картинки, а давление находится в переменной press, вывод всех столбцов гистограммы очень прост:
AP[0]=press;
out_probel (3);
OUTSTOLB(15,AP[0]);
for (j=1;j<8;j++)
{ out_probel (4);
OUTSTOLB(6,AP[j]);
}
После того как пройдет 24 часа (или будет произведено jd == 48 измерений), сегодняшнее давление переписывается во вчерашнее, вчерашнее – в позавчерашнее и т.п. до конца недели, a jd обнуляется, поскольку эта переменная инкрементируется после окончания измерений:
//--- Перепись давлений ---
if (jd == 48)
{
AP[7]=AP[6];
AP[6]=AP[5];
AP[5]=AP[4];
AP[4]=AP[3];
AP[3]=AP[2];
AP[2]=AP[1];
AP[1]=AP[0];
jd=0;
}
После трансляции всей программы в среде Simplisity Studio V.4 на экран в специальном окне, отражающем результат трансляции, выведется сообщение:
Program Size: data=118.1 xdata=39 const=0 code=10220
LX51 RUN COMPLETE. 0 WARNING(S), 0 ERROR(S)
Finished building target: EFM8SB20F16G-A-QFN24_6.omf
Из этого сообщения можно заключить, что в программе использована почти вся внутренняя оперативная память с прямой адресацией объемом 128 байт (data=118.1), а внешняя оперативная память с косвенной адресацией объемом 2 КБ почти не использована (xdata=39). Кодовая часть программы использует чуть более половины всей программной памяти объемом 16 КБ или 16384 байта (code=10220). Остаток программной памяти составляет: 16384 – 10220 = 6164 байт ≈ 6 КБ. Кроме того, при трансляции применена так называемая small-модель, в которой данные располагаются в области памяти с прямой адресацией (data). В этом случае, во-первых, существенно экономится программная память, а, во-вторых, программа работает несколько быстрее.
Разводка и общий вид платы прибора
Разводка платы сделана автором с помощью программы Sprint Layout v.6. Файл разводки в формате *.lay6 доступен для скачивания в разделе Загрузки. Из Рисунка 6 можно заключить, что разводка очень проста, а сама плата небольшого размера (22×26 мм). Плата сконструирована универсальной и подходит как для контроллера дисплея UC8151, в этом случае используются все ее компоненты, так и для SSD1680 (в настоящем приборе), где компоненты, перечеркнутые крестом (Рисунок 6a), устанавливать не требуется. Места платы в черных кружках требуется пропаять с двух сторон платы. Если это штыри разъемов, то они должны быть пропаяны с двух сторон платы. Один вывод катушки индуктивности следует вставить в отверстие и также пропаять его с двух сторон платы, второй припаивается непосредственно к контактной площадке. Между катушкой и платой необходимо вставить изолирующую прокладку (например, из тонкого текстолита), чтобы обмоточный провод не касался контактов платы. В остальные отверстия, отмеченные черными кружками, следует вставить тонкий одножильный луженый медный провод и пропаять его с двух сторон платы. Всё это позволило не использовать металлизацию отверстий, технология которой в домашних условиях весьма проблематична и поэтому неприемлема.
|
|||||
Рисунок 6. | Разводка и внешний вид платы устройства: (а), (в) – вид со стороны расположения компонентов; (б), (г) – вид с обратной стороны. |
Конструкция и результаты работы устройства
Прибор сконструирован в корпусе «20-12» размером 85×50×21 мм с защелкивающейся крышкой (Рисунок 7), в которой для дисплея прорезано окно по размеру видимой части его экрана. Для доступа воздуха к внутреннему пространству прибора в задней стенке сверху и снизу просверлено несколько отверстий диаметром 4 мм. Сам дисплей приклеен к текстолитовой пластине толщиной 1.5 мм тонким скотчем с двусторонним липким слоем, а пластина, в свою очередь, приклеена к внутренней поверхности крышки корпуса пористой лентой с двусторонним липким слоем. По углам пластина зафиксирована четырьмя каплями термоклея. Шлейф дисплея перегнут через вырез в пластине и вставлен в разъем платы, которая приклеена к пластине такой же пористой лентой. Батарейка приклеена к задней стенке корпуса тонким скотчем с двусторонним липким слоем. Плата с BME280 (она сиреневого цвета на Рисунке 7) надета на соответствующие контакты разъема основной платы. Как только разъем кабеля от батарейки вставлен в соответствующий разъем платы, прибор сразу начинает работать, и остается только защелкнуть крышку. Это необходимо сделать ровно в полночь. Перезапустить программу можно, если замкнуть на пару секунд между собой два крайних контакта (1 и 3) разъема, предназначенного для программирования МК (X3, Рисунок 1), а затем разомкнуть их. Это также следует сделать ровно в полночь.
Рисунок 7. | Внутреннее устройство прибора. |
Показание прибора (Рисунок 8) снято после того как он проработал 8 дней. В начале этого периода в Москве наблюдалось повышенное давление, которое постепенно снижалось, что можно определить по гистограмме.
Рисунок 8. | Общий вид в сборе прибора, проработавшего неделю. |
Заключение
Применение E-ink дисплея DEPG0266RWS800F34 совместно с МЭМС-датчиком BME280, МК EFM8SB20F16, литиевой батарейкой ER14505 и микропотребляющим стабилизатором STLQ015M30R позволило сконструировать прибор, который, помимо цифровых значений атмосферного давления, температуры и влажности, выводит на дисплей гистограмму давления за последние 8 дней. Это дает возможность в некоторой степени осуществлять прогноз давления на следующий день, что часто бывает жизненно необходимо для метеозависимых людей. Работа прибора в течение 10 лет без замены батарейки и, как следствие, не требующая никакого обслуживания, является большим преимуществом по сравнению с похожими приборами (с OLED дисплеями или дисплеями с ЖКИ), в которых приходится часто менять батарейки, т.е. постоянно нуждающихся в обслуживании.
Литература
- Кузьминов А. Усовершенствованный барометр-термометр-гигрометр с E-ink дисплеем.
- Кузьминов А. Ю. Связь между компьютером и микроконтроллером. Современные аппаратные и программные средства. М.: «Перо». 2018.
Материалы по теме
- Datasheet Bosch Sensortec BME280
- Datasheet Silicon Labs EFM8SB20F16
- Datasheet STMicroelectronics STLQ015M330R
- Datasheet Nexperia PMEG3010EH
- Datasheet Vishay Si1308EDL
- Datasheet DKE DEPG0266RWS800F34