Instrukcja

Transkrypt

Instrukcja
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.

Podobne dokumenty