LED матрица 11 - 10 на един микроконтролер

В раздела "Схеми" на сайта Radiopilot са публикувани няколко статии за метода на мултиплексиране на Charlieplexing, така че се препоръчва първо да се запознаете с основните принципи на изграждане на LED матрица и алгоритъма на работа.

матрица
Снимка 1.Диаграма на варианта на LED матрица 11×10 и свързването й към портовете на микроконтролера чрез мултиплексния метод Charlieplexing.

Основният недостатък на метода Charlieplexing е, че само един от всеки два светодиода може да свети едновременно. Но е вярно, че някои комбинации от светодиоди могат да се включат едновременно. По този начин, за да се използва такава матрица от светодиоди за показване на каквато и да е информация, е необходимо бързо да се сканира цялата матрица и последователно да се включи необходимия светодиод. Малка забележка: ако сканирате матрицата само за светодиодите, които трябва да бъдат включени, тогава колкото повече светодиоди са включени, толкова по-ниска ще бъде тяхната яркост. Това е малко досадно, така че винаги трябва да сканирате цялата матрица, но да включите само желаните светодиоди. Ако следвате това правило, интервалът от време за сканиране на матрицата ще бъде постоянен и всички светодиоди в матрицата ще имат еднакъв работен цикъл (1/110) и яркост, независимо от броя на включените светодиоди.

Колко бързо трябва да сканирате LED матрицата? При решаването на този проблем е необходимо да се разчита на инерцията на зрителното възприятие, така че яркостта на сиянието да се възприема визуално като достатъчна. За да може човешкото око да получи тази илюзия, всеки светодиод трябвавключете най-малко 25 пъти в секунда. Авторът избра оптималната стойност от 30 пъти в секунда. Предвид факта, че имаме общо 110 светодиода, тази стойност се увеличава до 30×110=3300 пъти в секунда. Много е! Писането на код за изпълнение на такива задачи не е ефективен подход, така че трябва да се използват прекъсвания. За микроконтролер PIC16F688 (при 8 MHz с тактова честота 2 MIPS) това означава, че прекъсванията ще се извикват доста често. В този случай вграденият таймер Timer0 се клоква без прескалер (стойността се увеличава веднъж на инструкция) и само 32 инструкции могат да бъдат изпълнени във времето между излизането от манипулатора на прекъсване и извикването на следващата. И така, на технически език това означава: в манипулатора на прекъсване за препълване на таймера Timer0 информацията за това кой светодиод е включен се актуализира, в края на манипулатора на прекъсване регистърът на броя на таймера се нулира със стойност 0xD0, което го кара да препълни отново след време, равно на изпълнението на инструкции 0x20. За микроконтролера PIC16F1823 това е малко по-лесно за изпълнение, тъй като той може да работи на честота от 32 MHz (8 MIPS производителност). В този случай таймерът се тактува чрез 1/8 прескалер и стойността 0x60 се зарежда в броячния регистър на таймера.

Реализирането на контрола на прекъсванията на LED матрицата означава, че на процесора остава много малко време за изпълнение на основния код, но ще бъде достатъчно за формиране на изображението, изведено на дисплея. Авторът е написал няколко тестови функции за показване на различни елементи на LED дисплея, но ще разгледаме пример за показване на текущото време под формата на тикер. В програмата на микроконтролераизползва се прост растерен шрифт за изобразяване на примерна вертикална линия, показваща часа на екрана. Въпреки че това приложение използва само цифри и препинателни знаци, изходният код поддържа всички печатни ASCII символи в диапазона 0x20 - 0x7F. Всеки друг код, който генерира изображение 11x10, също ще работи.

Микроконтролерът PIC16F688 има едно предимство пред PIC16F1823: той има два пъти повече RAM. Това позволява използването на двоен буфер на паметта на дисплея (преден или кадров буфер и заден буфер), като по този начин осигурява достатъчно богат набор от софтуерни функции за чертане на елементи на екрана:

Що се отнася до използването на микроконтролера PIC16F1823 в нашия проект, трябва да се отбележи един недостатък: количеството RAM не е достатъчно за реализиране на буфериране на двоен екран, но поради високата производителност този недостатък може да бъде компенсиран от софтуера: основният код получава много повече цикли, за да подготви всеки кадър през времето между прекъсванията за актуализиране на дисплея.