- Хардуерна настройка и изисквания
- Електрическа схема за LED взаимодействие с Nuvoton N76E003
- Таймерни щифтове на Nuvoton N76E003
- Регистри на таймера в Nuvoton N76E003
- Типове времена в Nuvoton N76E003
- Програмиране на микроконтролер Nuvoton N76E003 за таймери
- Мигащ код и проверка на изхода за функцията на таймера
В предишните ни уроци за микроконтролер Nuvoton използвахме основна LED мигаща програма като ръководство за започване и също така свързахме GPIO като вход за свързване на тактилен превключвател. С този урок ние сме напълно наясно как да конфигурираме проекта Keil и да настроим средата за програмиране на микроконтролера N76E003 Nuvoton. Време е да използвате вътрешна периферия на микроконтролера и да се придвижите малко по-напред, като използвате вградения таймер на N76E003.
В предишния ни урок използвахме само софтуерно забавяне, за да премигнем светодиод, така че в този урок ще научим как да използваме функцията за отлагане на таймера, както и таймера ISR (Interrupt Service Rutine) и ще премигнем два отделни светодиода. Можете също да разгледате урока за Arduino Timer и PIC Timer, за да проверите как да използвате таймери с други микроконтролери. Без да губим много време, нека да преценим какъв вид хардуерна настройка се нуждаем.
Хардуерна настройка и изисквания
Тъй като изискването на този проект е да научите таймера ISR и функцията за забавяне на таймера, ще използваме два светодиода, от които единият ще премигва с помощта на таймер за забавяне в цикъла while, а друг ще мига вътре в функцията ISR.
Тъй като в платката за разработка на N76E003 е наличен светодиод, този проект изисква един допълнителен светодиод и резистор за ограничаване на тока, за да ограничи светодиодния ток. Компонентите, от които се нуждаем -
- Всеки цвят на светодиода
- 100R резистор
Да не говорим, освен горепосочените компоненти, се нуждаем от N76E003 базиран на микроконтролер борд за разработка, както и Nu-Link Programmer. Освен това за свързване на всички компоненти са необходими и макетни плочи и кабели за свързване.
Електрическа схема за LED взаимодействие с Nuvoton N76E003
Както можем да видим в схемата по-долу, тестовият светодиод е наличен вътре в платката за разработка и е свързан на порт 1.4. Допълнителен светодиод е свързан към порт 1.5. Резисторът R3 се използва за ограничаване на светодиодния ток. Най-вляво е показана връзката на интерфейса за програмиране.
Таймерни щифтове на Nuvoton N76E003
В щифт схема на N76E003 може да се види по-долу, пренасящ образ
Както виждаме, всеки щифт има различни спецификации и всеки щифт може да се използва за множество цели. Въпреки това, пин 1.5, който се използва като LED изходен щифт, ще загуби ШИМ и друга функционалност. Но това не е проблем, тъй като за този проект не се изисква друга функционалност.
Причината за избора на пин 1.5 като изход и пин 1.6 като вход е поради най-близката наличност на GND и VDD щифтове за лесно свързване. Въпреки това, в този микроконтролер от 20 пина, 18 пина могат да се използват като GPIO пин и всякакви други GPIO пинове могат да се използват за изход и свързани с входа цели, с изключение на щифт 2.0, който е специално използван за нулиране на входа и не може да се използва изход. Всички GPIO щифтове могат да бъдат конфигурирани в описания по-долу режим.
Според листа с данни, PxM1.n и PxM2.n са два регистъра, които се използват за определяне на контролната операция на I / O порта. Тъй като използваме светодиода и изискваме щифта като общи изходни щифтове, следователно ще използваме квазидвупосочен режим за щифтовете.
Регистри на таймера в Nuvoton N76E003
Таймерът е важно нещо за всеки микроконтролер. Микроконтролерът се предлага с вграден периферен таймер. Nuvoton N76E003 се предлага и с 16-битови периферни устройства с таймер. Въпреки това, всеки таймер се използва за различни цели и преди да използвате какъвто и да е интерфейс на таймера е важно да знаете за таймера.
Типове времена в Nuvoton N76E003
Таймер 0 и 1:
Тези два таймера timer0 и timer1 са идентични с 8051 таймери. Тези два таймера могат да се използват като общ таймер или като броячи. Тези два таймера работят в четири режима. В режим 0 тези таймери ще работят в 13-битов режим Таймер / брояч. В режим 1 битът за разделителна способност на тези два таймера ще бъде 16-битов. В режим 2 таймерите са конфигурирани като режим на автоматично презареждане с 8-битова резолюция. В режим 3 таймерът 1 е спрян и таймерът 0 може да се използва едновременно като брояч и таймер.
От тези четири режима в повечето случаи се използва режим 1. Тези два таймера могат да използват Fsys (системна честота) във фиксиран или предварително зададен режим (Fys / 12). Може да се тактира и от външен източник на часовник.
Таймер 2:
Таймерът 2 също е 16-битов таймер, който се използва главно за улавяне на форма на вълната. Той също така използва системния часовник и може да се използва в различни приложения чрез разделяне на тактовата честота с помощта на 8 различни скали. Може да се използва и в режим на сравнение или за генериране на ШИМ.
Подобно на таймера 0 и таймера 1, таймерът 2 може да се използва в режим на автоматично презареждане.
Таймер 3:
Таймерът 3 също се използва като 16-битов таймер и се използва за източник на часовник на скоростта на предаване за UART. Освен това има функция за автоматично презареждане. Важно е да използвате този таймер само за последователна комуникация (UART), ако приложението изисква UART комуникация. Препоръчително е да не използвате този таймер за други цели в такъв случай поради конфликтния процес в настройката на таймера.
Таймер за пазач:
Watchdog Timer може да се използва като стандартен 6-битов таймер, но не се използва за тази цел. Използването на Watchdog таймер като таймер с общо предназначение е приложимо за приложения с ниска консумация на енергия, където микроконтролерът остава предимно в режим на празен ход.
Watchdog Timer, както подсказва името, винаги проверява дали микроконтролерът работи правилно или не. В случай на обесен или спрян микроконтролер, WDT (Watchdog Timer) рестартира микроконтролера автоматично, което гарантира, че микроконтролерът работи в непрекъснат код, без да се забива, обесва или спира.
Таймер за самосъбуждане:
Това е друга периферия на таймера, която обслужва специален процес за синхронизиране, същият като таймера за пазач. Този таймер събужда системата периодично, когато микроконтролерът работи в режим на ниска мощност.
Този периферен таймер може да се използва вътрешно или с помощта на външни периферни устройства за събуждане на микроконтролера от режим на заспиване. За този проект ще използваме Таймер 1 и Таймер 2.
Програмиране на микроконтролер Nuvoton N76E003 за таймери
Задаване на щифтове като изход:
Нека първо започнем с изходния раздел. Използваме два светодиода, единият е вграденият светодиод, наречен Test и свързан с порта P1.4 и външен светодиод, свързан с щифта P1.5.
Следователно тези два щифта са конфигурирани като изходен щифт за свързване на тези два светодиода чрез използване на кодовите фрагменти по-долу.
#define Test_LED P14 #define LED1 P15
Тези два щифта са зададени като квази-двупосочен щифт във функцията за настройка.
настройка на невалидни (void) {P14_Quasi_Mode; P15_Quasi_Mode; }
Настройка на функцията на таймера:
Във функцията за настройка е необходим таймер 2, който да бъде конфигуриран, за да получи желания изход. За това ще настроим регистъра T2MOD с фактор на деление на часовника 1/128 и ще го използваме в режим на забавяне с автоматично презареждане. Ето прегледа на регистъра на T2MOD -
4,5 и 6-битовият регистър T2MOD задават делител на часовника 2 на таймера, а 7-битовият настройва режима на автоматично презареждане. Това се прави с помощта на долния ред -
TIMER2_DIV_128; TIMER2_Auto_Reload_Delay_Mode;
Тези два реда са дефинирани във файла Function_define.h като
#define TIMER2_DIV_128 T2MOD- = 0x50; T2MOD & = 0xDF #define TIMER2_Auto_Reload_Delay_Mode T2CON & = ~ SET_BIT0; T2MOD- = SET_BIT7; T2MOD- = SET_BIT3
Сега тези редове задават времевата стойност, необходима за таймера 2 ISR.
RCMP2L = TIMER_DIV128_VALUE_100ms; RCMP2H = TIMER_DIV128_VALUE_100ms >> 8;
Което е допълнително дефинирано във файла Function_define.h като-
TIMER_DIV128_VALUE_100ms 65536-12500 // 12500 * 128/16000000 = 100 ms
И така, 16000000 е кристалната честота от 16 Mhz, която настройва закъснението от 100 ms.
Под два реда ще се изпразни байта на таймера 2 с нисък и висок байт.
TL2 = 0; TH2 = 0;
Накрая кодът по-долу ще позволи прекъсването на таймера 2 и ще стартира таймера 2.
set_ET2; // Активиране на прекъсване на Timer2 set_EA; set_TR2; // Таймер2 стартиране
Цялостната функция за настройка може да се види в кодовете по-долу -
настройка на невалидни (void) { P14_Quasi_Mode; P15_Quasi_Mode; TIMER2_DIV_128; TIMER2_Auto_Reload_Delay_Mode; RCMP2L = TIMER_DIV128_VALUE_100ms; RCMP2H = TIMER_DIV128_VALUE_100ms >> 8; TL2 = 0; TH2 = 0; set_ET2; // Активиране на прекъсване на Timer2 set_EA; set_TR2; // Таймер2 стартиране }
Функция ISR на таймера 2:
Функцията Timer 2 ISR може да се види в кода по-долу.
void Timer2_ISR (void) прекъсване 5 { clr_TF2; // Изчистване на таймера2 Флаг за прекъсване LED1 = ~ LED1; // LED1 превключвател, свързан в P1.5; }
Мигащ код и проверка на изхода за функцията на таймера
Кодът (даден по-долу), когато се компилира, върна 0 предупреждение и 0 грешки и го мигна, използвайки метода по мигане по подразбиране в Keil. След мигането светодиодите мигаха в определено забавяне на таймера, както е програмирано.
Вижте видеото, дадено по-долу, за пълна демонстрация на това как работи платката за този код. Надявам се, че ви е харесал урокът и сте научили нещо полезно, ако имате някакви въпроси, оставете ги в раздела за коментари по-долу. Можете също да използвате нашите форуми, за да публикувате други технически въпроси.