- Зашто тајмер када имамо Делаи ()?
- Тајмери ПИЦ микроконтролера:
- Програмирање и објашњење рада:
- Кружни дијаграм и симулација протеја:
Ово ће бити пети водич у нашој ПИЦ туториал серији, који ће вам помоћи да научите и користите тајмере у ПИЦ16Ф877А. У нашим претходним водичима започели смо са Уводом у ПИЦ и МПЛАБКС ИДЕ, затим смо написали свој први ПИЦ програм за трептање ЛЕД-а помоћу ПИЦ-а, а затим направили ЛЕД трептајућу секвенцу користећи функцију одлагања у ПИЦ микроконтролеру. Сада ћемо користити исту серију ЛЕД-а која трепће коју смо користили у претходном хардверу туторијала и са овим ћемо научити како се користе тајмери у нашем ПИЦ МЦУ-у. Управо смо додали још једно дугме на ЛЕД плочу за овај водич. Прођите кроз водич да бисте сазнали више.
Тајмери су један од важних коња за уграђени програмер. Свака апликација коју дизајнирамо некако ће укључити временску апликацију, попут укључивања или искључивања нечега након одређеног временског интервала. Добро, али зашто су нам потребни тајмери кад већ имамо макронаредбе за одлагање (__делаи_мс ()) које раде исту ствар !!
Зашто тајмер када имамо Делаи ()?
Макро за кашњење назива се кашњењем „думп“. Јер током извршавања функције одлагања МЦУ седи на депонији тако што само ствара кашњење. Током овог процеса МЦУ не може да слуша своје вредности АДЦ или да чита било шта из својих регистара. Због тога није препоручљиво користити функције одлагања, осим за апликације попут трептања ЛЕД-а где временско кашњење не мора бити тачно или дуго.
Макрои кашњења такође имају следеће кратке приступе,
- Вредност кашњења мора бити константа за макрое кашњења; не може се променити током извршавања програма. Стога остаје дефинисано програмером.
- Кашњење неће бити тачно у поређењу са коришћењем тајмера.
- Веће вредности кашњења не могу се створити помоћу макронаредби, на пример кашњење од пола сата не може се створити макроима одлагања. Максимално кашњење које се може користити заснива се на коришћеном кристалном осцилатору.
Тајмери ПИЦ микроконтролера:
Физички, тајмер је регистар чија се вредност непрестано повећава на 255, а затим почиње испочетка: 0, 1, 2, 3, 4… 255…. 0, 1, 2, 3…… итд.
ПИЦ16Ф877А ПИЦ микроконтролер има три Тимер модули. То су имена као Тимер0, Тимер1 и Тимер2. Тајмер 0 и Тајмер 2 су 8-битни тајмери, а Тајмер 1 је 16-битни тајмер. У овом упутству користићемо тајмер 0 за нашу апликацију. Једном када схватимо тајмер 0, биће лако радити и на тајмеру 1 и тајмеру 2.
Тајмер / бројач модула Тимер0 има следеће карактеристике:
- 8-битни тајмер / бројач
- Читљиво и записљиво
- 8-битни софтверски програмибилни предкалер
- Изаберите интерни или екстерни сат
- Прекид при преливању са ФФх на 00х
- Избор ивице за спољни сат
Да бисмо почели да користимо тајмер, требали бисмо разумети неке отмене термине као што су 8-битни / 16-битни тајмер, Пресцалер, Тимер интерруптс и Фоцс. Сада, да видимо шта свако од њих заиста значи. Као што је раније речено, у нашем ПИЦ МЦУ-у постоје и 8-битни и 16-битни тајмери, главна разлика између њих је та што 16-битни тајмер има много бољу резолуцију од 8-битног тајмера.
Пресцалер је назив за део микроконтролера који дели осцилатор сат пре него што достигне логику која повећава статус тајмера. Опсег ИД-а за предкалирање је од 1 до 256, а вредност уређаја за предскалирање може се подесити помоћу регистра ОПТИОН (Истог оног који смо користили за натезне отпорнике). На пример, ако је вредност пресцалер је 64, онда за сваки 64 тх пулс тајмер ће се повећати за 1.
Како се тајмер увећава и када достигне максималну вредност од 255, покренуће прекид и поново се иницијализовати на 0. Овај прекид се назива Тимер Интеррупт. Овај прекид обавештава МЦУ да је ово одређено време истекло.
Фосц означава учесталост осцилатор, то је фреквенција кристала који се користи. Време потребно за тајмерски регистар зависи од вредности Пресцалера и вредности Фосц-а.
Програмирање и објашњење рада:
У овом упутству поставићемо два тастера као два улаза и 8 ЛЕД као 8 излаза. Прво дугме користиће се за подешавање временског кашњења (500 мс за сваки притисак), а друго дугме за покретање треперења секвенце тајмера. На пример, ако се прво дугме притисне три пута (500 * 3 = 1500мс), кашњење ће бити постављено на 1,5 сек, а када се притисне дугме два, свака ЛЕД лампица ће се УКЉУЧИТИ и ИСКЉУЧИТИ са унапред дефинисаним временским кашњењем. Погледајте демонстрацијски видео на крају овог водича.
Сада, имајући на уму ове основе, погледајмо наш програм дат на крају у одељку Цоде.
У реду је ако нисте добили програм, али ако јесте !! Дајте себи колачић и баците програм да бисте уживали у својим резултатима. За друге ћу разбити програм на значајне делове и објаснити вам шта се дешава у сваком блоку.
Као и увек првих неколико редова кода су поставке конфигурације и датотеке заглавља, нећу то објашњавати, јер сам то већ радио у својим претходним водичима.
Даље, прескочимо све линије и скокнимо равно у главну функцију воид, унутар које имамо ПОРТ конфигурацију за Тимер0.
воид маин () {/ ***** Конфигурација порта за тајмер ****** / ОПТИОН_РЕГ = 0б00000101; // Тимер0 са спољном фреквенцијом и 64 као преткалар // Такође омогућава ПУЛЛ УПс ТМР0 = 100; // Учитавање временске вредности за 0,0019968с; делаиВалуе може бити између 0-256 само ТМР0ИЕ = 1; // Омогући бит прекида тајмера у регистру ПИЕ1 ГИЕ = 1; // Омогући глобални прекид ПЕИЕ = 1; // Омогући периферни прекид / *********** ______ *********** /
Да бисмо то разумели, морамо погледати ОПТИОН регистар у нашем листу података ПИЦ-а.
Као што је објашњено у претходном водичу, бит 7 се користи за омогућавање слабог отпора за ПОРТБ. Погледајте горњу слику, бит 3 је направљен 0 да нареди МЦУ-у да се следећи пресцалер који се подешава користи за тајмер, а не за ВатцхДогТимер (ВДТ). Режим тајмера се бира брисањем бита 5 Т0ЦС
(ОПТИОН_РЕГ <5>)
Сада се битс2-0 користи за подешавање вредности предкалирања за тајмер. Као што је приказано у горњој табели да би се поставила вредност предскалера од 64, битови морају бити постављени као 101.
Даље, погледајмо регистре повезане са Тимер0
Тајмер ће почети да се повећава када се постави и прелије након достизања вриједности 256, како би се омогућио прекид тајмера током ове тачке, регистар ТМР0ИЕ мора бити постављен високо. Будући да је тајмер 0 сам по себи периферни уређај, морамо омогућити периферни прекид тако што ћемо направити ПЕИЕ = 1. Коначно, морамо омогућити глобални прекид тако да МЦУ буде обавештен о прекиду током било које операције, то се постиже тако што се направи ГИЕ = 1.
Кашњење = ((256-РЕГ_вал) * (Пресцал * 4)) / Фосц
Горња формула се користи за израчунавање вредности одлагања.
Где
РЕГ_вал = 100;
Прескал = 64
Фосц = 20000000
Ово на прорачуну даје, Кашњење = 0,0019968с
Следећи скуп линија је постављање И / О портова.
/ ***** Конфигурација порта за И / О ****** / ТРИСБ0 = 1; // упутите МЦУ да се ПОРТБ пин 0 користи као улаз за дугме 1. ТРИСБ1 = 1; // упутите МЦУ да се ПОРТБ пин 1 користи као улаз за дугме 1. ТРИСД = 0к00; // упутите МЦУ да сви пинови на ПОРТ Д имају излаз ПОРТД = 0к00; // Иницијализујте све пинове на 0 / *********** ______ *********** /
Ово је исто као и у претходном водичу, јер користимо исти хардвер. Осим што смо додали још једно дугме као улаз. То се ради линијом ТРИСБ1 = 1.
Даље, бесконачна вхиле петља изнутра има два блока кода. Један се користи за добивање тајмера од корисника, а други за извршавање секвенце кашњења преко ЛЕД диода. Објаснио сам их користећи коментаре уз сваки ред.
вхиле (1) {цоунт = 0; // Немојте покретати тајмер док сте у главној петљи // ******* Добијте одлагање броја од корисника **** ////// иф (РБ0 == 0 && флаг == 0) // Када улаз је дат {гет_сцндс + = 1; // гет_сцндс = гет_сцндс + хттп: // Повећај променљиву флаг = 1; } иф (РБ0 == 1) // За спречавање непрекидног повећавања заставица = 0; / *********** ______ *********** /
Променљива под називом гет_сцндс повећава се сваки пут када корисник притисне дугме 1. Променљива заставица (софтверски дефинисана) користи се за задржавање процеса увећавања све док корисник не уклони прст са дугмета.
// ******* Извршити секвенцу са закашњењем **** ////// вхиле (РБ1 == 0) {ПОРТД = 0б00000001 <
Следећи блок започиње акцијом ако се притисне дугме два. Будући да је корисник већ дефинисао потребно временско кашњење помоћу дугмета један и оно је сачувано у променљивој гет_сцндс. Користимо променљиву која се назива хсцнд, а ову променљиву контролише ИСР (Интеррупт сервице рутина).
Прекида услуга рутина је прекид који ће се звати сваки пут када Тимер0 је прелива. Погледајмо како се њиме контролише ИСР у следећем блоку, као да желимо да повећамо временско кашњење за пола секунде (0,5 с) при сваком притиску тастера, а затим треба да повећавамо променљиву хсцнд за сваке пола секунде. Као што смо програмирани нашу тајмер да преко протока за сваки 0.0019968с (~ 2мс), тако да рачунају пола друга датотека променљива би требало да буде 250 јер 250 * 2мс = 0.5 секунди. Дакле, када бројање добије 250 (250 * 2мс = 0,5 секунде), значи да је прошло пола секунде, па хсцнд увећавамо за 1 и иницијализујемо бројање на нулу.
воид интеррупт тимер_иср () {иф (ТМР0ИФ == 1) // Ознака тајмера је покренута због преливања тајмера {ТМР0 = 100; // Учитавање тајмера Вредност ТМР0ИФ = 0; // Обриши број заставица прекида тајмера ++; } иф (цоунт == 250) {хсцнд + = 1; // хсцнд ће се повећавати за сваких пола секунде цоунт = 0; }}
Дакле, користимо ову вредност и упоређујемо је са нашим хсцнд-ом и померамо своју ЛЕД диоду на основу корисничког времена. Такође је врло сличан прошлом упутству.
То је то што наш програм разумемо и радимо.
Кружни дијаграм и симулација протеја:
Као и обично, дозвољавамо да прво проверимо излаз користећи Протеус, овде сам повезао шематске датотеке Протеуса.
Додајте дугме на нашу претходну ЛЕД плочу и наш хардвер је спреман за рад. То би требало изгледати отприлике овако:
Након завршетка везе, отпремите код и потврдите излаз. Ако имате било каквих проблема, користите одељак за коментаре. Такође погледајте видео у наставку да бисте разумели цео процес.