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.