У нашем претходном водичу сазнали смо о трептању ЛЕД-а помоћу ПИЦ микроконтролера и направили смо исти круг на Перф плочи. Затим смо користили ПИЦкит 3, ИЦСП и МПЛАБ ИПЕ за избацивање програма на нашу Перф плочу. Сада ћемо у овом упутству унапредити себе тако што ћемо користити више пинова на ПИЦ микроконтролеру. Користићемо 7 излаза (ЛЕД) и један улаз. За овај водич користићемо стару Перф плочу (приказану доле) и додаћемо берг штапиће да извучемо потребне игле на другу ЛЕД плочу. На крају овог водича генерисаћемо серију трепћућих ЛЕД диода помоћу ПИЦ микроконтролера ПИЦ16Ф877А и научићемо како се користи више улаза и излаза, неке основе о позивању петље и функције.
ЛЕД плоча није ништа друго него још једна перф плоча, на коју ћемо лемити ЛЕД диоде тренутним ограничавајућим отпорником (приказан доле). Такође ћемо додати дугме за покретање трептања ЛЕД у секвенци.
Кружни дијаграм:
ПИЦ микроконтролер ПИЦ16Ф877А Шифра секвенци која трепће ЛЕД и радно објашњење:
Комплетни код је дат у наставку (проверите на крају), овде ћемо га добити кроз ред по ред. Овај код ће почети да светли ЛЕД-има узастопно када се притисне тастер. Да бисте разумели секвенце, погледајте видео на крају водича. Препоручио бих вам да упоредите излаз приказан у видеу са кодом испод и покушате да разумете програм.
Погледајмо код ред по ред. Првих неколико редова је за подешавање конфигурационих битова који су објашњени у претходном водичу, па их за сада прескачем. Најбољи начин да се разуме било који програм је да се крене од главне ( воид маин () ) функције, па хајде да то урадимо
ТРИСБ0 = 1; // Упутите МЦУ да се ПОРТБ пин 0 користи као улаз за дугме. ТРИСД = 0к00; // упутите МЦУ да су сви пинови излаз ПОРТД = 0к00; // Иницијализујте све пинове на 0
Реч ТРИС користи се за дефинисање да ли се пин користи као улаз / излаз, а реч ПОРТ за израду пин-а Хигх / Лов. Линија ТРИСБ0 = 1 ће направити 0-ти пин ПОРТА Б као улаз. Ово ће бити наше дугме. Линије ТРИСД = 0к00; ПОРТД = 0к00; ће све пинове порта Д учинити излазним и тим пиновима доделити почетну вредност ЛОВ.
Пошто смо рекли да се Б0 користи као улаз, повезаћемо један крај тастера са затиком Б0, а други крај са земљом. До тада, кад год притиснемо дугме, затик ће бити уземљен, као што је приказано на горњем дијаграму повезивања. Али да би се то догодило морамо користити отпорник на извлачење тако да се пин држи високо када се дугме не притисне. Вучни отпор је отприлике овако.
Али наш ПИЦ МЦУ има унутрашњи слаби отпорник који се може активирати софтвером и тако уштедети много муке (када треба повезати више тастера).
Шта је слаб отпорник на извлачење?
Постоје две врсте отпорника на извлачење, један је Слаб на извлачење, а други Јаки на извлачење. Слаби вучни отпорници су велике вредности и на тај начин омогућавају пролаз слабе струје, а јаки повлачни отпорници су мале вредности, што омогућава јаку струју. Сви МЦУ углавном користе слабе отпорнике на извлачење. Да бисмо ово активирали у нашем ПИЦ МЦУ-у, морамо потражити у нашем листу података ОПТИОН_РЕГ (регистар опција) као што је приказано на доњој снимци.
Као што је приказано, бит 7 се бави слабим отпорником на извлачење. Да би се активирао, треба га поставити на нулу. То се ради помоћу ОПТИОН_РЕГ <7> = 0 . Ово се посебно односи на бит 7, остављајући остале битове на њихове подразумеване вредности. Са овим улазимо у нашу вхиле петљу, где проверава да ли је дугме притиснуто помоћу иф (РБ0 == 0). Ако је услов задовољен, позивамо нашу функцију са параметрима 1, 3, 7 и 15.
сблинк (1); // ФУНКЦИОНАЛНИ ПОЗИВ 1 са параметром 1 сблинк (3); // ФУНКЦИЈСКИ ПОЗИВ 3 са параметром 3 сблинк (7); // ФУНКЦИЈСКИ ПОЗИВ 7 са параметром 7 сблинк (15); // ФУНКЦИЈСКИ ПОЗИВ 4 са параметром 15
Зашто користимо функције?
Функције се користе за смањење броја редова у нашем коду. То је оно што би већина нас знала. Али зашто треба да смањимо број линија, посебно када је у питању МЦУ програмирање. Разлог је ограничен простор у нашем сећању програма. Ако не оптимизирамо код правилно, можда ћемо остати без меморије. Ово ће добро доћи када напишемо дуге странице кодова.
Свака функција ће имати дефиницију функције ( сблинк (инт гет) у нашем случају) и функцију Цалл ( сблинк (1) у нашем случају). Није обавезно имати декларацију функције, да бих је избегао, ставио сам дефиницију функције пре него што сам је позвао у главну функцију.
Параметри функције су вредност која ће се пренети из позива функције у дефиницију функције. У нашем случају целобројне вредности (1, 3, 7, 15) су параметри који се преносе из позива функције, а променљива „гет“ добија вредност параметара у дефиницији функције да би их обрадила. Функција може имати више параметара.
Једном када је функција позвана, извршиће се доњи редови у дефиницији функције.
за (инт и = 0; и <= 7 && РБ0 == 0; и ++) {ПОРТД = гет << и; // ЛЕД померање Лева секвенца __делаи_мс (50); } за (инт и = 7; и> = 0 && РБ0 == 0; и--) {ПОРТД = гет << и; // ЛЕД померање Лева секвенца __делаи_мс (50); }
Сада се чини да је ова линија чудна: ПОРТД = гет << и . Објаснићу шта се овде заправо догађа.
„<<“ је оператер померања улево који помера све битове у леви положај. Сада када зовемо функцију сблинк (инт гет) са параметром '1' као сблинк (1), она ће направити вредност 'гет' као 1, што је у бинарном формату 0б00000001. Отуда ће ова линија бити као ПОРТД = 0б00000001 << и .
Вредност "и" ће се разликовати од 0 до 7 пошто смо користили 'фор лооп' за (инт и = 0; и <= 7 && РБ0 == 0; и ++). Вредност 'и' која је од 0 до 7 промениће резултат на следећи начин:
Као што видите, укључили смо једну по једну ЛЕД диоду (с лијева на десно) држећи остатак ИСКЉУЧЕНИМ. Следећа 'фор петља' за (инт и = 7; и> = 0 && РБ0 == 0; и--) , такође ће урадити исто, али овај пут ће се ЛЕД укључити с десна на лево у низу, као што смо започели од 7 и спустили се на 0. Користили смо кашњење од 200мс да бисмо могли да визуализујемо како се ЛЕД укључује и искључује.
Сада када проследимо вредност 3 у функцији сблинк (инт гет) , па ће се извршити функција сблинк (3) што чини вредност 'гет' као 0б00000011, па ће резултат на ПОРТД-у бити:
Дакле, овог пута ће се у сваком тренутку укључити две ЛЕД диоде помоћу сблинк-а (3). Слично сблинк-у (7) и сблинк-у (15), три и четири ЛЕД-а ће бити укључене у низу. Када ово заврши, поставићемо да све ЛЕД диоде буду укључене помоћу линије ПОРТД = 0кФФ . Погледајте видео у наставку за потпуну демонстрацију.
Надам се да сте разумели код и тако научили како да користите функције петље 'фор' и 'вхиле' да бисте добили жељене излазе. Сада се можете подесити око кода да бисте добили другачији редослед ЛЕД-а који трепће. Наставите компајлирати свој код и баците га на свој МЦУ и уживајте у резултатима. Можете да користите одељак за коментаре ако негде запнете. Такође сам овде приложио датотеке за симулацију и програме.
То је за сада у нашем следећем упутству научићемо како да користимо тајмере ПИЦ16Ф877А уместо да користимо функције одлагања. Овде можете прегледати све водиче за ПИЦ микроконтролер.