13
Akademia Górniczo – Hutnicza im. Stanisława Staszica w Krakowie Wydział IEiT Katedra Elektroniki TECHNIKA MIKROPROCESOROWA II LAB 4 Timery © Michał Karwatowski http://www.fpga.agh.edu.pl/upt2 05.11.2014

TECHNIKA MIKROPROCESOROWA II - fpga.agh.edu.pl LAB4.pdf · środowisko Keil / uVision 5 ... inkrementował licznik wyświetlany na LCD dla drugiego. 1.22. Załaduj program i zweryfikuj

Embed Size (px)

Citation preview

Akademia Górniczo – Hutnicza

im. Stanisława Staszica w Krakowie

Wydział IEiT

Katedra Elektroniki

TECHNIKA MIKROPROCESOROWA II

LAB 4

Timery

© Michał Karwatowski

http://www.fpga.agh.edu.pl/upt2

05.11.2014

WSTĘP

CEL

Celem tego ćwiczenia, jest zaznajomienie uczestników z timerami dostępnymi w

mikrokontrolerze Kinetis L 46Z. Dla przykładu pokazane zostaną niektóre możliwości modułów

Periodic Interrupt Timer (PIT) i Timer/PWM (TPM). Zdobyta wiedza zostanie użyta do napisania

sterownika sonaru.

WYMAGANIA WSTĘPNE

Sprzętowe:

komputer klasy PC spełniający wymagania sprzętowe aplikacji KEIL v5,

zestaw FRDM-KL46Z

moduł sonaru HC-SR04

Programowe:

system operacyjny Windows XP lub wyższy,

środowisko Keil / uVision 5

Doświadczenie:

podstawowa umiejętność obsługi komputera klasy PC,

podstawowa znajomość systemów operacyjnych rodziny Windows,

podstawowa znajomość zagadnień z Techniki Mikroprocesorowej 1,

podstawowa znajomość zagadnień z Techniki Cyfrowej,

wykonane ćwiczenie LAB 1-3

Literatura:

KL46 Sub-Family Reference Manual, Freescale Semiconductor

Kinetis L Peripheral Module Quick Reference, Freescale Semiconductor

HC-SR04 datasheet

KL46Z TIMERY I ZASOBY ZEGAROWE

PERIODIC INTERRUPT TIMER (PIT) Diagram blokowy periodycznego timera przerwań znajduje się na rysunku nr 1.

Rysunek 1.

Periodyczny timer przerwań zawiera zestaw timerów, każdy z nich może niezależnie być

źródłem przerwania lub wyzwalaczem kanału DMA.

Główne właściwości modułu:

Generowanie impulsów wyzwalających DMA

Generowanie przerwań

Maskowalne przerwania

Niezależne okresy dla każdego timera.

TIMER/PWM MODULE (TPM) Podstawowa struktura modułu TPM przedstawiona jest na rysunku 2.

Rysunek 2.

Moduł TPM pochodzi od dobrze znanego modułu TIM z rodziny HC08. Jego główne cechy to:

Do 6 kanałów na moduł

o Każdy kanał może działać, jako zatrzaśnięcie wejścia, porównanie wyjścia oraz

PWM

o Wyzwalanie zatrzaśnięcia wejścia ze zbocza opadającego, narastającego albo

obydwu zboczy

o Ustawienie, wyczyszczenie, zmiana, lub impuls w trybie porównania wyjścia

o PWM o zmiennej polaryzacji

Każdy TPM może być skonfigurowany, jako buforowany, wyrównany do środka

modulator szerokości impulsu na każdym kanale

Źródło zegarowe dla preskalera jest niezależnie wybierane pomiędzy zegarem

magistrali, zegarem systemowym albo zewnętrznym

o Preskaler może dzielić sygnał zegarowy przez 1, 2, 4, 8, 16, 32, 64, lub 128

o Zewnętrze wejście zegarowe

16-bit’owy licznik, zliczający w górę lub w dół (CPWM)

16-bit’owy rejestr modulo do ustalania okresu

Każdy kanał TPM może generować przerwanie

Multipurpose Clock Generator (MCG)

Rysunek 3.

Zegary systemowe są dostarczane przez wielozadaniowy generator zegara.

MCG składa się z:

Dwóch niezależnych wewnętrznych zegarów referencyjnych (IRC), wolny zegar o

częstotliwości około 32 kHz i szybki o częstotliwości około 4 MHz, każdy z nich może

zostać podzielony przez moduł FCRDIV

Pętla FLL, używająca zegara IRC albo zewnętrznego źródła

Pętla PLL używająca zewnętrznego źródła, jako zegara referencyjnego

Auto trim machine (ATM) pozwalająca dostosować oba zegary RC do zadanej

częstotliwości używając zewnętrznego źródła zegara referencyjnego

Podsumowanie zegarów udostępnianych przez MCG:

MCGOUTCLK – główny zegar systemowy, używany do generacji zegara rdzenia, magistrali i

pamięci. Może zostać wygenerowany z jednego z wewnętrznych oscylatorów, zewnętrznego

kwarcu, zewnętrznej fali prostokątnej, FLL lub PLL.

MCGFLLCLK – wyjście pętli FLL, dostępne zawsze gdy pętla jest aktywna.

MCGPLLCLK – wyjście pętli PLL, dostępne zawsze gdy pętla jest aktywna.

MCGIRCLK – wyjście wybranego oscylatora wewnętrznego.

Dodatkowo dostępne są następujące źródła sygnału zegarowego, dostępne dla różnych

modułów peryferyjnych:

OSCERCLK – zegara zewnętrznego kwarcu

ERCLK32K – wyjście tego zegara może zostać skonfigurowane, jako 32kHz, zewnętrzy sygnał

RTC_CLKIN, albo oscylator niskomocowy LPO.

LPO – wyjście niskomocowego oscylatora. Jest to wewnętrzny bardzo nisko mocowy oscylator

o częstotliwości około 1 kHz, może on pracować we wszystkich trybach uśpienia oprócz VLLS0.

1. PERIODIC INTERRUPT TIMER

Wykonaj poniższe kroki, aby napisać aplikację opartą na module PIT.

W razie potrzeby poszukaj odpowiedzi w reference manualu luba zapytaj

prowadzącego.

Nie zapomnij napisać komentarza przy każdej istotnej linijce kodu!

1.1. Stwórz nowy projekt w swoim folderze roboczym. Przygotuj go do pracy z

płytką FRDM-KL46Z tak samo jak w poprzednich instrukcjach. Stwórz plik

źródłowy main.c w folderze ‘src’.

1.2. Skopiuj pliki *.c i *.h bibliotek LED i sLCD stworzonych na wcześniejszych

zajęciach do folderu projektu. W środowisku Keil uVision naciśnij prawym

przyciskiem myszy na ‘src’ i wybierz opcję 'Add existing files to Group ‘src’.

1.3. Stwórz pliki pit.h i pit.c w folderze ‘src’.

1.4. W pliku pit.h załącz plik nagłówkowy 'MKL46Z4.h' i deklarację funkcji

inicjalizującej.

1.5. Napisz kod funkcji inicjalizującej w pliku pit.c, powinna ona zawierać

następujące kroki:

Inicjalizacja LED.

Podłączenie zegara do modułu PIT, w taki sam sposób jak we

wcześniejszych instrukcjach.

1.6. Zmień ustawienia zegara taka by zegarem referencyjnym dla modułu MCG

był zewnętrzny kwarc 8MHz. Można to zrobić w pliku ‘System_MKL46Z4.c’

używając definicji CLOCK_SETUP.

Zauważ, że źródłem zegara dla modułu PIT jest zegar magistrali, ma on

częstotliwość 24MHz gdy używamy zewnętrznego kwarcu jako odniesienia.

1.7. Ustaw okres dla jednego kanału PIT w funkcji inicjalizującej, np.:

PIT->CHANNEL[X].LDVAL = 0x123456;

1.8. Znajdź numer przerwania od modułu PIT w podobny sposób jak na

poprzednich laboratoriach.

1.9. Zainicjalizuj przerwania NVIC dla modułu PIT: wyczyść czekające przerwanie

i uruchom przerwanie o odpowiednim numerze.

1.10. Włącz przerwanie modułu PIT dla wybranego kanału.

1.11. Uruchom timer dla wybranego kanału.

1.12. Uruchom moduł PIT:

PIT->MCR = 0x00;

1.13. Znajdź nazwę ISR modułu PIT, w taki sam sposób jak w poprzedniej instrukcji

i zdefiniuj funkcję przerwania w pliku pit.c.

1.14. Napisz kod przerwania:

Zaimplementuj zmianę stanu diody LED.

Nie zapomnij wyczyścić flagi przerwania.

1.15. Dodaj funkcję inicjalizującą PIT do funkcji main().

1.16. Dodaj pętlę nieskończoną do funkcji main().

1.17. Skompiluj kod, wyeliminuj wszystkie błędy i ostrzeżenia, a następnie załaduj

do mikrokontrolera I zweryfikuj poprawność działania.

1.18. Następnie w funkcji inicjalizującej PIT wywołaj funkcję inicjalizującą LCD.

1.19. Skonfiguruj kolejny kanał timera PIT tak samo jak w przypadku poprzedniego

i ustaw go na inną częstotliwość.

1.20. W funkcji obsługi przerwania sprawdź który kanał je wywołał.

1.21. Zmodyfikuj kod tak, aby zmieniał stan diody LED dla jednego przerwania i

inkrementował licznik wyświetlany na LCD dla drugiego.

1.22. Załaduj program i zweryfikuj poprawność działania.

1.23. Zmień okres timera PIT tak, aby przerwanie wywoływane było co 100ms I

dodaj kropkę na wyświetlaczu tak, aby otrzymać wartość w sekundach.

1.24. Załaduj program i zweryfikuj poprawność działania.

2. MODUŁ TIMER/PWM

2.1. Stwórz pliki *.c i *.h dla biblioteki TPM.

2.2. W pliku tpm.h załącz bibliotekę MKL46Z4.h i zadeklaruj funkcję inicjalizującą

TPM.

2.3. Zdefiniuj funkcję inicjalizującą TPM w pliku tpm.c:

Wywołaj funkcję inicjalizującą diody LED,

Podłącz zegar do modułu TPM w taki sam sposób jak w przypadku

modułu PIT.

2.4. Znajdź rejestr zawierający ustawienia źródła zegara dla modułu TPM. Jest to

część modułu SIM (System Integration Module). Ustaw je na 'Multipurpose

Clock Generator Internal Reference Clock'.

2.5. Skonfiguruj 'Multipurpose Clock Generator' w funkcji inicjalizującej moduł

TPM. Ustaw zegar o częstotliwości 32kHz i uruchom go, na przykład:

MCG->C1 |= MCG_C1_IRCLKEN_MASK;

MCG->C1 |= MCG_C1_IREFS_MASK;

2.6. Ustaw odpowiednie bity w rejestrze TPMX_SC, aby upewnić się że licznik

będzie liczył w górę.

2.7. Ustaw prescaler modułu TPM tak, aby częstotliwość inkrementacji licznika

była poniżej 1 kHz.

2.8. Wyczyść licznik i ustaw wartość modulo dla licznika tak, aby uzyskać

przepełniał się rzadziej niż co 1 sekundę.

2.9. Skonfiguruj jeden z kanałów TPM tak, aby pracował w trybie ‘software

compare’:

Użyj masek TPM_CnSC_MSA_MASK, TPM_CnSC_MSB_MASK,

TPM_CnSC_ELSA_MASK, i TPM_CnSC_ELSA_MASK

Dostęp do rejestrów CnCS odbywa się za pomocą konstrukcji

TPMX->CONTROLS[ch_nbr].CnSC |= ...;'

2.10. Wykonaj wszystkie niezbędne kroki do uruchomienia przerwań od modułu

TPM.

2.11. Włącz licznik TPM:

Ustaw pole CMOD w rejestrze TMPX_SC.

2.12. Napisz procedurę obsługi przerwania dla modułu TPM:

Zmieniaj stan innej diody niż poprzednio.

Nie zapomnij wyczyścić flagi przerwania.

2.13. Wywołaj funkcję inicjalizującą timer TPM w funkcji main().

2.14. Skompiluj kod, wyeliminuj wszystkie błędy i ostrzeżenia, a następnie

zweryfikuj działanie programu.

3. SONAR

Na podstawie modułu HC-SR04 przedstawiony zostanie ultradźwiękowy sonar.

Wszelkie niezbędne informacje zawarte są w dokumentacji tego modułu.

Na tym etapie uczestnicy laboratorium powinni posiadać wszelką wiedzę

niezbędną do napisania sterownika sonaru. Poniższy kroki są wskazówkami jak to

osiągnąć. Jednakże sonar można obsłużyć na wiele różnych sposobów korzystając

z peryferii dostępnych w mikrokontrolerze. W nawiasach zawarte są przykładowe

nazwy i konfiguracje, jakie mogą zostać użyte.

Najpierw utwórz nowy projekt, a następnie:

1. Stwórz pliki sterownika sonaru (sonar.c i sonar.h).

2. Sonar wymaga mechanizmu wyzwalającego pomiar oraz timera mierzącego

długość impulsu odpowiedzi.

3. Sonar musi być prawidłowo podłączony do płytki FRDM. Użyj schematu, aby

znaleźć odpowiednie piny. Potrzebne są 2 piny, jeden do obsługi wyzwalacza,

drugi do obsługi echa. Aby je wybrać użyj reference manuala, rozdział 10.3.1.

(Potrzebujemy 2 pinów podłączonych do dwóch różnych timerów TPM, np.:

PTB1 dla TPM1 CH1, PTB2 dlaTPM2 CH0)

UWAGA!!! Podczas podłączania lub odłączania czegokolwiek do/od płytki upewnij się,

że zasilanie jest ODŁĄCZONE!!!

Przed podłączeniem zasilania poproś prowadzącego o zweryfikowanie

poprawności podłączenia.

4. W pliku ‘system_MKL46Z4.c’ ustaw CLKOCK_SETUP taka by mikrokontroler

używał zewnętrznego kwarcu 8MHz w trybie PLL.

5. W plku nagłówkowym sonaru zadeklaruj funkcję inicjalizującą I zdefiniuj ją w

pliku źródłowym.

6. W funkcji inicjalizującej:

6.1. Najpierw podłącz zegar do wszystkich używanych modułów (PORTB,

TPM1, TPM2).

6.2. Jako źródło zegara TPM wybierz MCGIRCLK ( SIM->SOPT2).

6.3. Ustaw wewnętrzny zegar MCG na 4MHz (MCG->C2).

6.4. Włącz wewnętrzny zegar MCG (MCG->C1).

6.5. Do wyzwalania sonaru użyjemy timera TPM (TPM1). Skonfigurujemy jeden

z pinów (PTB1) aby był użyty jako kanał timera (CH1):

6.5.1. Ustaw alternatywną funkcję wybranego pinu (PTB1) na kanał modułu

TPM (TPM1 CH1).

6.5.2. Ustaw prescaler tak, aby licznik timera był inkrementowany co 16 us.

Sonar wymaga aby wyzwalacz trwał 10 us, wartość 16 jest

wystarczająco blisko aby zadziałał i dość łatwo można ją wygenerować

za pomocą dostępnych częstotliwości wejściowych.

6.5.3. Wyczyść licznik TPM.

6.5.4. Ustaw taką wartość porównania licznika, aby była osiągnięta około

10 ms po starcie od zera.

6.5.5. Ustaw wartość modulo licznika na około 200 ms, jeżeli sygnał echo

nie będzie odpowiadał po takim czasie rozpocznie się procedura

generacji wyzwalacza mimo braku sygnału echo w poprzednim cyklu.

6.5.6. Skonfiguruj kanał TPM na taki, aby po osiągnięciu przez licznik

zadanej wartości wygenerował dodatni impuls na wyjściu.

6.6. Do pomiary echa sonaru użyjemy timera TPM (TPM2). Skonfigurujemy

jeden z pinów (PTB2) aby był użyty jako kanał timera (CH0):

6.6.1. Ustaw alternatywną funkcję danego pinu (PTB2) na kanał modułu

TPM (TPM2 CH0).

6.6.2. Ustaw prescaler tak, aby licznik timera był inkrementowany co 1 us.

6.6.3. Ustaw kanał TPM tak, aby generował przerwanie po wykryciu zbocza

narastającego lub opadającego.

6.6.4. Wyczyść czekające przerwania NVIC dla modułu TPM (TPM2).

6.6.5. Uruchom przerwania NVIC dla modułu TPM (TPM2).

6.6.6. Włącz przerwania dla kanału TPM (TPM2 CH0).

6.7. Uruchom oba liczniki timerów (TPM1 & TPM2).

7. Teraz napisz obsługę przerwania od modułu TPM (TPM2).

7.1. Przerwanie od echa sonaru jest generowane na każde zbocze sygnału

wejściowego, więc najpierw odczytaj stan wejścia poprzez zwyczajne

odczytanie rejestru wejściowego danego portu (PORTB), użyj rejestrów

szybkiego dostępu.

7.2. Kiedy wykryte zostanie zbocze narastające:

7.2.1. Wczytaj zatrzaśniętą wartość licznika do zmiennej statycznej

(zadeklarowanej w pliku nagłówkowym), zostanie ona użyta jako czas

startowy.

7.2.2. Wyczyść flagę przepełnienia(overflow) licznika echo (TPM2).

7.2.3. Wyłącz licznik timera TPM obsługującego wyzwalacz (TPM1).

7.3. Kiedy wykryte zostanie zbocze opadające:

7.3.1. Sprawdź czy licznik TPM obsługującego echo się przepełnił, jeżeli nie:

7.3.1.1. Zapisz różnicę pomiędzy wartością startowa a zatrzaśniętą

aktualnie w zmiennej globalnej zadeklarowanej w pliku

nagłówkowym.

7.3.2. Jeśli licznik się przepełnił, nie zapisuj wyniku.

7.3.3. Wyczyść licznik modułu TPM obsługującego wyzwalacz (TPM1).

7.3.4. Włącz licznik modułu TPM obsługującego wyzwalacz (TPM1).

7.4. Wyczyść flagę przerwania modułu TPM (TPM2).

8. Napisz funkcję zwracającą mierzoną odległość:

8.1. Wartość w buforze wyskalowana jest w [us] i jest proporcjonalna do

zmierzonej odległości.

8.2. Wiedząc że prędkość dźwięku wynosi około 34 m/s oblicz odległość i zwróć

wartość.

9. W pliku main:

9.1. Załącz przed chwilą utworzoną bibliotekę sonaru oraz bibliotekę

wyświetlacza LCD utworzoną na wcześniejszych laboratoriach.

9.2. Wywołaj funkcję inicjalizującą sonar.

9.3. W pętli nieskończonej wyświetlaj odległość.

Powinniście teraz widzieć prawidłową odległość na wyświetlaczu, ale zmienia się

ona tak szybko trudno ją odczytać. Zmieńmy to.

10. Najpierw obliczmy odległość, jako wykorzystując średnią z kilku ostatnich

próbek.

10.1. W pliku nagłówkowym sonaru proszę zadeklarować tablicę próbek,

która będzie służyć jako bufor.

10.2. Liczbę próbek można zmieniać za pomocą definicji (10).

10.3. W funkcji obsługi przerwania (TPM2) zamiast zapisywać zmienne do

zmiennej, zapisz je do tablicy w cykliczny sposób.

10.4. W funkcji obliczającej odległość, najpierw oblicz średnią z zapisanych

próbek, a następnie użyj ją do obliczeń.

11. Następnie użyj modułu PIT do wyświetlania odległości na ekranie LCD, zamiast

w pętli głównej programu.

11.1. Stwórz parę plików, nagłówkowy i źródłowy, dla modułu PIT.

11.2. W funkcji inicjalizującej:

11.2.1. Podłącz zegar do modułu PIT.

11.2.2. Ustaw przerwanie co 100 ms.

11.2.3. Wyczyść przerwanie oczekujące NVIC modułu PIT.

11.2.4. Włącz przerwanie NVIC modułu PIT.

11.2.5. Włącz przerwanie dla wybranego kanału PIT (0).

11.2.6. Włącz licznik wybranego kanału timera PIT.

11.2.7. Włącz zegar standardowych timerów PIT.

11.3. W funkcji obsługi przerwania:

11.3.1. Sprawdź źródło przerwania

11.3.2. Wyświetl wartość odległości na wyświetlaczu LCD.

11.3.3. Wyczyść flagę przerwania.

12. Zakomentuj funkcję wyświetlającą z pętli głównej program.

Zauważ, że teraz wartość jest znacznie bardziej stała. Zwróć uwagę na to, że ze

względu na szeroki kąt działania sonaru ilość przeszkód wokół mierzonej

płaszczyzny powinna być jak najmniejsza.

ZADANIE DOMOWE

1. Używając wiedzy zdobytej podczas wykonywania 3 instrukcji, użyj jak

najbardziej energooszczędnego trybu mikrokontrolera.

2. Używając podobnej techniki do przedstawionej w tej instrukcji zmierz czas,

przez jaki był wciśnięty przycisk.