- Konfiguracja sprzętu i wymagania
- Schemat obwodu dla połączenia LED z Nuvoton N76E003
- Piny timera w Nuvoton N76E003
- Timer rejestruje się w Nuvoton N76E003
- Rodzaje czasów w Nuvoton N76E003
- Programowanie mikrokontrolera Nuvoton N76E003 dla timerów
- Migający kod i weryfikacja wyjścia dla funkcji timera
W naszych poprzednich samouczkach dotyczących mikrokontrolerów Nuvoton użyliśmy podstawowego programu do migania diod LED jako przewodnika dla początkujących, a także połączyliśmy GPIO jako wejście do podłączenia przełącznika dotykowego. Dzięki temu samouczkowi jesteśmy w pełni świadomi, jak skonfigurować projekt Keil i ustawić środowisko do programowania mikrokontrolera N76E003 Nuvoton. Nadszedł czas, aby użyć wewnętrznego urządzenia peryferyjnego jednostki mikrokontrolera i posunąć się nieco dalej, używając wbudowanego timera N76E003.
W naszym poprzednim samouczku używaliśmy tylko opóźnienia programowego do mrugania diody LED, więc w tym samouczku nauczymy się, jak korzystać z funkcji opóźnienia timera, a także z ISR timera (procedura obsługi przerwania) i migać dwiema pojedynczymi diodami LED. Możesz również zapoznać się z samouczkiem Arduino Timer i samouczkiem PIC Timer, aby sprawdzić, jak używać timerów z innymi mikrokontrolerami. Nie tracąc wiele czasu, oceńmy, jakiego rodzaju sprzętu potrzebujemy.
Konfiguracja sprzętu i wymagania
Ponieważ wymaganiem tego projektu jest poznanie Timera ISR i funkcji opóźnienia timera, użyjemy dwóch diod LED, z których jedna będzie migać z wykorzystaniem opóźnienia timera w pętli while, a druga będzie migać wewnątrz funkcji ISR.
Ponieważ dioda LED jest dostępna na płycie rozwojowej N76E003, ten projekt wymaga jednej dodatkowej diody LED i rezystora ograniczającego prąd w celu ograniczenia prądu diody LED. Wymagane przez nas komponenty -
- Dowolny kolor diody LED
- Rezystor 100R
Nie wspominając, że oprócz powyższych komponentów potrzebujemy płytki rozwojowej opartej na mikrokontrolerze N76E003, a także programatorze Nu-Link. Dodatkowo do podłączenia wszystkich komponentów wymagane są również przewody do styków prototypowych i przyłącza.
Schemat obwodu dla połączenia LED z Nuvoton N76E003
Jak widać na poniższym schemacie, testowa dioda LED jest dostępna wewnątrz płytki rozwojowej i jest podłączona do portu 1.4. Dodatkowa dioda LED jest podłączona do portu 1.5. Rezystor R3 służy do ograniczenia prądu diody LED. Po lewej stronie pokazane jest połączenie interfejsu programowania.
Piny timera w Nuvoton N76E003
Schemat sworzeń N76E003 widać poniżej image-
Jak widać, każdy pin ma inne specyfikacje, a każdy pin może być używany do wielu celów. Jednak pin 1.5, który jest używany jako pin wyjściowy LED, utraci PWM i inne funkcje. Nie stanowi to jednak problemu, ponieważ w tym projekcie nie jest wymagana inna funkcjonalność.
Powodem wyboru pinu 1.5 jako wyjścia i pinu 1.6 jako wejścia jest najbliższa dostępność pinów GND i VDD dla łatwego podłączenia. Jednak w tym mikrokontrolerze z 20 pinów, 18 pinów może być używanych jako pin GPIO, a wszelkie inne piny GPIO mogą być używane do celów wyjściowych i wejściowych, z wyjątkiem pin 2.0, który jest dedykowany do wejścia Reset i nie może być używany jako wynik. Wszystkie piny GPIO można skonfigurować w niżej opisanym trybie.
Zgodnie z arkuszem danych, PxM1.n i PxM2.n to dwa rejestry, które są używane do określenia operacji sterowania portem I / O. Ponieważ używamy diody LED i wymagamy pinów jako ogólnych pinów wyjściowych, dlatego użyjemy trybu quasi-dwukierunkowego dla pinów.
Timer rejestruje się w Nuvoton N76E003
Timer jest ważną rzeczą dla każdego mikrokontrolera. Mikrokontroler jest wyposażony we wbudowane urządzenie peryferyjne z timerem. Nuvoton N76E003 jest również wyposażony w 16-bitowe urządzenia peryferyjne z timerem. Jednak każdy zegar jest używany do innych celów, a przed użyciem jakiegokolwiek interfejsu timera ważne jest, aby wiedzieć o zegarze.
Rodzaje czasów w Nuvoton N76E003
Timer 0 i 1:
Te dwa timery timer0 i timer1 są identyczne z timerami 8051. Te dwa timery mogą być używane jako ogólny zegar lub jako liczniki. Te dwa timery działają w czterech trybach. W Trybie 0 te timery będą działać w 13-bitowym trybie timera / licznika. W Trybie 1 bit rozdzielczości tych dwóch timerów będzie 16-bitowy. W Trybie 2 zegary są skonfigurowane jako tryb automatycznego przeładowania z rozdzielczością 8-bitową. W trybie 3 zegar 1 jest zatrzymany, a zegar 0 może być używany jednocześnie jako licznik i zegar.
Spośród tych czterech trybów w większości przypadków używany jest Tryb 1. Te dwa timery mogą używać Fsys (częstotliwości systemowej) w trybie stałym lub z preskalacją (Fys / 12). Może być również taktowany z zewnętrznego źródła zegara.
Zegar 2:
Timer 2 jest również 16-bitowym zegarem używanym głównie do przechwytywania przebiegów. Wykorzystuje również zegar systemowy i może być używany w różnych aplikacjach poprzez podzielenie częstotliwości zegara za pomocą 8 różnych skal. Może być również używany w trybie porównywania lub do generowania PWM.
Podobnie jak Timer 0 i Timer 1, Timer 2 może być używany w trybie automatycznego przeładowania.
Zegar 3:
Timer 3 jest również używany jako 16-bitowy zegar i jest używany jako źródło zegara szybkości transmisji dla UART. Posiada również funkcję automatycznego przeładowania. Ważne jest, aby używać tego timera tylko do komunikacji szeregowej (UART), jeśli aplikacja wymaga komunikacji UART. Zaleca się, aby w takim przypadku nie używać tego timera do innych celów ze względu na sprzeczny proces w konfiguracji timera.
Watchdog Timer:
Watchdog Timer może być używany jako standardowy 6-bitowy timer, ale nie jest używany do tego celu. Zastosowanie timera Watchdog jako timera ogólnego przeznaczenia ma zastosowanie w zastosowaniach o niskim zużyciu energii, w których mikrokontroler pozostaje głównie w trybie bezczynności.
Watchdog Timer, jak sama nazwa wskazuje, zawsze sprawdza, czy mikrokontroler działa poprawnie, czy nie. W przypadku zawieszonego lub zatrzymanego mikrokontrolera WDT (Watchdog Timer) automatycznie resetuje mikrokontroler, co zapewnia, że mikrokontroler działa w ciągłym przepływie kodu bez utknięcia, zawieszenia lub zatrzymania w sytuacjach.
Timer automatycznego wybudzania:
Jest to kolejne urządzenie peryferyjne z zegarem, które obsługuje dedykowany proces synchronizacji, tak samo jak zegar nadzorujący. Ten zegar wybudza system okresowo, gdy mikrokontroler pracuje w trybie niskiego poboru mocy.
To urządzenie peryferyjne z timerem może być używane wewnętrznie lub za pomocą zewnętrznych urządzeń peryferyjnych w celu wybudzenia mikrokontrolera z trybu uśpienia. W tym projekcie użyjemy timera 1 i timera 2.
Programowanie mikrokontrolera Nuvoton N76E003 dla timerów
Ustawianie pinów jako wyjścia:
Zacznijmy najpierw od sekcji wyjściowej. Używamy dwóch diod LED, jedna to wbudowana dioda LED, nazwana Test i połączona z portem P1.4 oraz zewnętrzna dioda LED połączona z pinem P1.5.
Dlatego te dwa piny są skonfigurowane jako styk wyjściowy do połączenia tych dwóch diod LED za pomocą poniższych fragmentów kodu.
# zdefiniować Test_LED P14 # zdefiniować LED1 P15
Te dwa piny są ustawione jako quasi-dwukierunkowe w funkcji konfiguracji.
void setup (void) {P14_Quasi_Mode; P15_Quasi_Mode; }
Ustawianie funkcji timera:
W funkcji ustawień należy skonfigurować Timer 2, aby uzyskać żądane wyjście. W tym celu ustawimy rejestr T2MOD ze współczynnikiem podziału zegara 1/128 i użyjemy go w trybie opóźnienia automatycznego przeładowania. Oto przegląd rejestru T2MOD-
4,5 i 6-ty bit rejestru T2MOD ustawia dzielnik zegara 2 zegara, a siódmy bit ustawia tryb automatycznego przeładowania. Odbywa się to za pomocą poniższej linii -
TIMER2_DIV_128; TIMER2_Auto_Reload_Delay_Mode;
Te dwie linie są zdefiniowane w pliku Function_define.h jako
# zdefiniować TIMER2_DIV_128 T2MOD- = 0x50; T2MOD & = 0xDF #define TIMER2_Auto_Reload_Delay_Mode T2CON & = ~ SET_BIT0; T2MOD- = SET_BIT7; T2MOD- = SET_BIT3
Teraz te wiersze ustawiają wartość taktowania wymaganą dla przekaźnika ISR Timera 2.
RCMP2L = TIMER_DIV128_VALUE_100ms; RCMP2H = TIMER_DIV128_VALUE_100ms >> 8;
Co jest dalej zdefiniowane w pliku Function_define.h jako
TIMER_DIV128_VALUE_100ms 65536-12500 // 12500 * 128/16000000 = 100 ms
Tak więc 16000000 to częstotliwość kryształu 16 MHz, która ustawia opóźnienie czasowe 100 ms.
Poniższe dwie linie opróżnią bajty zegara 2 - niski i wysoki.
TL2 = 0; TH2 = 0;
Na koniec poniższy kod włączy przerwanie timera 2 i uruchomi timer 2.
set_ET2; // Włącz przerwanie Timer2 set_EA; set_TR2; // Uruchom Timer2
Pełną funkcję konfiguracji można zobaczyć w poniższych kodach-
void setup (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; // Włącz przerwanie Timer2 set_EA; set_TR2; // Uruchom Timer2 }
Funkcja ISR timera 2:
Funkcję ISR timera 2 można zobaczyć w poniższym kodzie.
void Timer2_ISR (void) przerwać 5 { clr_TF2; // Wyczyść flagę przerwania Timer2 LED1 = ~ LED1; // Przełącznik LED1, podłączony w P1.5; }
Migający kod i weryfikacja wyjścia dla funkcji timera
Kod (podany poniżej) po skompilowaniu zwrócił 0 ostrzeżeń i 0 błędów i sflashowałem go przy użyciu domyślnej metody flashowania w Keil. Po miganiu diody migały z zaprogramowanym opóźnieniem timera.
Obejrzyj poniższy film, aby uzyskać pełną demonstrację działania płyty dla tego kodu. Mam nadzieję, że spodobał Ci się samouczek i nauczyłeś się czegoś przydatnego, jeśli masz jakieś pytania, zostaw je w sekcji komentarzy poniżej. Możesz również skorzystać z naszych forów, aby zadać inne pytania techniczne.