Схема на LED матрици. LED матрици

През последните години LED матриците навлязоха широко във външната реклама и различни информационни табла. Доста ярки, динамични - те перфектно привличат вниманието и не заслепяват в слънчев ден. Всеки от вас ги вижда всеки ден по улиците на своя град.
Разбира се, тяхното разпространение беше улеснено от ниската цена (поради китайските производители) и лекотата на сглобяване на екрана.

Но какво ще стане, ако се опитате да използвате такива матрици във вашите устройства на микроконтролери? Какъв е интерфейсът за обмен и изходната логика на тези матрици?
Нека се опитаме да разберем всичко.

Китайците предлагат както самите матрици с различни размери и с различни резолюции, така и контролери за показване на изображения върху тях с различни прости ефекти, както и всички необходими аксесоари, свързващи кабели, рамки.
Матриците се срещат като едноцветни (бяло, жълто, червено, зелено, синьо) и 3-цветни (RGB). Обозначението на модела на матрицата обикновено изглежда като Pxx или PHxx, където xx е число, показващо разстоянието между пикселите в милиметри. В моя случай е P10. Освен това матриците с някои стандартни размери са не само правоъгълни, но и квадратни.

Възможни опции за размери на матрицата



И така, имаме бяла матрица от 32x16 пиксела с размери 320x160 мм и съответно междупикселно разстояние 10 мм. Нека го разгледаме по-отблизо.
Изглед отпред:

Също така ви се стори, че светодиодите са някакви овални? Не си ли помислихте...


Над светодиодите е направена малка козирка, която не позволява на слънчевата светлина да осветява светодиодите.

Изглед отпред със свалена пластмасова маска



Обръщаме матрицата и виждаме дъската:


На платката има куп логически чипове. Нека да видим какви са тези микросхеми:
1. 1 x SM74HC245D - неинвертиращ буфер
2. 1 x SM74HC04 - 6-канален инвертор
3. 1 x SM74HC138D - 8 битов декодер
4. 4 x APM4953 - монтаж на 2 P-канални MOSFET
5. 16 x 74HC595D Регистър за превключване със заключване
Два 16-пинови конектора са интерфейс, единият от тях е вход (към него е свързан екранният контролер), а вторият е изход (към него е свързана следващата матрица във веригата). Стрелката на платката е насочена от входния конектор към изхода.
Захранването се подава към клемите в центъра на платката. Захранващо напрежение - 5V, максимален ток (при включени всички LED матрици) - 2A (за бяла матрица).

Цялата горна информация, както и демонстрация на матрицата във видеото по-долу. В него от 13:04 до 15:00 говоря за зависимостта на яркостта на екрана от броя на матриците. Това се дължи на грешка в алгоритъма. Грешката е коригирана и сега данните се зареждат преди екранът да се изключи.

И аз ще се радвам да ви видя моят канал в youtube, където все още свързвам много неща към микроконтролери.

Благодаря на всички за вниманието!

Предимствата на светодиодите са неоспорими, днес те са навсякъде, включително часовниците. Какви са часовниците на LED матрици, ще анализираме плюсовете и минусите в статията. В края на статията е представено подробно ръководство стъпка по стъпка за създаване на устройство със собствените си ръце.

Какво е

LED матричен часовник е електронен часовник, който използва матрица от множество светодиоди за дисплей. Използването на индикатори от различен тип е единствената им разлика.

Матрицата е набор от светодиоди, сглобени заедно в решетка с един анод или катод. По правило разделителната способност на такива индикатори - броят на точките вертикално и хоризонтално - е 8×8.

Защо такива часовници набират популярност, предимства:

  1. Цена. LED матриците са по-евтини от седемсегментните индикатори с подобни размери.
  2. Яркост. Светодиодите са по-ярки от 7-сегментните дисплеи и се виждат по-лесно на слънчеви места. Много производители също така осигуряват конструктивна защита на диода от излагане на слънце.
  3. Функционалност. С помощта на матрица от светодиоди можете да показвате не само цифри, но и различни букви, препинателни знаци, символи. С помощта на набор от LED-матрици можете да покажете някаква информация под формата на пълзяща линия.

LED матриците също имат недостатъци:

  • Повишена сложност на контрола. Поради големия брой елементи (има 64 от тях в стандартната матрица), е по-лесно да се контролират матричните индикатори, отколкото седемсегментните. За това се използват микроконтролери, динамична индикация и регистри за смяна.
  • Ъгъл на гледане. Особеността на светодиодите е, че те фокусират светлината в една посока. Това води до факта, че изображението върху LED матрицата се вижда добре само под определен ъгъл.
  • Непоносимост към високи температури. Топлината намалява ефективността на светодиодите и скъсява живота им.
  • Изгарянето на отделни светодиоди ще доведе до ефекта на "счупен пиксел" и влошаване на качеството на изображението.

Самоделни часовници на LED матрици

Въпреки голямата популярност на часовниците на LED матрици, в RuNet няма толкова много схеми за тяхното самостоятелно производство. Нека разгледаме най-популярните.

Необходими умения за сглобяване на устройството:

  • производство на печатни платки;
  • елементи за запояване: схемата предполага SMD изпълнение, което означава, че елементите ще бъдат инсталирани директно върху повърхността на платката;
  • фърмуер на микроконтролери: MK ATMega16A се използва във веригата;
  • MK програмиране: това не е необходимо, тъй като фърмуерът на контролера вече е наличен за това устройство. Това умение ще ви бъде полезно, ако искате да промените режима на работа на часовника или да разширите неговата функционалност, например чрез добавяне на допълнителни елементи като сензори за температура или влажност.

От инструментите, от които се нуждаете:

  • комплект за изработка на дъски;
  • МК програмист;
  • поялник.

Нека разгледаме по-подробно схемата на устройството. Основният контролен елемент е MK ATMega16A, той осигурява следните характеристики на устройството:

  1. Обратно броене и календар. Работи дори когато захранването е изключено.
  2. Аларма. Тук има 9 от тях, можете да ги програмирате да работят в дните от седмицата.
  3. Измерване на температурата. Дизайнът на часовника ви позволява да инсталирате два температурни сензора за измервания в стаята и на улицата.
  4. Режим на течаща линия. Дава следната информация: ден от седмицата, месец, година, температура.
  5. Корекция на часовника.

Повечето от функциите са присвоени на микроконтролера, което ви позволява да разтоварите веригата възможно най-много и да използвате минималния брой елементи.

Устройството използва само две микросхеми: микроконтролер и регистър за смяна TPIC6B595, можете също да свържете два температурни сензора DS18B20 - един външен и втори вътрешен.

За индикация се използват три LED матрици 8×8. Като диод D1 е по-добре да използвате диод на Шотки. Диодът във веригата осигурява прехода към аварийно захранване, а диодът на Шотки има най-нисък спад на напрежението и висока скорост на превключване.

Производствен процес:


Някои от функциите при сглобяване на часовник на LED матрица с ATMega 16A са налични в следващото видео.

Часовниците на LED матрици имат много предимства пред устройства с различен тип индикация: те са по-евтини, не се огряват от слънцето, могат да се използват за показване на повече информация. Има голям брой модели часовници на led матрици и всеки ще намери устройство за себе си с необходимата функционалност. Също така, такива часовници са лесни за правене сами, както видяхте от ръководството стъпка по стъпка по-горе, това не изисква специални инструменти или специални умения.

!
Днес ще се забавляваме с адресируема LED матрица. Този проект е доста сложен, но в същото време всеки може да го повтори. Автор на проекта е AlexGyver.

Адресируемата LED лента се състои от трицветни светодиоди, всеки от които има специална микросхема.


Микросхемата в светодиодите предава информация един на друг. Това ви позволява да запалите всеки светодиод върху лентата с един от 16 000 000 цвята и нюанса. И най-готиното е, че всичко се управлява от една жица, живеем в много интересно време.
Лентата се управлява от микроконтролер, като платформата arduino.


Такъв куп сам по себе си е много интересен и можете да намерите куп приложения в дизайна или домашно приготвените продукти, което си струва само ефекта на пламъка. Но днес няма да говорим за това. Какво се случва, ако лентата се постави на зигзаг и се постави така, че светодиодите да образуват равномерна, правилна мрежа? Точно така, LED матрицата. За удобство можете да си купите готова матрица от китайците и най-интересното е, че струва много по-малко от закупуването на лента и прекарването на няколко часа в рязане и свързване на парчета с жици.




Например има такава матрица 8X8, най-евтината, ще бъде по-лесно за някой да си играе с нея.


Характеристиката на днешния проект е неговата гъвкавост и гъвкавост, тоест можете да закупите готова матрица, но тя е малка, така да се каже, но можете също да закупите лента с ниска плътност на светодиодите и да направите матрица от него, да речем, със снимка. Това ще бъде страхотно.
Матрицата предоставя страхотни възможности за създаване на различни пикселни ефекти, показване на картинки и гифчета (gif), създаване на класически игри и други интересни неща. Не забравяйте да посетите страницата на проекта, там ще намерите всички необходими връзки, фърмуер, диаграми и допълнителни инструкции.
И така, въоръжени с матричен контролен инструмент, ние имаме способността да запалим всеки светодиод според неговите координати.


Страхотно, можете да правите всякакви страхотни ефекти. Можете да го управлявате от вашия смартфон чрез bluetooth. Тоест смартфонът изпраща някои команди чрез bluetooth, модулът ги получава и ги прехвърля на arduino. А arduino от своя страна извежда данни към матрицата.




Авторът започна, като реши да направи инструмент за рисуване, тоест, за да можете да изберете цвят и да запалите всеки светодиод на матрицата.


Първата стъпка беше да се разработи комуникационен протокол с arduino.


Първата цифра в него е режимът, а останалите са отговорни за различни настройки и други предавани стойности. След това авторът направи графично поле, върху което начерта решетка.

Програмата проследява координатите на докосване на полето с пръст и рисува квадрат на това място с произволен цвят. По пътя координатите на квадрата се изпращат до arduino.

За производството ни трябва:
1) Матрица или лента на адресируеми светодиоди;
2) Ардуино;
3) Bluetooth модул;
4) Резистор.


Можете да си купите един паунд от китайците или можете да го купите във всеки радиомагазин. Свързваме компонентите по много проста схема:


Можете да съберете всичко на макет. След това изтеглете архива с проекта от страницата на проекта, инсталирайте библиотеките според инструкциите и отворете файла на фърмуера.




Тук имаме настройки. Посочете размера на вашата матрица, нейния тип и точка на свързване.

Ако сами направите голяма матрица, тоест спойка от парчета лента, тогава имате 2 вида за избор.


Авторът съветва да изберете правилната опция, тъй като е по-лесна за запояване. Сега остава да се вземе решение за началото на матрицата, тоест точката на свързване към нея и посоката на първото парче лента. Този измамен лист ще помогне за всичките 8 опции за местоположението на матрицата:


Авторът отдели огромно количество време за този фърмуер. Това е най-големият проект на автора по количество код. Arduino е опакован просто до очните ябълки, избутан, както се казва, nevpihuemoe.


И така, настройте, щракнете, за да изтеглите фърмуера. Преди да изтеглите, не забравяйте да изключите bluetooth от rx щифта, в противен случай arduino няма да мига. За удобство можете също да запоите превключвател към проводника.


След това инсталирайте приложението GyverMatrixBT на вашия смартфон с Android. Това приложение е достъпно в Play Market, то е напълно безплатно и без реклами.


След това сдвоете с bluetooth модула (парола 1234 или 0000), свържете се с модула в приложението и това е всичко. В настройките можете да регулирате яркостта и размера на матрицата, която съответства на вашата, както и някои други нейни параметри.

Според коригирания размер ще имаме поле в раздела за чертане. Кликнете, за да го инициализирате. Тук можете да рисувате с докосвания и плъзгания, можете да изтривате, можете да изчистите полето и да го запълните с цвят.




Като цяло в момента имаме работещ инструмент за изпращане на данни към матрицата. Можеш да продължиш. Цялата тази система е замислена от автора, за да изгради голяма матрица от лента или модули. Интересен е като проект, като хоби, може на някой да му е полезен за рекламни цели, за украса или за дизайн, е, или просто за забавление.

Но матрицата в тази форма не изглежда много готина, не е пикселирана и не е осем-битова. Задължително е да направите решетка, така че всеки светодиод да образува свои квадратни пиксели и да поставите дифузер отгоре. Тогава всичко ще е много яко. Решетката може да бъде изработена от всякакъв материал във форма и летви. Това може да бъде картон, пакет съветски дървени владетели или пластмасов вариант (PVC ъгъл), можете да го закупите в магазин за строителни материали, където има пластмасови панели и различни продукти за тях. Ъглите могат да се счупят по дължина, да се направят разрези за средата и да се сглоби решетката. Това е най-„колективната“ опция след картона.

И разбира се, можете да се отпуснете и да отпечатате решетката на 3D принтер. Така че нека го направим.






И така, тялото на матрицата е отпечатано. Между другото, авторът смята, че черното не е най-добрият избор, по-добре е да отпечатате решетката в бяло, така че да отразява светлината. Е, няма значение, ще го боядисаме.


Всъщност, тук е нашата матрица без решетка, светодиодите, каквито са.


Слагаме решетката, тя става по-остра, това е защото гледаме под ъгъл.


А сега вижте какво се случва, ако добавите дифузер под формата на лист хартия.


Но матрицата, както всеки дисплей, работи в цветовото пространство rgb и нейният фон трябва да е черен за по-правилно цветово възприятие. Авторът опита няколко варианта и се спря на филм за

Понякога е необходимо да се свържат няколко седемсегментни индикатора или LED матрица към микроконтролера, докато динамичната индикация се използва за показване на информация. Същността на динамичната индикация е последователното показване на информация върху индикаторите. Диаграмата по-долу показва пример за свързване на няколко седемсегментни индикатора (например с общ катод) за реализиране на динамична индикация, като цяло, като се вземе предвид точката, се получават 8 сегмента, но по стария начин те са наречен така. Всички изводи (аноди) на сегментите със същото име са свързани заедно, за общо 8 линии, които са свързани към микроконтролера чрез резистори. Общият катод на всеки индикатор е свързан към микроконтролера чрез транзистор.


Алгоритъмът за индикация е следният: първо задаваме необходимите логически нива на линиите, в зависимост от това кои сегменти трябва да бъдат включени на първия индикатор (индикация отляво надясно), с високо логическо ниво за включване, ниско до изключете сегмента. След това прилагаме високо логическо ниво към основата на транзистора VT1, като по този начин общият катод на първия индикатор е свързан към общия проводник, в този момент тези сегменти светят, на анодите на които има логическа единица. След определено време (пауза) изключваме индикатора, като прилагаме ниско логическо ниво към основата на транзистора, след което отново променяме логическите нива на линиите в съответствие с изходната информация, предназначена за втория индикатор, и изпращаме сигнал за включване към транзистора VT2. Така, по ред в кръгов цикъл, ние превключваме всички индикатори, това е цялата динамична индикация.

За да получите стабилно изображение без трептене, превключването трябва да се извършва с висока скорост, за да се предотврати трептенето на светодиодите, честотата на опресняване трябва да бъде зададена от 70 Hz или повече, обикновено я настройвам на 100 Hz. За горната конструкция паузата се изчислява, както следва: за честота от 100 Hz периодът е 10 ms, има само 4 индикатора, съответно времето на светене на всеки индикатор е зададено на 10/4 = 2,5 ms. В един корпус има многоцифрени седемсегментни индикатори, в които едноименните сегменти са свързани вътре в самия корпус, разбира се, за да ги използвате, е необходимо да използвате динамична индикация.

За реализиране на динамична индикация е необходимо да се използват прекъсвания при препълване на един от таймерите. По-долу е кодът, използващ таймера TMR0:

;Внедряване на динамична индикация за 4 седемсегментни индикатора ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; swapf STATUS,W; clrf СТАТУС; movwf STATUS_TEMP; ; bcf ind1 ;изключване на 1-ви индикатор bcf ind2 ;изключване на 2-ри индикатор bcf ind3 ;изключване на 3-ти индикатор bcf ind4 ;изключване на 4-ти индикатор; incf shet,F ;увеличение на регистъра shet movlw .5 ;проверка на съдържанието на регистъра shet xorwf shet,W ;проверка дали е равно на 5 btfss STATUS,Z ; goto met1 ;номерът в регистъра shet не е равен на 5 movlw .1 ;номерът в регистъра shet е 5: запишете номер 1 movwf shet ;в регистъра shet ; met1 movlw .1; проверка на съдържанието на регистъра shet xorwf shet,W; равно на номер 1 btfss STATUS,Z; goto met2 ;номерът в регистъра shet не е равен на 1: прескачане към met2 movf datind1,W ;номерът в регистъра shet е равен на 1: копиране на movwf PORTB ;съдържание на регистър datind1 в регистър PORTB bsf ind1 ;включване на 1-ви индикатор met2 movlw .2 ;проверете съдържанието на регистърния лист xorwf shet,W ;равно на 2 btfss STATUS,Z ; goto met3 ;номерът в shet регистър не е равен на 2: скочи към met3 movf datind2,W ;номерът в shet регистър е 2: копирай movwf PORTB ;съдържанието на datind2 регистър към PORTB регистър bsf ind2 ;включи 2-ри индикатор goto exxit ;скочи до етикет изход met3 movlw .3; проверка на съдържанието на регистъра shet xorwf shet,W; равно на 3 btfss STATUS,Z; goto met4 ;номерът в shet регистър не е равен на 3: скочи към met4 movf datind3,W ;номерът в shet регистъра е 3: копирай movwf PORTB ;съдържание на datind3 регистър към PORTB регистър bsf ind3 ;включи 3-ти индикатор goto exxit ;скочи до label exxit met4 movf datind4,W ;копиране на съдържанието на регистъра datind3 movwf PORTB ;в регистъра PORTB bsf ind4 ;включване на 4-тия индикатор; movlw .100 ;запис на 156 в регистъра на таймера TMR0 movwf TMR0 ; ; movwf СТАТУС; swapf W_TEMP,F; swapf W_TEMP,W; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Основна програма ................. movlw b"11010011" ; OPTION_REG, като по този начин се настройва вътрешното ; настройка на съотношението на предскалера 1:16 ; clrf shet; нулиране на регистърния лист, преди стартиране; прекъсване при препълване TMR0, изпълнено; clrf datind1 ;изчистване на регистри за извеждане на информация към clrf datind2 ;индикатори, това е еквивалентно на изключване на clrf datind3 ;индикатори, като индикатори с общ clrf datind4 ;катод; bcf INTCON,T0IF; изчистване на флага за прекъсване при препълване на TMR0 bsf INTCON,T0IE; активиране на прекъсвания при препълване на TMR0 bsf INTCON,GIE; активиране на глобални прекъсвания; movlw b"00000110"; 13.52 пример за изход movwf datind1; movlw b"11001111"; movwf с дата2; movlw b"01101101"; movwf с дата3; movlwb"01011011"; movwf с дата4; ; . ................; .................; .................; ; край ; край на цялата програма;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Въвеждане на динамична индикация за 4 седемсегментни индикатора

; Примерна тактова честота 4 MHz, машинен цикъл 1 µs

org 0000h ;стартира изпълнението на програмата на адрес 0000h

goto Start ;отидете на етикет Start

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Прекъсване на рутина

org 0004h ;стартиране на изпълнение на подпрограма на адрес 0004h

movwf W_TEMP ;запазване на стойностите на регистъра на ключовете

swapf STATUS,W;

movwf STATUS_TEMP;

bcf ind1 ;изключване на първия индикатор

bcf ind2 ;изключване на втория индикатор

bcf ind3 ;изключване на 3-тия индикатор

bcf ind4 ;изключване на 4-тия индикатор

incf shet,F ;увеличение на регистрационния лист

movlw .5; проверете съдържанието на регистрационния лист

xorwf shet,W; равно на 5

btfss СТАТУС,Z;

goto met1 ;номерът в регистрационния лист не е равен на 5

movlw .1 ; номерът в регистъра на листа е 5: запишете номер 1

movwf shet; за регистриране на shet

met1 movlw .1; проверка на съдържанието на shet регистър

xorwf shet,W; равно на число 1

btfss СТАТУС,Z;

goto met2 ;номерът в регистъра shet не е равен на 1: преминава към met2

movf datind1,W; номерът в регистъра на листа е 1: копие

movwf PORTB; съдържанието на регистъра datind1 към регистъра PORTB

bsf ind1 ;включете 1-ви индикатор

goto exxit ;отидете на етикет exxit

met2 movlw .2; проверка на съдържанието на shet регистър

xorwf shet,W; равно на число 2

btfss СТАТУС,Z;

goto met3 ;номерът в регистъра shet не е равен на 2: преминаване към met3

movf datind2,W; номерът в регистъра на листа е 2: копие

movwf PORTB; съдържанието на регистър datind2 към регистър PORTB

bsf ind2 ;включете втория индикатор

goto exxit ;отидете на етикет exxit

met3 movlw .3; проверка на съдържанието на shet регистър

xorwf shet,W; равно на число 3

btfss СТАТУС,Z;

goto met4 ;номерът в shet регистър не е равен на 3: преминете към met4

movf datind3,W; номерът в регистъра на листа е 3: копие

movwf PORTB; съдържанието на регистър datind3 към регистър PORTB

bsf ind3 ;включете 3-тия индикатор

goto exxit ;отидете на етикет exxit

met4 movf datind4,W; копиране на съдържанието на регистъра datind3

movwf PORTB ;към PORTB регистър

bsf ind4 ;включете 4-тия индикатор

изход bcf INTCON,T0IF ;нулиране на TMR0 флаг за прекъсване при препълване

movlw .100 ;запис на номер 156 в регистъра на таймера TMR0

swapf STATUS_TEMP,W; възстановяване на съдържанието на ключови регистри

swapf W_TEMP,F;

swapf W_TEMP,W;

retfie ;изход от процедурата за прекъсване

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Основна програма

Старт ................. ;първоначална настройка на регистрите

................. ;със специално предназначение

.................

bsf STATUS,RP0 ;запишете двоично число 11010011 за регистриране

movlw b"11010011" ;OPTION_REG, като по този начин задава вътрешния

movwf OPTION_REG; източник на часовник за TMR0

bcf STATUS,RP0 ;разрешаване на преразмер преди TMR0

;Задайте съотношението на предскалера на 1:16

clrf shet; нулирайте регистъра на shet преди стартиране

;прекъсване при препълване TMR0, изпълнено

;веднъж след включване

clrf datind1; изчистване на регистри за извеждане на информация

clrf datind2 ;индикатори, еквивалентни на изкл

clrf datind3 ;индикатори, тъй като индикатори с общ

clrf datind4 ;катод

bcf INTCON,T0IF ;нулиране на TMR0 флаг за прекъсване при препълване

bsf INTCON,T0IE ;разрешаване на прекъсвания при препълване на TMR0

bsf INTCON,GIE; разрешаване на глобални прекъсвания

movlw b"00000110"; 13.52 пример за изход

movlw b"11001111";

movlw b"01101101";

movlwb"01011011";

................. ;

................. ;

................. ;

край ; край на цялата програма

В основната програма първо настроихме таймер с помощта на регистъра OPTION_REG, по-рано говорих за използването на таймери за . След това изчистваме листовия регистър, предназначен за въвеждане на брой от 1 до 4, за всеки индикатор. Този регистър се увеличава в рутинната услуга за прекъсване и се коригира там (ще брои от 1 до 4), така че това изчистване се извършва веднъж след включване. Въз основа на този регистър ще определим кой показател да включим и ще издадем данни, съответстващи на него. Следващата стъпка е да изчистите регистрите за съхранение на информация, четирите регистъра datain1,2,3,4, съответстващи на четирите индикатора. Изчистването е еквивалентно на изключване на индикаторите, тъй като в рутинната услуга за прекъсване съдържанието на тези регистри се прехвърля в регистъра PORTB, към който са свързани индикаторните аноди. Това е необходимо, за да не се показва боклук на индикаторите след активиране на прекъсванията, по принцип това не може да се направи, ако правилната информация се записва веднага за изход. След това нулирайте флага за прекъсване при препълване на таймера, активирайте прекъсванията при препълване на TMR0 и накрая активирайте глобалните прекъсвания.

В програмата за прекъсване първо изключваме всички индикатори (чрез прилагане на ниски логически нива към базите на транзисторите), защото не се знае кой от тях е включен. Увеличаваме регистъра на листа, като проверяваме за равенство на числото 5, ако има такова съвпадение, напишете числото 1 в регистъра, тъй като е необходимо да броим от 1 до 4. След това проверяваме кое число е в листа регистър, чрез който зареждаме данни от PORTB в PORTB регистри за съхранение на информация (dataind) за съответния индикатор и го включваме. След това нулираме флага за прекъсване при препълване на TMR0, записваме числото 100 в таймера (изчисляването на тази стойност е дадено по-долу) за забавяне във времето и излизаме от манипулатора на прекъсвания. При първото прекъсване се включва първият индикатор, при второто прекъсване - вторият и така нататък в кръгов цикъл. В основната програма остава само да се заредят данни в регистрите за съхранение на информация за всеки индикатор. В подпрограмата за прекъсване не забравяйте да запазите и възстановите стойностите на ключовите регистри, писах за това в статия за.

За извеждане на числа е по-добре да използвате генератор на знаци под формата на таблица с данни. Например, за да се покаже числото 3456 на индикаторите, то трябва да бъде разделено на цифри, докато е по-добре да използвате отделни регистри за съхраняване на броя на цифрите (от 0 до 9), след което да пуснете тези регистри през генератора на знаци, като по този начин получаване на правилните байтове (заредени в регистрите на данни и) за запалване на съответните сегменти.

Ще приемем честотата на тактовия генератор 4 MHz, машинният цикъл е 1 μs. Нека честотата на опресняване на всеки индикатор е 100 Hz (период T = 10 ms), съответно необходимото времезакъснение е 10/4 = 2,5 ms. Коефициентът на прескалер за TMR0 е настроен на 1:16, докато максималното възможно забавяне е 256x16 = 4096 µs и се нуждаем от пауза от 2,5 ms. Нека изчислим числото, което да запишем в TMR0: 256-((256x2.5)/4.096) = 256-156.25 = 99.75. След закръгляване получаваме числото 100.

По-долу можете да изтеглите модел за програмата Proteus, фърмуер и изходен код с внедряване на динамична индикация на 4-цифрен индикатор с общ катод с помощта на микроконтролера PIC16F628A. Например на индикатора се показват числата 0000; 0001; 0002; 13,52; 9764.

Сега помислете за свързване на матрица с резолюция 8x8 пиксела (LED). Структурата на матрицата обикновено се разглежда по отношение на редове и колони. На снимката по-долу във всяка колона са свързани катодите на всички светодиоди, а във всеки ред анодите. Стрингове (8 линии, LED аноди) са свързани чрез резистори към микроконтролера. Всяка колона (LED катоди) е свързана към микроконтролера чрез 8 транзистора. Алгоритъмът за индикация е същият, първо задаваме необходимите логически нива на редовете, в съответствие с които светодиодите трябва да светят в колоната, след което свързваме първата колона (индикация отляво надясно). След известна пауза изключваме колоната и променяме логическите нива на редовете, за да покажем втората колона, след което свързваме втората колона. И така последователно преместете всички колони. По-долу е показана схема за свързване на матрицата към микроконтролера.


Общо за свързване на такава матрица са необходими 16 пина на микроконтролера, което е доста, следователно, за да се намалят контролните линии, е по-добре да се използват серийни регистри за смяна.

Най-често срещаният сериен регистър е микросхемата 74HC595, която съдържа регистър за изместване за зареждане на данни и регистър за задържане, чрез който данните се прехвърлят към изходните линии. Зареждането на данни в него е просто, задайте логическата 0 на входа на часовника SH_CP, след това задайте необходимото логическо ниво на входа на данните DS, след което превключваме входа на часовника на 1, като същевременно запазваме стойността на нивото (на входа DS) вътре в регистъра за смяна. В същото време данните се изместват с един бит. Нулирайте отново изхода SH_CP на 0, задайте необходимото ниво на входа DS и повишете SH_CP на 1. След като регистърът за смяна е напълно зареден (8 бита), задайте изхода ST_CP на 1, в този момент данните се прехвърлят към регистър за съхранение и се подава към изходните линии Q0 ... Q7, след което нулираме изхода на ST_CP. По време на последователно зареждане данните се изместват от Q0 към Q7. Pin Q7' е свързан към последния бит на регистъра за смяна, този щифт може да бъде свързан към входа на втората микросхема, така че можете да заредите данни в две или повече микросхеми наведнъж. Пинът OE превключва изходните линии в трето състояние (високо съпротивление), когато към него се приложи логическа 1. Пинът MR е проектиран да нулира регистъра за преместване, тоест задаване на ниски логически нива на изходите на тригерите на регистъра , което е еквивалентно на зареждане на осем нули. По-долу е дадена диаграма за зареждане на данни в микросхемата 74NS595, задавайки стойността 11010001 на изходните линии Q0 ... Q7, при условие че първоначално имаше нули:


Помислете за свързване на матрица 8 × 8 към микроконтролер PIC16F628A, като използвате два регистъра за смяна 74HC595, диаграмата е показана по-долу:


Данните се зареждат в чипа DD2 (контрол на логическото ниво на редовете, LED аноди), след което се прехвърлят през щифта Q7 към DD3 (контрол на колона), съответно, първо зареждаме байта, за да активираме колоната, след това байта с логическите нива на редовете. Транзисторите превключващи матрични колони (LED катоди) са свързани към изходните линии на DD3. По-долу е програмният код за показване на изображение върху матрица:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Реализация на динамична индикация за матрица с резолюция 8x8 ;Честота на тактовия генератор например 4 MHz, машинен цикъл 1 µs org 0000h ;стартиране на изпълнение на програмата от адрес 0000h goto Start ;прескачане към надпис Start ;;;;;; ;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Прекъсване на рутина org 0004h ;стартиране на изпълнение на подпрограма от адрес 0004h movwf W_TEMP ;запазване на стойностите на регистъра на ключовете swapf STATUS,W ; clrf СТАТУС; movwf STATUS_TEMP; ; movwf FSR_osn ;към регистъра FSR_osn movf FSR_prer,W ;възстановяване на предварително записаната стойност movwf FSR ;на регистъра FSR от регистъра FSR_prer ;;;;;;;;;;;;;;;;;;;;;; ;;;;;; ;;;;;;;;;;;;;;;;;;;;;; ;заредете съдържанието на столб регистъра в чипа movf stolb,W ;копирайте съдържанието на столб регистъра movwf var ;в регистъра var met2 btfsc var,0 ;задайте изхода ds в съответствие с btfss var,0 ; bcf ds; bcf sh_cp; rrf var,F ;Регистър за преместване var вдясно за подготовка;следващ бит goto met2 ;scetbit не е равен на нула: прескачане към етикет met2 ;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;; ;заредете съдържанието на регистъра INDF в чипа;74HC595 (сериен регистър за изместване) movf INDF,W ;копирайте съдържанието на регистъра INDF movwf var ;в регистъра var movlw .8 ;запишете числото 8 в регистъра scetbit, за броене movwf scetbit ;прехвърлени битове met1 btfsc var ,7 ;задаване на изход ds според bsf ds ;стойност на 7-ми бит на регистър var btfss var,7 ; bcf ds; bsf sh_cp ;часовник sh_cp извеждане за фиксиране на данни bcf sh_cp ; rlf var,F ;Регистър за преместване var оставен за подготовка;следващ бит decfsz scetbit,F ;Намаляване с условието на регистъра scetbit goto met1 ;scetbit не е равен на нула: Преминете към етикет met1; bsf st_cp; часовник на изхода st_cp за прехвърляне на заредените bcf st_cp; байтове към изходните линии на чиповете 74HC595; bcf STATUS,C ;нулиране на бита C от състоянието на регистъра преди смяна rrf stolb,F ;ляв регистър за смяна stolb; incf FSR,F ;Увеличаване на регистъра на FSR, подгответе следващ ;Регистрирайте се за изпращане на данни към 74HC595 decfsz shet,F ;Намалете с условието на регистъра shet goto exxit ;Регистърът на листа не е равен на 0: Преминете към изход от movlw data1 ;Регистърът на листа е равен на 0: Записване на адрес първи movwf FSR ;Регистър за съхраняване на информация в FSR регистър movlw .8 ;Записване на числото 8 в shet регистъра, за поддържане на movwf shet ;Броене на колони ; изход bcf INTCON,T0IF ;нулиране на флага за прекъсване при препълване TMR0 movlw. 124 ;запис на номер 124 в регистъра на таймера TMR0 movwf TMR0 ; ; movf FSR,W ;Запазване на текущата стойност на FSR movwf FSR_prer ;Към FSR_prer movf FSR_osn ,W ;Възстановяване на записаната преди това стойност movwf FSR ;FSR от FSR_osn ; swapf STATUS_TEMP,W; възстановяване на съдържанието на ключовите регистри movwf STATUS; swapf W_TEMP,F; swapf W_TEMP,W; ; retfie ;изход от подпрограма за прекъсване;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Старт на главна програма ................ ;Първоначална настройка на регистри ................. ;Специално предназначение..... ............ bsf STATUS,RP0 ;записва двоично число 11010011 в регистър movlw b"11010010" ;OPTION_REG, като по този начин задава вътрешния movwf OPTION_REG ;източник на часовник за TMR0 bcf STATUS,RP0 ;разрешаване на прескалер преди TMR0; задайте съотношението на предскалера 1:8; movlw .8 ;запис на число 8 в shet регистър, преди стартиране на movwf shet ;tmr0 прекъсвания при препълване, изпълнени;веднъж, след включване на захранването movlw b"10000000" ;запис на двоично число 10000000 в movwf stolb ;stolb регистър, за активиране на 1-ва колона; е извършва се еднократно, след включване на захранването; movlw data1 ;Записване на адреса на първия регистър (регистри за съхранение movwf FSR_prer ;информация) в регистъра FSR_prer, извършено;един път след включване; movlw .8 ;изчистване на 8 регистъра на извеждане на информация към movwf tmp ;матрица, еквивалентно на изключване на movlw data1 ;матрица movwf FSR ; met3 clrf INDF; incf FSR,F ; decfsz tmp,F; goto met3; ; bcf INTCON,T0IF; изчистване на флага за прекъсване при препълване на TMR0 bsf INTCON,T0IE; активиране на прекъсвания при препълване на TMR0 bsf INTCON,GIE; активиране на глобални прекъсвания; m1 movlw данни1;R пример за изход movwf FSR; movlw b"00000000"; movwf INDF; incf FSR,F ; movlw b"01111111"; movwf INDF; incf FSR,F ; movlwb"00001001"; movwf INDF; incf FSR,F ; movlwb"00011001"; movwf INDF; incf FSR,F ; movlwb"00101001"; movwf INDF; incf FSR,F ; movlw b"01000110"; movwf INDF; incf FSR,F ; movlw b"00000000"; movwf INDF; incf FSR,F ; movlw b"00000000"; movwf INDF; ; .................; .................; .................; ; край ; край на цялата програма;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Реализация на динамична индикация за матрица с резолюция 8х8

; Примерна тактова честота 4 MHz, машинен цикъл 1 µs

org 0000h ;стартира изпълнението на програмата на адрес 0000h

goto Start ;отидете на етикет Start

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Прекъсване на рутина

org 0004h ;стартиране на изпълнение на подпрограма на адрес 0004h

movwf W_TEMP ;запазване на стойностите на регистъра на ключовете

swapf STATUS,W;

movwf STATUS_TEMP;

movf FSR,W ;запазва текущата стойност на FSR регистъра

movwf FSR_osn ; към FSR_osn регистър

movf FSR_prer,W; възстановяване на предишна записана стойност

movwf FSR ;FSR от FSR_prer

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;74HC595 (сериен регистър за смяна)

movf stolb,W; копиране на съдържанието на регистъра stolb

movwf var; за регистриране на var

movlw .8 ;запис на число 8 в scetbit регистър, за броене

movwf scetbit ;предадени битове

met2 btfsc var,0 ;задайте ds изход според

bsf ds; 7-ма битова стойност на регистър var

bsf sh_cp ; часовник sh_cp изход за фиксиране на данни

rrf var,F; преместващ регистър var вдясно за подготовка

;следващ бит

decfsz scetbit,F ;декремент с условие за регистър на scetbit

goto met2 ;scetbit не е равен на нула: преминете към етикет met2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;74HC595 (сериен регистър за смяна)

movf INDF,W; копиране на съдържанието на регистър INDF

movwf var; за регистриране на var

movlw .8 ;запис на число 8 в scetbit регистър, за броене

movwf scetbit ;предадени битове

met1 btfsc var,7 ;задайте ds изход според

bsf ds; 7-ма битова стойност на регистър var

bsf sh_cp ; часовник sh_cp изход за фиксиране на данни

rlf var,F ;left shift var за подготовка

;следващ бит

decfsz scetbit,F ;декремент с условие за регистър на scetbit

goto met1 ;scetbit не е равен на нула: преминете към етикет met1

bsf st_cp ; часовник на изхода на st_cp за прехвърляне, зареден

bcf st_cp ;байтове на 74HC595 изходни линии

bcf STATUS,C; изчистване на C бит от регистъра на състоянието преди смяна

rrf stolb,F ;ляв регистър за преместване stolb

incf FSR,F ;увеличаване на регистъра на FSR, подгответе следващия

; регистрирайте се за изпращане на данни до 74HC595

decfsz shet,F ;декремент с регистър състояние лист

goto exxit ;shet регистър не е равен на 0: скок към exxit

movlw data1 ;shet регистър е 0: запишете адреса на първия

movwf FSR ;Регистрирайте се, за да съхранявате информация във FSR

movlw .8 ;запишете номер 8 в shet регистър, за справка

movwf лист;брои колони

movlw b"10000000" ;запишете двоично число 10000000 в

movwf stolb ;регистрирайте stolb, за да включите 1-вата колона

изход bcf INTCON,T0IF ;нулиране на TMR0 флаг за прекъсване при препълване

movlw .124 ;запис на номер 124 в регистъра на таймера TMR0

movf FSR,W ;запазва текущата стойност на FSR регистъра

movwf FSR_prer ; към FSR_prer регистър

movf FSR_osn, W; възстановяване на предварително запазена стойност

movwf FSR ;FSR от FSR_osn

swapf STATUS_TEMP,W; възстановяване на съдържанието на ключови регистри

swapf W_TEMP,F;

swapf W_TEMP,W;

retfie ;изход от процедурата за прекъсване

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Основна програма

Старт ................. ;първоначална настройка на регистрите

................. ;със специално предназначение

.................

bsf STATUS,RP0 ;запишете двоично число 11010011 за регистриране

movlw b"11010010" ;OPTION_REG, като по този начин задава вътрешния

movwf OPTION_REG; източник на часовник за TMR0

bcf STATUS,RP0 ;разрешаване на преразмер преди TMR0

;Задайте съотношението на предскалера на 1:8

movlw .8 ;запишете номер 8 в shet регистъра преди стартиране

movwf shet; TMR0 препълване прекъсва, работи

;веднъж след включване

movlw b"10000000" ;запишете двоично число 10000000 в

movwf stolb ;регистрирайте stolb, за да включите 1-вата колона

Информацията с логически нива за редовете на всяка колона се съхранява в 8 регистъра за съхранение на информация, през които се осъществява достъп. Адресът на първия регистър се нарича data1. В допълнение към първоначалното записване на shet и stolb регистрите е необходимо да се запише адреса на първия регистър за съхранение на информация в регистъра FSR_prer (регистърът е data1, записът в FSR_prer се извършва веднъж, след което се коригира в манипулатор), само след това разрешете прекъсвания при препълване на TMR0.

Преди да активирате прекъсвания, е желателно да изчистите регистрите за съхранение на информация, тази операция се извършва с помощта на допълнителния tmp регистър (като брояч) и непряко адресиране, изчистването е еквивалентно на изключване на матрицата.

В процедурата за обработка на прекъсвания ние зареждаме съдържанието на регистъра stolb в чипа DD2 (първият път, когато влезете в манипулатора след активиране на прекъсванията, регистърът съдържа числото 10000000, както беше споменато по-горе). Зареждането започва от ниския бит на регистъра stolb, който се измества в посока от Q0 към Q7 (вътре в DD2 чипа), докато се зарежда, алгоритъмът за зареждане беше обсъден по-горе, така че мисля, че няма да е трудно да се разбере кодът . След това зареждаме съдържанието на регистъра INDF в DD2, това е един от регистрите за съхранение на информация, чийто адрес е във FSR (първият път, когато въведете манипулатора след активиране на прекъсвания, FSR съдържа адреса на първия регистър за съхранение на информация, наречен данни1). Зареждането започва от старшия бит на INDF регистъра. След зареждане на разглежданите 2 байта, часовник на изхода st_cp, като по този начин изтеглените данни се предават към изходните линии на микросхемите DD2, DD3. Така при първия вход към манипулатора се превключва първата колона на матрицата, в която светят светодиоди, на чиито аноди има високо логическо ниво, в съответствие със съдържанието на регистъра data1 ( първи регистър за съхранение на информация).

След това изместваме регистъра stolb надясно с един бит, за да подготвим втората колона на матрицата за превключване при следващото влизане в манипулатора на прекъсванията. Флагът C на регистъра STATUS трябва да бъде изчистен преди смяната, тъй като смяната става чрез този флаг и състоянието му не е известно по време на смяната. След смяната ние увеличаваме регистъра FSR, подготвяйки следващия регистър за съхранение (след регистъра data1) с логически нива на редове за втората колона. След това намаляваме shet регистъра с условието и ако то не е равно на нула, нулираме флага за прекъсване при препълване на TMR0, записваме номера в таймера и излизаме от манипулатора на прекъсвания.

Следващият път, когато влезете в манипулатора, втората колона на матрицата ще бъде активирана и т.н. Когато листовият регистър се нулира (след превключване на 8-та колона), числото 8 се записва в него за следващия цикъл на превключване на колони, освен това се коригира стойността на регистъра stolb, адресът на първия регистър за съхранение на информация ( data1) се записва в регистъра на FSR.

Нека изчислим закъснението за таймера TMR0, тактовата честота е 4 MHz, машинният цикъл е 1 µs. За да избегнем мигането на светодиодите, нека приемем честотата на опресняване на всяка колона като 100Hz (период T=10ms), забавянето във времето е 10/8 = 1,25ms. Задаваме съотношението на предскалера TMR0 на 1:8, докато максималното възможно забавяне е 256x8 = 2048 µs. За пауза от 1,25 ms, таймерът трябва да брои (256x1,25) / 2,048 = 156,25 пъти, като закръгляме нагоре, получаваме 156 броя. Съответно е необходимо да запишете в таймера числото 256-156 = 100. Но това не е съвсем правилната стойност, тъй като отнема известно време за изпълнение на рутинната процедура за прекъсване, в този случай отнема около 190 µs, преизчислено, като се вземе отчитаме коефициента на предскалера, получаваме 190/8 = 23,75 или 24 точки. Правилната стойност за запис в TMR0 е: 100+24=124.

В основната програма записваме 8 регистъра за съхранение на информация, в съответствие с това, което искаме да изведем на матрицата. По-долу има диаграма, обясняваща извеждането на информация към матрицата за горния код.


В допълнение към регистрите за смяна има специализирани драйвери за показване на информация на седемсегментни индикатори и LED матрици, в този случай самият драйвер реализира динамична индикация, остава само да изпрати данни към него за показване. Прегледах един от тези популярни драйвери в статия за.

Под връзката можете да изтеглите фърмуера и изходния код за микроконтролера PIC16F628A, с внедряването на динамична индикация на матрица 8x8 с помощта на два регистъра за смяна 74HC595, диаграмата на свързване беше обсъдена по-горе. Буквите R, L, числото 46, усмивка и просто шаблон под формата на кръст се показват последователно на матрицата, тази анимация е показана във видеото по-долу.

с етикети , . Прочети .

8x8 матрични LED дисплеи се предлагат в различни размери и са забавни за работа. Големите индустриални възли са с размер около 60 x 60 mm. Въпреки това, ако търсите много по-големи светодиодни масиви, те са трудни за намиране.

В този проект ще изградим наистина голям LED матричен LED дисплей, който се състои от няколко големи 8x8 LED модула, свързани последователно един с друг. Всеки от тези модули е с размер около 144 x 144 mm.

Особеността на този дисплей е, че ако е необходимо, можете да погледнете фона зад него. Това позволява творческо използване на тези дисплеи, като например поставянето им пред стъклени панели, така че да можете да виждате какво се случва зад дисплея.

За този проект ще използваме 10 мм. Можете да използвате и други размери. Обикновено наличните размери са 3 мм, 5 мм, 8 мм и 10 мм.

Въпреки че дисплеят не е проектиран да работи с микроконтролер, ние ще използваме популярните платки Arduino и ще го свържем чрез SPI, като използваме само 3 сигнални проводника.

За изграждането на този проект са необходими основни познания по електроника и запояване на компоненти, както и известни познания за използването на Arduino. фърмуер .

Тук трябва да запоите светодиодите заедно, като използвате дългите крака на светодиодите. Можете да използвате всеки LED размер и цвят, но дължината на крака (повече от 23 mm) трябва да е достатъчно дълга, за да ги огънете и запоите заедно. Светодиодите са подредени под формата на матрица 8x8, като катодите са запоени заедно за редовете, а анодите за колоните.

Драйверът MAX7219 контролира динамичната индикация на LED матрицата. При проектирането всяка 8x8 LED матрица ще се базира на верига, използваща следните компоненти:

  • 1 x MAX7219
  • 1 x 10uF 16V електролитен кондензатор
  • 1 x 0.1UF керамичен кондензатор
  • 1 x 12 kΩ резистор (0,25 W)
  • 1 x 24-пинов DIP IC гнездо

Имайте предвид, че може да се наложи да изберете различна стойност на резистора, за да работите със светодиода, който използвате. Този резистор ограничава максималния ток на MAX7219, който ще бъде изведен към светодиодите.

И това видео показва ясно как се инсталира LED матрицата, електронната контролна платка и прост тест за стартирането й с помощта на популярната Arduino UNO / Nano платка.


Едно от важните предимства на този преобразувател е, че той практически не се нуждае от настройка, цялата настройка се свежда до избора на честотния кондензатор на микросхемата, те се настройват на желаната честота, с увеличаване на капацитета на този кондензатор, честотата намалява, с увеличаване се увеличава.



Свързани статии: