okno zatrzymania
Transkrypt
okno zatrzymania
Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki WIET Laboratorium mikrokontrolerów Ćwiczenie 2 Programowania GPIO Autor: Paweł Russek http://www.fpga.agh.edu.pl/pm ver. 26.10.16 1/12 1. Cel ćwiczenia Podczas niniejszego ćwiczenia student poszerzy swoją wiedzę na temat struktury i sposobu programowania układów peryferyjnych WE/WY ogólnego zastosowania (GPIO) w mikrokontrolerach serii Kinetis L firmy NXP (Kinetis). Zostaną przedstawione nowe funkcjonalności, a w szczególności sposób progrmowania GPIO jako wejścia. Zostanie przedstawiona płytka podstawowych układów peryferyjnych, która zawiera diody LED, wyświetlacz 7-segmentowy LED i klawiaturę matrycową, rozszerzająca możliwości zestawu FRDM-KL25Z. Następnie, przedstawimy typowy dla przełączników mechanicznych problem drgania styków, który zostanie wyeliminowany przez studentów w przygotowanej aplikacji. Równocześnie, student zacznie wykorzystywać debuger, ważną funkcjonalność środowiska Keil uVision. 2. Płytka podstawowych elementów peryferyjnych Każdy mikrokontroler potrzebuje urządzeń peryferyjnych, aby współpracować z użytkownikiem i środowiskiem zewnętrznym. Jest wiele tzw. płytek peryferyjnych, które można podłączać do FRDM-KL25Z, ale na potrzeby niniejszego laboratoriu zostanie użyta płytka, która oferuje podstawowe potrzebne w ćwiczeniach elelemty. Schemat poniżej przedstawia budowę płytki podstawowych elementów peryferyjnych. 2/12 A schematic Basic Peripheral Board for Microcontrollers Laboratory Na płytce można znaleźć złącza typu „goldpin”, osiem diod LED, wyświetlacz 4LED 7segmentowy, przyciski oraz obwód wykrywający przyciśnięcia klawisza (D21-D24, R2). 2.1. Złącza „goldpin” JP1 Zworka JP1 jest używana w celu zmiany funkcjonalności klawiatury matrycowej 4x4 na 4 klasyczne przyciski. Kiedy zworka jest zwarta, przełączniki S1, S2, S3, S4 mogą być bezpośrednio podłączone do portów mikrokonontrolera i odczytywane poprzez stany sygnałów C1, C2, C3 i C4 na złączy JP4. Kiedy zwora JP1 jest otwarta detekcja wciśniętego przycisku S1-S16 wymaga napisania na mikrokontroler specjalnej procedury obsługi klawiatury matrycowej. JP2 Pin JP2 może być użyty przez mikrokontroler do detekcji wciśnięcia przycisku klawiatury matrycowej. Pin może być wykorzystany jako źródło zewnętrznego przerwania dla mikrokontrolera. JP3 Złącze JP3 to złącze do podłączenia diod LED. Piny należy wysterować wysokim stanem logicznym, aby wybrane diody się zapaliły. JP4 Złącze JP4 to złącze klawiatury matrycowej 4x4. Sygnały C1, C2, C3 i C4 są podłączone do kolumn klawiatury, a sygnały R1, R2, R3 i R4 do jej wierszy. Aby odczytać stan przycisków klawiatury należy odczytać aktywną kolumnę i wiersz. Aby odczytać aktywną kolumnę należy podać niski stan logiczny na R1-R4 i aktywować rezystory podciągające (wewnętrzne mikrokontrolera) na liniach C1-C4. Niski stan na linii Cx oznacza wciśnięty przycisk w kolumnie 'x'. Aby odczytać aktywny wiersz należy podać niski stan logiczny na C1-C4 i aktywować rezystory podciągające (wewnętrzne mikrokontrolera) na liniach R1-R4. Niski stan na linii Rx oznacza wciśnięty przycisk w tym wierszu. Kiedy znana jest aktywna kolumna i wiersz znany jest również wciśnięty przycisk. JP5 Złącze JP5 to złącze podłączone do katod diod wyświetlacza 7-segmentowego LED. Należy podać niski stan logiczny, aby zapalić odpowiedni segment wybranej cyfry (sprawdź także opis JP6). JP6 Złącze JP6 to złącze sterujące potencjałem anod diod wyświetlacza 7-segmentowego LED. Należy podać niski stan logiczny, aby aktywować wybraną cyfrę. JP7 Złącze JP7 to złącze zasilające płytkę. Zawsze złącz masy (GND) płytki FRDM i peryferyjnej ze sobą. Dodatni biegun zasilania jest potrzebny w przypadku wykorzystywania wyświetlacza 7-segmentowego. Podłącz dodatni biegun zasilania do napięcia 3,3V lub 5,0V. 3/12 2.2. Płyta drukowana PCB płytki peryferyjnej Aby zbudować obwód pokazany na rysunku powyżej, możliwe jest użycie elementów elektronicznych i uniwersalnej płytki drukowanej lub stykowej („breadboard”). Jednak na laboratorium będziemy posługiwać się zestawem zbudowanym w oparciu o płytkę drukowaną PCB. Rysunek płytki wraz z rozmieszczeniem elementów przedstawiono poniżej. Płyta PCB płytki podstawowych elementów peryfereryjnych 3. Funkcjonalność GPIO W niniejszym rozdziale, przedstawimy nowe funkcjonalności modułów GPIO mikrokontrolerów Kinetis L. Podstawowe informacje na temat GPIO znalazły się już w ćwiczeniu 1 tego laboratorium pt.: „Podstawy programowania mikrokontrolerów w języku C”. Rejestry GPIOx_PDDR (Port Data Direction Register) i GPIOx_PDOR (Port Data Output Register) były już omówione wcześniej. Rejestr PDOR służy do sterowania GPIO jako Wyjściem mikrokontrolera. Jednak w rodzinie Kinetis L, dla wygody programisty, do obsługi wyjścia GPIO wyodrębniono jeszcze dodatkowe rejestry. Mamy do dyspozycji rejestry GPIOx_PSOR, GPIOx_PCOR i GPIOx_PTOR odpowiednio dla każdego portu. GPIOx_PSOR (Port Set Output Register) GPIOx_PCOR (Port Clear Output Register) GPIOx_PTOR (Port Toggle Output Register) Zapis do tego rejestru aktualizuje stan odpowiednich bitów rejestru PDOR w następujący sposób: '0': Odpowiedni bit w PDORn nie zmienia się. '1': COdpowiedni bit w PDORn ustawia się na '1'. Zapis do tego rejestru aktualizuje stan odpowiednich bitów rejestru PDOR w następujący sposób: '0': Odpowiedni bit w PDORn nie zmienia się. '1': Odpowiedni bit w PDORn ustawia się na '0'. Zapis do tego rejestru aktualizuje stan odpowiednich bitów rejestru PDOR w następujący sposób: '0': Odpowiedni bit w PDORn nie zmienia się. 4/12 '1': Odpowiedni bit w PDORn zmienia stan na przeciwny. Tabela podaje i opisuje dodatkowe rejestry związane z GPIOx. Kiedy skonfugurujemy rejestr kierunku PDDR jako wyjście, możemy używać rejestrów „Set”, „Clear” i „Toggle”, aby ustawić, skasować lub przestawić bity rejestru wyjściowego PDOR. Dodatkowe rejestry bardzo ułatwiają programiście manipulowanie pojedynczymi bitami portów WE/WY. Na przykład, zapisanie wartości 4 (binarnie 0100) do PCOR wyłączy bit drugi b2 tego portu nie zmieniając stanu pozostałych bitów. Dla każdego portu A-E, do obsługi GPIOx jako wejścia, jest do dyspozycji rejestr wejściowy (GPIOx_PDIR). Kiedy skonfigurujemy bity rejestr kierunku PDDR jako wejście (wpiszemy zero), rejestr PDIR może być odczytywany, aby uzyskać informacje o stanie pinów odpowiedniego portu. Możemy, na przykład, podłączyć przełączniki do portu, aby odczytywać stan (włączony/wyłączony). Zależnie od tego w jakiej konfiguracji przełącznik został podpięty, może być potrzeba włączenia wewnętrznego rezystora podciągającego portu mikrokontrolera. Rezystor może podciągać potencjał wejścia do jedynki (pull-up) lub zera (pull-down). Na poniższym rysunku przestawiono obydwie konfiguracje. Podłączenie przełączników do mikrokontrolera Konfiguracja rezystorów podciągających jest realizowana przez programistę w rejestrze kontrolnym PORTx_PCRn (Pin Control Register). Przy pomocy wybranych bitów tego rejestru możemy włączyć/wyłączyć rezystor podciągający i wybrać „pull-up” lub „pull-down”. Bit PE (Pull Enable) rejestru PORTx_PCRn jest używany do włączenia rezystora, a bit PS (Pull Select) służy to wybrania trybu podciągania (jak na rysunku poniżej). 5/12 Bity PS i PE rejestru PORTxPCRn 4. Sposób nazywania bitów w nagłówku MKL25Z4 Programowanie mikrokontroerów bardzo często wymaga ustawiania poszczególnych bitów rejestrów. Każdy bit ma swoją funkcję i musi być sterowany odrębnie. Dostęp do poszczególnych bitów wymaga znajomości ich położenia w rejestrze. Oczywiście można odszukać położenie bitu w dokumentacji, ale lepiej posługiwać się nazwami bitów zdefiniowanymi w MKL25Z4.h. Definicje te kodują pozycję wybranego bitu. Na przykład: Pozycja bitu PE w rejestrze PCR jest zdefiowana jako PORT_PCR_PS_MASK. W definicji njpierw podano nazwę modułu gdzie znajduje się rejestr (PORT), później nazwę rejestru (PCR), a na końcu nazwę bitu (PE). Ponieważ definicja jest używana do modyfikowania (maskownia) bitu na końcu dodano sufiks MASK. Inne przykłady: Bit PE rejestru PCR to PORT_PCR_PS_MASK Bit PORTA rejestru SCGC5 to SIM_SCGC5_PORTA_MASK W taki sam sposób można używać definicji aby maskować pola bitowe (jak na przykład MUX w rejestrze PCR): Pole bitowe MUX rejestru PCR to PORT_PCR_MUX_MASK 6/12 Co więcej, nagłówek MKL25Z zawiera makra, które pozwalają ustawiać wartość bitów i pól bitowych w bardzo wygodny i czytelny sposób. Przykład: //Ustaw bit PORTA rejestru SMGC5 w module SIM SIM->SCGC5|=SIM_SCGC5_PORTA(1); //Ustaw multiplekser pinu 10 w porcie A w pozycji trzeciej funkcji PORTA->PCR[10]|=PORT_PCR_MUX(3); Wszelkie wątpliwości dotyczące nazwy definicji dla wybranego pinu można rozstrzygnąć sprawdzając zawartość pliku “MKL25Z.h”. Aby otworzyć ten plik, należy w edytorze uVision najechać kursorem myszy na nazwę MKL25Z.h i kliknać prawy przycisk myszy. Następnie wybrać z menu ekranowego “Open document ...”) Ćwiczenie 4.1 W nagłówku MKL25Z4.h znajdź definicje i makra podanych w tabeli poniżej bitów. Bit SBNS (Stop Bit Number Select) rejestru BDH w module UART0. Ten bit ustawia liczbę bitów stop w transmisji szeregowej. Pole bitowe MODE w rejestrze CFG1 modułu ADC. Te bity decydują i rozdzielczości przetwornika AC (8-bit, 10-bit, 12bit lub 16-bit). 5. Aplikacja przełączania diod LED Ćwiczenie 5.1 1. Podłącz płytę FRDM-KL25Z do płytki peryferyjnej zgodnie ze schematem poniżej. 7/12 Sposób połącznenia FRDM25Z i płytki peryferyjnej 2. W programie uVision, stwórz nowy projekt o nazwie “Toggling_LEDs”. Stwórz nowy katalog dla nowego projektu. Pamiętaj, aby trzymać swoje projekty w swoim katalogu. 3. W edytorze uVision, stwórz nowy plik “main.c”, a następnie skopiuj do niego kod źródłowy podany poniżej. /*----------------------------------------------------------------------------* Name: main.c * Purpose: Toggling_LEDs application * Author: Student *----------------------------------------------------------------------------*/ #include "MKL25Z4.h" /*Device header*/ #define LED_1 #define SW_1 0 0 int main() { //Enable clock for Port B and Port D SIM->SCGC5|=SIM_SCGC5_PORTB(1)|SIM_SCGC5_PORTD(1); //Configure Port B pin 0 as GPIO, Output PORTB->PCR[LED_1]|=PORT_PCR_MUX(1); PTB->PDDR|=(1<<LED_1); //Configure Port D pin 0 as GPIO, Input, Pull-up resistor PORTD->PCR[SW_1]|=PORT_PCR_MUX(1) | PORT_PCR_PE(1) | PORT_PCR_PS(0); PTD->PDDR&=~(1<<SW_1); 8/12 while(1){ if( (PTD->PDIR & (1<<SW_1))==0){ if(PTB->PDOR & (1<<LED_1)) PTB->PDOR&=~(1<<LED_1); else PTB->PDOR|=(1<<LED_1); while((PTD->PDIR & (1<<SW_1))==0); //Wait for SW_1 release } } } 4. Skompiluj i załaduj aplikację na płytkę FRDM-KL25Z. Dioda D1 powinna się przełączać kiedy wciśniesz przycisk SW1. 5. Zmodyfikuj kod aplikacji “Toggling_LEDs” tak aby możliwe było przełączanie wszystkich czterech diod D1-D4 przy pomocy czterech przycisków S1-S4. Postaraj się napisać aplikację tak, aby program wynikowy był jak najmniejszy. Porównaj wielkość swojego programu z wielkością programów kolegów. Rozmiar binarnego obrazu programu pojawia się w oknie “Built Output” po skompilowaniu kodu aplikacji. Program Size: Code=... 6. Debuger Keil uVision Debugger to program służący do śledzenia pracy i usuwania błędów z innych programów. Debugger w środowisku uVision może pracować jako symulator (bez płytki z mikrokontrolerem podłączonej do PC) lub jako monitor pracy zewnętrznego systemu z mikrokontrolerem. Symulator to produkt softwarowy, który jedynie emuluje większość funkcji wybranego mikrokontrolera. Monitor to złożony produkt, który zawiera interfejs komunikacyjny z systemem zewnętrznym na którym faktycznie uruchamiany jest testowany program. Aby włączyć debugger w trybie monitora, należy użyć jednej z opcji <Hardware Debugger> z prawej strony okna konfiguracji. 9/12 Kiedy sesja debuggera zostanie uruchomiona w uVision, aplikacja jest ładowana na płytkę i uruchamiana. Następnie wykonywany jest kod startowy mikrokontrolera (start-up code) i program jest zatrzymywany na początku funkcji „main” programu. Kiedy wykonywanie programu zostaje zatrzymane, uVision otwiera okno tekstowe z wykonywanym kodem, gdzie aktualnie realizowana linia jest podświetlona. Dodatkowo widzimy okno dis-assemblera z kodem maszynowym. W menu uVision pojawiają się nowe funkcje menu: Debug menu Opis Używaj komendy „Start/Stop Debug Session command” aby uruchomić lub zakończyć sesję debuggera. Aby uruchomić zatrzymany program użyj komendy „Run” z menu debuggera. Aby zatrzymać uruchomiony program komendy „Stop” z menu debuggera. użyj Aby ponownie uruchomić program ożyj komendy „Reset” z menu debuggera lub „Debug–>Reset CPU” z menu programu. Aby krokować wykonywanie programu jednocześnie przechodząc przez kod realizowanych funkcji użyj komendy „Step” z menu debuggera. TAby krokować wykonywanie programu jednocześnie przeskakując kod realizowanych funkcji użyj komendy „Step Over” z menu debuggera. Aby wyskoczyć z aktualmnie wykonywanej funkcji poziom wyżej użyj komendy „Step Out” z menu debuggera. 10/12 6.1. Punkty zatrzymania (breakpoints) W celu sprawdzenia statusu wykonywanego programu, w uVision można ustawiać punkty zatrzymania w wykonywanym kodzie aplikacji. Można ustawić punkty zatrzymania w wybranej linii kodu, aby sprawdzić aktualny stan programu (stos, pamięć). Można również definiować pułapki, które zatrzymają program po wystąpieniu zdefiniowanego zdarzenia. Aby ustawić punkt zatrzymania (Breakpoint) w wybranej linii kodu, należy w edytorze lub oknie dis-assemblera otworzyć menu kontekstowe w tej linii (kliknięcie prawym przyciskiem myszy) i wybrać komendę „Insert/Remove Breakpoint”. Aby ustawić lub usunąć „breakpoint”, można również wykonać podwójne kliknięcie lewym przyciskiem myszy na szarym pasku po lewej stronie okna edytora lub dis-assemblera. Punkty zatrzymań są oznaczone czerwoną kropką w odpowiedniej linii programu. 6.2. Podglądanie zmiennych (funkcja Watch) Wybierz aby wyświetlić okna „Watch”. Domyślnie, okna „Watch” składają się z czterech zakładek: „Locals”, aby wyświetlać aktualną wartość aktywnych zmiennych lokalnych programu; dwie zakładki „Watch”, aby wyświetlić zmienne zdefiniowane przez użytkownika; zakładka „Call Stack”, aby wyświetlić drzewo wykonywania programu. W oknach „Watch” można podglądać i modyfikować zmienne programu. Zagnieżdżone wywołania funkcji również są uwidocznione w tym oknie. Zawartość okna jest aktualizowana automatycznie w momencie zatrzymania wykonywania programu i miarę jego krokowania, kiedy opcja View –> Periodic Window Update jest ustawiona. W przeciwieństwie do okna „Locals”, które pokazuje jedynie aktualnie aktywne zmienne, okno „Watch” pokazuje zmienne zdefiniowane przez użytkownika. Aby zdefiniować zmienną w oknie „Watch” można: • dwu-kliknąć myszą w oknie „Watch” lub wcisnąć F2, 11/12 • dwu-kliknąć wcześniej dodaną zmienną i zmodyfikować jej nazwę, • otworzyć menu kontekstowe (prawy przycisk myszy) w oknie debuggera i wybrać „Add <item name> to…”. uVision automatycznie wybierze zmienną pod kursorem myszy i doda ją do okna „Watch”. Można również zaznaczyć wyażenie i dodać do do „Watch”. Aby zmodyfikować wartość zmiennej lokalnej podczas przerwy w działaniu programu należy dwu-kliknąć na aktualną wartość zmiennej (lub wybrać i nacisnąć F2) i po prostu ją zmodyfikować. Aby usunąć zmienną z okna „Watch”, wybierz zmienną i wciśnij przycisk Del Ćwiczenie 6.1 • Ustaw breakpoint w wybranym miejscu w „Toggling_LEDs”. • Aktywuj sesję debuggera i uruchom program. • Kiedy program się zatrzyma rozpocznij jego krokowanie. • Dodaj wybraną zmienną do okna „Watch” • Kontynuuj krokowianie śledząc wartość zmiennych w oknie „Locals” i „Watch” 7. Eliminacja drgań styków przycisków Podczas włączania i wyłączania mechanicznych przełączników powstają drgania styków powodując, że zmiana stanu przełącznika nie jest płynna. Raczej, zanim stan przełącznika się ustabilizuje wykonuje on wiele przejść ze stanu włącz do wyłącz. Drganie styków przełącznika mechanicznego Może się zdarzyć, jeżeli mikrokontroler często odczytuje stan przycisku, że pojedyncze wciśnięcie/puszczenie przycisku może zostać odczytane wielokrotnie. W wielu aplikacjach jest ważne, aby wciśnięcia przycisku były zliczane prawidłowo. Prostym rozwiązaniem programistycznym problemu drgań jest wprowadzenie opóźnienia w detekcji zmiany stanu przycisku wprowadzone po wykryciu zmiany jego stanu. Program czeka 10 – 20 ms po tym jak stan przycisku zmieni się z „włącz.” na „wyłącz.” lub odwrotnie. Po tym czasie zestyki powinny być już stabilnie zwarte lub rozwarte. Ćwiczenie 7.1 Do aplikacji “Toggling_LEDs” dodaj funkcję eliminacji drgań styków. 12/12