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 4LED 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

Podobne dokumenty