Programowanie ST7 _2011.03.21 - ZST
Transkrypt
Programowanie ST7 _2011.03.21 - ZST
Politechnika Wrocławska Mikrokontrolery rodziny ST7 Jarosław Emilianowicz Wrocław 2011 2 | Strona SPIS TREŚCI ASEMBLER........................................................................ 3 Etykiety, rozkazy i komentarze ............................................................ 3 Pierwszy program .............................................................................. 4 Formatka .......................................................................................... 5 ST VISUAL DEVELOP .......................................................... 6 Konfiguracja przestrzeni roboczej ......................................................... 6 Konfiguracja projektu ......................................................................... 7 Kompilacja projektu ........................................................................... 9 Uruchamianie projektu ..................................................................... 11 SCHEMATY BLOKOWE ........................................................ 13 Symbole schematów blokowych ......................................................... 13 Przykładowy algorytm ...................................................................... 14 MIKROKONTROLER ST72334 ............................................ 16 Charakterystyka .............................................................................. Opis wyprowadzeń ........................................................................... Rejestry wewnętrzne CPU ................................................................. Rejestr statusu ................................................................................ Mapa pamięci .................................................................................. Rejestry specjalne ............................................................................ 16 17 18 19 20 21 PAMIĘĆ ......................................................................... 23 Rezerwacja zmiennych ..................................................................... Inicjalizacja stałych .......................................................................... Przypisanie wartości ......................................................................... Dostęp do tablic ............................................................................... 23 23 24 24 STEROWANIE PROGRAMEM ................................................. 26 Skoki i wywołania bezwarunkowe ....................................................... 26 Skoki warunkowe ............................................................................. 26 Testowanie bitów i skoki warunkowe .................................................. 27 DZIAŁANIA ARYTMETYCZNE ................................................ 29 Dodawanie i odejmowanie ................................................................. 29 MnoŜenie ........................................................................................ 29 Dzielenie ......................................................................................... 29 PORTY WEJŚCIA-WYJŚCIA .................................................. 32 Diody LED ....................................................................................... 32 Klawisze ......................................................................................... 33 Wyświetlacz 7-segmentowy ............................................................... 34 Mikrokontrolery rodziny ST7 J. Emilianowicz Strona | 3 ASEMBLER Etykiety, rozkazy i komentarze Język mnemoniczny jest łącznikiem pomiędzy maszynami, których język jest wyłącznie numeryczny, a ludźmi, którym wygodniej jest uŜywać znaków i słów. Język mnemoniczny jest łatwo tłumaczony na język maszynowy, bo charakteryzuje go zaleŜność słowo-na-słowo, pomiędzy językiem numerycznym a językiem słownym, mnemonicznym. Język mnemoniczny jest takŜe nazywany asemblerem, a program tłumaczący na język maszynowy Asemblerem. Linia programu źródłowego składa się z czterech elementów: - etykiety, mnemonika rozkazu lub dyrektywy asemblera oraz linkera operanda (liczby, rejestru), gdzie liczba operandów zaleŜy od uŜytego rozkazu komentarza (zawsze rozpoczynającego się od średnika) dzielenie sub A,#$22 ; dzielenie akumulatora przez wartość $22 Etykiety powinny rozpoczynać się od samego boku dokumentu, natomiast rozkazy wraz z operandami powinny być odsunięte przynajmniej o jedną spację. dzielenie sub A,#$30 sub A,#$22 ; dzielenie akumulatora przez wartość $30 ; dzielenie akumulatora przez wartość $22 Etykiety są symbolicznymi adresami i wskazują miejsca w programie, do którego mogą następować skoki. Oznaczają teŜ wyraźnie wybrany blok rozkazów, przez co zwiększa się czytelność pliku. Muszą zaczynać się od kropki i od lewego marginesu oraz nie mogą zawierać znaków spacji. Lista mnemoników jest definiowana przez producenta mikrokontrolera. Zawiera ona listę kodów specyficznych dla danego modelu mikrokontrolera. Rozkazy są powiązane z funkcją instrukcji. Część z nich jest dokładną nazwą instrukcji, np. ADD (add), część skrótem, jak SUB (substract), a inne akronimen, jak TNZ (Test for Negative or Zero). Liczby mogą być zapisane w jednym z powszechnie stosowanych formatów, przedstawionych w tabeli poniŜej. W środowisku ST Visual Develop domyślnym formatem jest format Motoroli. Zapis Dwójkowo Ósemkowo Dziesiętnie Szesnastkowo Motorola %01010000 ~7 10 $FF Intel 01010000b 7o 10 lub 10d 0FFh Texas ?01010000 ~7 10 >FFh Zilog %(2)01010000 %(8)7 10 %FF Komentarze są poprzedzone średnikiem i mogą znajdować się w dowolnej kolumnie. Nie są one przetwarzane przez asembler, a pozwalają utrzymać czytelność pliku źródłowego i zrozumiałość, przy próbie jego analizy w przyszłości. J. Emilianowicz Mikrokontrolery rodziny ST7 4 | Strona Pierwszy program Wszystkie pliki przetwarzane przez asembler muszą rozpoczynać się instrukcją ST7/, umieszczoną w pierwszej kolumnie pierwszego wiersza, co wskazuje asemblerowi, Ŝe asemblujemy plik dla procesorów rodziny ST7, a kończyć instrukcją END. Pominięcie instrukcji END będzie sygnalizowane jako błąd. Dla pewności, Ŝe ostatnia instrukcja nie zostanie pominięta podczas asemblacji, naleŜy potwierdzić koniec linii znakiem ENTER by kursor przeszedł do następnej linii. ST7/ ... END Właściwy program powinien zostać umieszczony we właściwym segmencie ROM, zacząć się od etykiety (np. MAIN) i posiadać rozkaz resetujący wskaźnik stosu RST. Ponadto powinien być zakończony ponownym skokiem na początek programu lub niekończącą się pętlą, by uniemoŜliwić wykonywanie niechcianego kodu, który moŜe znajdować się w dalszej części pamięci programu. ... segment ‘rom’ main rsp ; reset wskaźnika stosu infinite_loop jp infinite_loop ; niekończąca się pętla ... Kompilacja tak opracowanego programu przebiegnie poprawnie, jednakŜe próba symulacji zakończy się niepowodzeniem, poniewaŜ procesor nie będzie potrafił odnaleźć początek programu w pamięci. W tym celu naleŜy dołoŜyć wektor przerwań i w przerwaniu o najwyŜszy priorytecie wskazać etykietę MAIN. ... NonHandledInterrupt iret ; powrót z przerwań nieobsługiwanych segment 'vectit' dc.w dc.w dc.w dc.w dc.w dc.w dc.w dc.w dc.w Mikrokontrolery rodziny ST7 NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt ; ; ; ; ; ; ; ; ; irq13 irq12 irq11_eeprom irq10_sci irq9_timb irq8_tima irq7_spi irq6 irq5_ext3 J. Emilianowicz Strona | 5 dc.w dc.w dc.w dc.w dc.w dc.w dc.w NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt main ; ; ; ; ; ; ; irq4_ext2 irq3_ext1 irq2_ext0 irq1_mcc irq0 trap reset END Formatka śeby pierwszy program był w całości gotowy, potrzebne są takŜe dodatkowe odwołania do plików z definicjami, charakterystycznymi dla całej rodziny mikrokontrolerów ST7 oraz dla ST72334N2 wykorzystywanego w makiecie uruchomieniowej. ST7/ #include "mapping.inc" #include "ST72334N2.inc" segment ‘rom’ main rsp ; reset wskaźnika stosu ; tutaj właściwy program infinite_loop jp infinite_loop ; niekończąca się pętla NonHandledInterrupt iret ; powrót z przerwań nieobsługiwanych segment 'vectit' dc.w dc.w dc.w dc.w dc.w dc.w dc.w dc.w dc.w dc.w dc.w dc.w dc.w dc.w dc.w dc.w NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt NonHandledInterrupt main ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; irq13 irq12 irq11_eeprom irq10_sci irq9_timb irq8_tima irq7_spi irq6 irq5_ext3 irq4_ext2 irq3_ext1 irq2_ext0 irq1_mcc irq0 trap reset END J. Emilianowicz Mikrokontrolery rodziny ST7 6 | Strona ST VISUAL DEVELOP Oprogramowanie ST Visual Develop umoŜliwia symulowanie pracy mikrokontrolerów rodziny ST7, ale takŜe ich sprzętowe emulowanie przy współpracy z emulatorem DVP2, dostępnym w laboratorium C5 705. Oprogramowanie jest dostępne do pobrania na stronie producenta (www.st.com) pod nazwą ST Toolset. Program instalacyjny instaluje oprócz ST Visual Develop takŜe ST Visual Programmer. W lewej części aplikacji jest okno z przestrzenią roboczą, gdzie będą widoczne w postaci rozwijanego drzewa wszystkie projekty. W prawej części aplikacji będzie wyświetlana zawartość plików. Natomiast u dołu będą wyświetlane komunikaty kompilacji i debugowania. Konfiguracja przestrzeni roboczej Prace z oprogramowaniem ST Visual Develop rozpoczyna sie od utworzenia przestrzeni roboczej (Workspace), a następnie poprzez dodanie kolejnych projektów, które będą widoczne w postaci drzewa. Do katalogu, w którym będą przechowywane pliki przestrzeni roboczej warto przekopiować z katalogu aplikacji ST Toolset pliki st72334n2.asm oraz st72334n2.inc. Mikrokontrolery rodziny ST7 J. Emilianowicz Strona | 7 Nową przestrzeń roboczą tworzy sie wybierając w menu File - New Workspace, następnie Create an empty workspace. W okienku naleŜy wypełnić obydwa dostępne pola. 1. W pierwszym polu Workspace filename wprowadzić nazwę przestrzeni roboczej, np. st7. 2. W drugim polu Workspace location podać ścieŜkę dostępu do katalogu przestrzeni roboczej, np. C:/ST7/. Po poprawnym skonfigurowaniu po lewej stronie aplikacji pojawi sie nazwa przestrzeni roboczej wraz z rozszerzeniem stw. Konfiguracja projektu Nowy projekt do istniejącej juz przestrzeni roboczej dodamy poprzez Project - Add New Project to Workspace.... Pojawi sie okienko, w którym wypełniamy trzy pierwsze pola z czterech dostępnych. 1. W pierwszym polu Project filename wprowadzamy nazwę projektu. Nazwa powinna być krótka, maksymalnie 8 znaków, bez znaków specjalnych. 2. W drugim polu Project location klikając na symbol Ŝółtej teczki zakładamy podkatalog dla projektu. Działanie takie zabezpieczy przed nadpisywaniem się plików róŜnych projektów. 3. W trzecim polu Toolchain naleŜy wybrać ST Assembler Linker. J. Emilianowicz Mikrokontrolery rodziny ST7 8 | Strona Po zatwierdzeniu konfiguracji pojawi się okienko wyboru procesora MCU Selection. W okienku tym naleŜy wybrać procesor ST72334N2. Następnie naleŜy dodać do projektu pliki st72334n2.asm oraz st72334n2.inc klikając prawym klawiszem myszki odpowiednio na Source Files oraz Include Files. Pliki te moŜna odnaleźć w jednym z podkatalogów aplikacji ST Toolset. Mikrokontrolery rodziny ST7 J. Emilianowicz Strona | 9 Kompilacja projektu Kompilację realizuje się poprzez menu Build > Buld (skrót klawiszowy F7). Podczas kompilacji powtarza się często grupa błędów. Brak pliku wykonywalnego Podczas kompilacji moŜe zdarzyć się błąd, wynikający wykonywalnego, a dokładniej niepoprawnej ścieŜki do niego. z braku pliku NaleŜy wtedy pozwolić na wyświetlenie ustawień projektu, wybrać zakładkę STM ASM, a następnie wcisnąć klawisz Defaults. J. Emilianowicz Mikrokontrolery rodziny ST7 10 | Strona Błąd krótkiej kompilacji Podczas prawidłowo przeprowadzanej kompilacji w oknie wyjściowym przewija się zwykle około 30 linijek. JeŜeli jednak kompilacja zakończy się wyświetleniem jedynie jednej linijki 0 error(s), 0 warning(s), to świadczy i nieprawidłowym jej przebiegu i naleŜy przeprowadzić kompilację całego projektu od nowa poprzez menu Buld > Rebuild All. Błąd EOF Skrót EOF oznacza End of File. Błąd ten jest wynikiem braku znaku ENTER za dyrektywą END. Oznacza to, Ŝe powinna być przynajmniej jedna pusta linia pod ostatnią dyrektywą. Mikrokontrolery rodziny ST7 J. Emilianowicz Strona | 11 Uruchamianie projektu Przed rozpoczęciem uruchamiania naleŜy wybrać tryb pracy poprzez ustawienie w menu Debug instrument > Target settings…. W praktyce mogą być wykorzystane trzy z wielu opcji: - Simulator nie wymagający posiadania zestawu uruchomieniowego, Swim ST-Link w przypadku posiadania zestawu STM8 Discovery, DVP2 w przypadku emulatorów sprzętowych, będących na wyposaŜeniu laboratorium. Uruchamianie realizuje się poprzez menu Debug > Start debuging (skrót klawiszowy F7). Prawidłowe uruchomienie powinno zakończyć się wyświetleniem kodu programu wraz z Ŝółtym paskiem podświetlającym pierwszy rozkaz. J. Emilianowicz Mikrokontrolery rodziny ST7 12 | Strona Błąd wektora przerwań JeŜeli po uruchomieniu Ŝółty pasek nie wyświetla się, to oznacza Ŝe w programie nie ma wektora przerwań lub jest niepoprawny, więc procesor/symulator nie potrafi odnaleźć pierwszego rozkazu w pamięci. Mikrokontrolery rodziny ST7 J. Emilianowicz Strona | 13 SCHEMATY BLOKOWE Częściami składowymi schematów blokowych są proste figury geometryczne, w których umieszczone są warunki oraz proste instrukcje. Symbole schematów blokowych Blok graniczny (początek i koniec procedury) Blok operacyjny (obliczenia). Ma kształt prostokąta. Wewnątrz bloku umieszcza się zapis jednej lub kilku operacji. Blok wejścia/wyjścia (wprowadzanie i wyprowadzanie danych). Ma kształt równoległoboku. Wewnątrz bloku umieszcza się nazwy zmiennych, którym mają być nadane wartości wprowadzone z interfejsów zewnętrznych lub nazwy zmiennych, których wartości mają być wysłane do interfejsów zewnętrznych. Blok warunkowy (decyzyjny). Ma kształt rombu. Wewnątrz bloku umieszcza się zapis badanego warunku. JeŜeli warunek jest spełniony, to realizowany jest skok. Jeśli natomiast warunek nie jest spełniony, to mikrokontroler przechodzi do następnego rozkazu (pod rozkazem warunku). J. Emilianowicz Mikrokontrolery rodziny ST7 14 | Strona Blok procesu (procedury). Proces zdefiniowany jest poza algorytmem. MoŜna go porównać do procedury, którą definiuje się raz w programie, by następnie móc ją wielokrotnie wywoływać. Warunkiem uŜycia jest więc wcześniejsze zdefiniowanie procesu. Bloki łącznikowe (stronicowe lub międzystronicowe). Koło symbolizuje tzw. łącznik stronicowy. MoŜe się zdarzyć, Ŝe rysunek musi być dokończony w innym miejscu strony, albo nawet na innej stronie. W pierwszym miejscu naleŜy umieścić łącznik z określonym symbolem w środku (np. cyfrą, literą) i doprowadzić do niego strzałkę. Następnie w drugim miejscu naleŜy umieścić drugi łącznik z takim samym symbolem w środku i wyprowadzić z niego strzałkę. Komentarz Przykładowy algorytm Główny algorytm powinien być zawsze zapętlony na jeden z dwóch sposobów. W algorytmie po lewej zdefiniowana grupa procedur będzie wykonywana cyklicznie. Natomiast w algorytmie po prawej będzie wykonana tylko raz, następnie procesor zacznie wykonywać niekończącą się pętlę. Mikrokontrolery rodziny ST7 J. Emilianowicz Strona | 15 W Ŝadnym z powyŜszych algorytmów nie ma bloku Koniec czy Stop. Bloki takie dozwolone są jedynie przy definiowanych zewnętrznych procedur i oznaczają zakończenie ich wykonywania oraz powrót do głównego programu. PoniŜej przedstawiona jest zewnętrzną procedura wyliczająca silnię. J. Emilianowicz Mikrokontrolery rodziny ST7 16 | Strona MIKROKONTROLER ST72334 Charakterystyka 8-BIT CORE ALU RESET ISPSEL CONTROL VDD VSS MULTI OSC + CLOCK FILTER MCC/RTC PORT F PF7,6,4,2:0 RAM (384B/512B) LVD TIMER A BEEP PORT E PE7:0 SCI WATCHDOG ADDRESS AND DATA BUS OSC1 OSC2 PROGRAM MEMORY (8KB/16KB) EEPROM (256B) PORT A PA7:0 PORT B PB7:0 PORT C TIMER B PC7:0 SPI PORT D PD7:0 8-BIT ADC VDDA VSSA Pamięć - - 8 lub 16K pamięci programu (ROM lub FLASH) z moŜliwością programowania po zamontowaniu w układzie (ISP), wraz z zabezpieczeniem przed odczytem 256 bajtów pamięci danych EEPROM (z opcją zabezpieczenia przed odczytem, w przypadku wersji z pamięcią programu ROM) 384 lub 512 bajtów pamięci RAM. Zegar, reset i zasilanie - - Zawansowany system resetu Zaawansowane zarządzanie niskim poborem energii, z trzema programowalnymi poziomami RóŜnorodne źródła taktowania: rezonatory kryształowe lub ceramiczne, rezonatory RC, zewnętrzny sygnał zegara, rezerwowy system zabezpieczający zegar 4 tryby oszczędzania energii: Halt, Active-Halt, Wait i Slow Układ przerwań - 10 źródeł przerwań, takŜe TRAP i RESET 15 źródeł przerwań zewnętrznych (4 wektory) 44 lub 32 porty I/O - Mikrokontrolery rodziny ST7 44 lub 32 wielofunkcyjnych, dwukierunkowych linii I/O: o 21 lub 19 linii z alternatywną funkcją J. Emilianowicz Strona | 17 o 12 lub 8 linii z wysoką impedancją 4 Liczniki - Konfigurowalny układ watchdoga Liczniki czasu rzeczywistego Dwa 16-bitowe liczniki z: 2 wejściami zapamiętywania (tylko jedno w liczniku A), 2 wyjścia porównania (tylko jedno w liczniku A), zewnętrzne wejścia taktowania licznika A, PWM oraz generator impulsów 2 Porty komunikacyjne - synchroniczny port szeregowy SPI asynchroniczny port szeregowy SCI 1 Przetwornik analogowo-cyfrowy - 8-bitowy przetwornik analogowo-cyfrowy, z 8 kanałami wejściowymi Zestaw instrukcji - operacje 8-bitowymi danymi 63 proste instrukcje 17 głównych trybów adresowania mnoŜenie 8x8, bez znaku operacje na bitach Opis wyprowadzeń Pin PA0 PA1 PA2 PA3 PA4(HS) PA5(HS) PA6(HS) PA7(HS) PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 PC0/OCMP2_B PC1/OCMP1_B PC2(HS)/ICAP2_B PC3(HS)/ICAP1_B PC4/MISO PC5/MOSI PC6/SCK PC7//SS PD0/AIN0 J. Emilianowicz Port Port Port Port Port Port Port Port Port Port Port Port Port Port Port Port Port Port Port Port Port Port Port Port Port Opis A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 B2 B3 B4 B5 B6 B7 C0 / Wyjście 2 porównania licznika B C1 / Wyjście 1 porównania licznika B C2 / Wejście 2 przechwytujące licznika B C3 / Wejście 1 przechwytujące licznika B C4 / Wyjście portu SPI C5 / Wejście portu SPI C6 / Taktowanie portu SPI C7 / Wejście Slave portu SPI D0 / Wejście analogowe ADC 0 Mikrokontrolery rodziny ST7 18 | Strona PD1/AIN1 PD2/AIN2 PD3/AIN3 PD4/AIN4 PD5/AIN5 PD6/AIN6 PD7/AIN7 PE0/TD0 PE1/RDI PE4(HS) PE5(HS) PE6(HS) PE7(HS) PF0/MCO PF1/BEEP PF2 PF4/OCMP1_A PF6/ICAP1_A PF7/EXTCLK_A ISPSEL /RESET OSC2 VDD_0 VDD_1 VDD_3 VSS_0 VSS_1 VSS_3 VDDA VSSA Port D1 / Wejście analogowe ADC 1 Port D2 / Wejście analogowe ADC 2 Port D3 / Wejście analogowe ADC 3 Port D4 / Wejście analogowe ADC 4 Port D5 / Wejście analogowe ADC 5 Port D6 / Wejście analogowe ADC 6 Port D7 / Wejście analogowe ADC 7 Port E0 / Wyjście portu SCI Port E1 / Wejście portu SCI Port E4 Port E5 Port E6 Port E7 Port F0 / Wyjście zegara (fosc/2) Port F1 / Sygnał do przetwornika piezoelektrycznego Port F2 Port F4 / Wyjście porównania licznika A Port F6 / Wejście przechwytujące licznika A Port F7 / Zewnętrzne źródło licznika A Wejście ISP Wejście resetujące Wyjście rezonatora lub wejście oscylatora RC Napięcie zasilające bloku cyfrowego Napięcie zasilające bloku cyfrowego Napięcie zasilające bloku cyfrowego Masa bloku cyfrowego Masa bloku cyfrowego Masa bloku cyfrowego Napięcie zasilające bloku analogowego Masa bloku analogowego Legenda: HS – maks. 20mA Rejestry wewnętrzne CPU Mikrokontrolery rodziny ST7 posiadają pełną 8-bitową architekturę. wewnętrznych rejestrów pozwala sprawnie operować 8-bitowymi danymi. Sześć 7 0 7 0 akumulator rejestr wskaźnikowy X 7 0 rejestr wskaźnikowy Y 15 0 licznik rozkazów 15 0 wskaźnik stosu 7 0 rejestr statusu Mikrokontrolery rodziny ST7 J. Emilianowicz Strona | 19 Akumulator Akumulator jest głównym 8-bitowym rejestrem, wykorzystywanym do przechowywania operandów oraz wyników arytmetycznych i logicznych operacji. Rejestry wskaźnikowe (X i Y) Te 8-bitowe rejestry są uŜywane do adresowania, lub jako tymczasowe rejestry dla danych. Rejestr Y nie jest nigdy automatycznie przenoszony na stos. W obsłudze przerwania naleŜy uwzględniać przenoszenie na i ze stosu uŜywając rozkazów POP i PUSH. Licznik rozkazów (PC) Licznik rozkazów jest 16-bitowym rejestrem uŜywanym do przechowywania adresu następnej instrukcji, która będzie wykonana przez mikrokontroler w następnym kroku. Rejestr ten jest automatycznie odświeŜany po wykonaniu kaŜdej kolejnej instrukcji. 16-bitowy licznik rozkazów pozwala zaadresować do 64kB pamięci. Wskaźnik stosu (SP) Wskaźnik stosu jest rejestrem 16-bitowym. Sześć najmniej znaczących bitów zawiera adres następnej wolnej komórki stosu. Dziesięć najbardziej znaczących bitów jest zarezerwowanych dla przyszłych rozszerzeń rodziny ST72. Stos jest uŜywany do przechowywania adresów powrotnych przy wywoływaniu podprocedur lub obsługi przerwań. TakŜe uŜytkownik moŜe skorzystać ze stosu uŜywając rozkazy POP i PUSH. Po resecie mikrokontrolera, lub po instrukcji RSP, wskaźnik stosu jest ustawiany na ostatnią maksymalną wartość. Wskaźnik jest dekrementowany, gdy dane zostają przenoszone na stos, lub inkrementowany, gdy są z niego odczytywane. Gdy zostanie osiągnięta graniczna dolną wartość stosu (stos zostanie przepełniony), wtedy wskaźnik ponownie będzie wskazywał na maksymalną wartość. W tym przypadku wcześniej przeniesione dane zostaną nadpisane, a więc utracone. Wywołanie podprocedury powoduje przeniesienie na stos 2 bajtów, a obsługa przerwania 5 bajtów. Rejestr statusu CC 7 6 5 4 3 2 1 0 1 1 1 H I N Z C Rejestr statusu (condition code) jest rejestrem 5-bitowym, który sygnalizuje wynik działania instrukcji właśnie wykonanej. Bity rejestru statusowego mogą być w programie uŜytkownika pojedyńczo testowane, by podjąć decyzję o dalszym działaniu programu, stosownie do wyniku ostatniej instrukcji. Wskaźnik przeniesienia połówkowego (H) Bit H jest ustawiany na wartość 1, kiedy następuje przeniesienie z jednej połówki bajtu na drugą (czyli pomiędzy bitami 3 i 4) podczas wykonywania operacji ADD i ADC. Bit H jest pomocny podczas wykonywania operacji arytmetycznych BCD. J. Emilianowicz Mikrokontrolery rodziny ST7 20 | Strona Zezwolenie na przerwanie globalne (I) Kiedy bit I jest ustawiony na wartość 1, wtedy wszystkie przerwania są zablokowane. Wyzerowanie tego bitu umoŜliwia przyjmowanie i obsługę przerwań. śądania obsługi przerwania przy ustawionym bicie I są zapamiętywane i obsłuŜone zaraz po wyzerowaniu bitu I (tylko pierwsze Ŝądanie obsługi dla kaŜdego źródła przerwań zostaje zapamiętane w postaci ustawienia flagi). Bit I moŜe być ustawiany/resetowany programowo lub automatycznie po resecie mikrokontrolera lub po rozpoczęciu obsługi przerwania. Wskaźnik wartości ujemnej (N) Kiedy jest ustawiony na wartość 1, to wskazuje Ŝe wynik ostatniej operacji arytmetycznej lub logicznej, czy operacji na danych, jest negatywny. Wskaźnik wartości zerowej (Z) Kiedy jest ustawiony na wartość 1, to wskazuje Ŝe wynik ostatniej operacji arytmetycznej lub logicznej, czy operacji na danych, jest zerowy. Przeniesienie/poŜyczka (C) Kiedy jest ustawiony na wartość 1 wskazuje, Ŝe podczas ostatniej operacji arytmetycznej wystąpiło przeniesienie lub poŜyczka. Na bit ten mają takŜe wpływ operacje testowania bitów, porównywania, przesuwania, obracania i ładowania (patrz: ADD, ADC, SUB, SBC, BTJF, BTJT, RRC, RLC, SRL, SLL, SRA). Przy operacjach testowania bitów, bit C jest kopią testowanego bitu. Mapa pamięci Mikrokontroler jest zdolny zaadresować 64kB pamięci i rejestrów I/O. W pamięci jest dostępne 128 bajtów rejestrów, 384 lub 512 bajtów pamięci RAM, do 256 bajtów pamięci EEPROM i 4 lub 8kB pamięci programu uŜytkownika. Przestrzeń pamięci RAM zawiera do 256 bajtów stosu, od 0100h do 01FFh. Komórki o najwyŜszym adresie zawierają wektory przerwań sprzętowych oraz programowych. WAśNE: Obszary pamięci oznaczone jako “Zarezerwowane” nie mogą być nigdy uŜywane. Próba dostępu do tej pamięci moŜe mieć nieprzewidywalne skutki w działaniu mikrokontrolera. 0000h Rejestry HW 007Fh 0080h 384B RAM 01FFh 027Fh 0200h 512B RAM Zarezerwowane 0BFFh 0C00h 256B EEPROM 0CFFh 0D00h Mikrokontrolery rodziny ST7 J. Emilianowicz Strona | 21 Zarezerwowane BFFFh C000h E000h FFDFh FFE0h 8kB pamięci programu 16kB pamięci program Wektor przerwań FFFFh Jak dla większości 8-bitowych mikrokontrolerów, szyna adresowa ST7 jest 16bitowa. To oznacza moŜliwość zaadresowania 65,536 bajtów. Jest to wielkość wystarczająca dla zdecydowanej większości aplikacji, realizowanych na mikrokontrolery ST7. By zwiększyć sprawność podrzelona na dwie części: – – programowania, adresowanla przestrzeń została adresy z zakresu od 0 do 255 (0FFh) są nazywane „stroną zerową”, a dostęp do nich realizowany jest przez adresowanie 8-bitowe, reszta pamięci, od 256 (80h) do 65,535 (0FFFFh) jest obsługiwana przez adresowanie 16-bitowe. UŜywanie strony zerowej doskonale przyspiesza wykonywanie kodu programu przy częstym dostępie do pamięci, gdy dane są ulokowane w zakresie strony zerowej. Dodatkowo w tej pamięci są umieszczone wszystkie rejestry I/O. Rejestry specjalne Adres 0000h 0001h 0002h 0004h 0005h 0006h 0008h 0009h 000Ah 000Ch 000Dh 000Eh 0010h 0011h 0012h 0014h 0015h 0016h 0020h 0021h 0022h 0023h 0029h 002Ah J. Emilianowicz Blok Port A Port B Port C Port D Port E Port F SPI MCC WDG Rejestr PADR PADDR PAOR PBDR PBDDR PBOR PCDR PCDDR PCOR PDDR PDDDR PDOR PEDR PEDDR PEOR PFDR PFDDR PFOR MISCR1 SPIDR SPICR SPISR MCCSR WDGCR Opis Dane Kierunek Opcje Dane Kierunek Opcje Dane Kierunek Opcje Dane Kierunek Opcje Dane Kierunek Opcje Dane Kierunek Opcje Rejestr specjalny 1 Dane Konfiguracja Status Zegar / Rejestr statusowy Watchdog Mikrokontrolery rodziny ST7 22 | Strona 002Bh 002Ch 0031h 0032h 0033h 0034h 0035h 0036h 0037h 0038h 0039h 003Ah 003Bh 003Ch 003Dh 003Eh 003Fh 0040h 0041h 0042h 0043h 0044h 0045h 0046h 0047h 0048h 0049h 004Ah 004Bh 004Ch 004Dh 004Eh 004Fh 0050h 0051h 0052h 0053h 0054h 0055h 0057h 0070h 0071h Mikrokontrolery rodziny ST7 EEPROM TIMER A TIMER B SCI ADC CRSR EECSR TACR2 TACR1 TASR TAIC1HR TAIC1LR TAOC1HR TAOC1LR TACHR TACLR TAACHR TAACLR TAIC2HR TAIC2LR TAOC2HR TAOC2LR MISCR2 TBCR2 TBCR1 TBSR TBIC1HR TBIC1LR TBOC1HR TBOC1LR TBCHR TBCLR TBACHR TBACLR TBIC2HR TBIC2LR TBOC2HR TBOC2LR SCISR SCIDR SCIBRR SCICR1 SCICR2 SCIERPR SCIETPR ADCDR ADCCSR Zegar, reset, zasilanie EEPROM Rejestr 2 licznika A Rejestr 1 licznika A Rejestr statusowy licznika A Rejestr HIGH wejścia zapamiętującego 1 licznika A Rejestr LOW wejścia zapamiętującego 1 licznika A Rejestr HIGH wyjścia porównującego 1 licznika A Rejestr LOW wyjścia porównującego 1 licznika A Licznika A (HIGH) Licznika A (LOW) Rejestr HIGH alternatywnego licznika A Rejestr LOW alternatywnego licznika A Rejestr HIGH wejścia zapamiętującego 2 licznika A Rejestr LOW wejścia zapamiętującego 2 licznika A Rejestr HIGH wyjścia porównującego 2 licznika A Rejestr LOW wyjścia porównującego 2 licznika A Rejestr specjalny 2 Rejestr 2 licznika B Rejestr 1 licznika B Rejestr statusowy licznika B Rejestr HIGH wejścia zapamiętującego 1 licznika B Rejestr LOW wejścia zapamiętującego 1 licznika B Rejestr HIGH wyjścia porównującego 1 licznika B Rejestr LOW wyjścia porównującego 1 licznika B Licznika B (HIGH) Licznika B (LOW) Rejestr HIGH alternatywnego licznika B Rejestr LOW alternatywnego licznika B Rejestr HIGH wejścia zapamiętującego 2 licznika B Rejestr LOW wejścia zapamiętującego 2 licznika B Rejestr HIGH wyjścia porównującego 2 licznika B Rejestr LOW wyjścia porównującego 2 licznika B Rejestr statusowy Dane Prędkość Konfiguracja 1 Konfiguracja 2 Preskaler odbiornika Preskaler nadajnika Dane Konfiguracja / Rejestr statusowy J. Emilianowicz Strona | 23 PAMIĘĆ Pamięć mikrokontrolerów rodziny ST7 oparta jest o architekturę Von Neumanna. Oznacza to, Ŝe jest tylko jedna przestrzeń adresowa, gdzie znajduje sie pamięć RAM, ROM, EEPROM, oraz rejestry sterujące mikrokontrolerem i peryferiami. Zaletą takiego rozwiązania jest to, ze dostęp do zmiennych, stałych i rejestrów specjalnych, realizowany jest tymi samymi instrukcjami. Rezerwacja zmiennych Pamięć RAM moŜe być rezerwowana dla zmiennych. SłuŜy do tego instrukcja asemblera ds.b, po której naleŜy podać ilość rezerwowanych bajtów. Etykieta będzie wskazywać pierwszy z zarezerwowanych bajtów. segment ’ram0’ count ds.b 1 temp_tab ds.b 4 ; rezerwacja jednego bajtu ; rezerwacja czterech kolejnych bajtów TuŜ po włączeniu mikrokontrolera zawartość zmiennych jest przypadkowa i naleŜy pamiętać o ich zainicjalizowaniu. init_variable ld A,#0 ld count,A ; przykład inicjalizacji zmiennej Inkrementacja i dekrementacja zmiennych dozwolona jest jedynie poprzez rejestry A, X i Y. increment_variable ; przykład inkrementacji zmiennej ld A,count inc A ld count,A Inicjalizacja stałych W pamięci ROM moŜna definiować stałe, uŜywając instrukcji dc.b, po której naleŜy podać wartość stałej lub zestaw stałych oddzielonych przecinkami. Etykieta będzie wskazywać pierwszy z zainicjalizowanych bajtów. segment ’rom’ correct dc.b 12 ; definicja stałej o wartości 100 table dc.b $A0,$A1 ; definicja tablicy o dwóch bajtach A0 i A1 message dc.b ” START SYSTEMU ” ; definicja tablicy o 16 bajtach, ; wypełniona kodami ASCII J. Emilianowicz Mikrokontrolery rodziny ST7 24 | Strona Stałe umieszczone są w pamięci programu i moŜna je jedynie czytać. ... ld A,correction ... add A,correction ... ; odczytanie do akumulatora ; dodanie do akumulatora wartości korekcji Przypisanie wartości Inicjalizowane stałe zajmują miejsce w pamięci programu. Jest to rozwiązanie bardzo wygodne przy inicjalizowaniu duŜych tablic. W przypadku wartości jednobajtowych moŜna skorzystać z dyrektywy equ, przypisującej wartość do etykiety. lab1 equ $12 ... ld A,#lab1 ; załadowanie akumulatora wartością $12 MoŜna przypisać takŜe wartość dwubajtową i przy dostępie do niej wskazać, która część nas interesuje, starsza czy młodsza. lab2 equ $1234 ... ld A,#lab2.h ld A,#lab2.l ; załadowanie akumulatora wartością $12 ; załadowanie akumulatora wartością $34 Dostęp do tablic Przy dostępie do tablic naleŜy wykorzystać adresowanie indeksowe, gdzie indeks określa, który bajt względem etykiety naleŜy odczytać. segment ’rom’ message dc.b ” START SYSTEMU ... ” ; definicja tablicy o 16 bajtach, odczyt_tablicy ld A,(message,X) ... Przy odczycie indeksowym naleŜy zainicjować wstępną wartość indeksu oraz w kolejnych pętlach zwiększać jego wartość. Mikrokontrolery rodziny ST7 J. Emilianowicz Strona | 25 segment ’rom’ message dc.b ” START SYSTEMU ... ” ; definicja tablicy o 16 bajtach, ld X,#0 odczyt_tablicy ld A,(message,X) inc X ... jp odczyt_tablicy ... J. Emilianowicz Mikrokontrolery rodziny ST7 26 | Strona STEROWANIE PROGRAMEM Skoki i wywołania bezwarunkowe Skoki bezwarunkowy jp i bezwarunkowy relacyjny jra realizują skok pod etykietę wskazaną w rozkazie. Są to skoki bez zachowywania adresu powrotu. ... jp dodawanie ... ... dodawanie ... Wywołania bezwarunkowe call i bezwarunkowe relacyjne callr realizują skok pod etykietę wskazaną w rozkazie. Ponadto przed skokiem na stosie odkładany jest adres następnego rozkazu pod wywołaniem, czyli adres powrotu. Powrót realizowany jest po napotkaniu rozkazu ret. ... call dodawanie ... ... dodawanie ... ret ... Skoki warunkowe Na liście rozkazów mikrontrolera ST7 znajduje się grupa skoków warunkowych. Przy spełnionym warunku realizowany jest skok pod wskazaną etykietę, natomiast przy niespełnionym warunku przejście do następnego rozkazu. PoniŜej zamieszczono tablicę ze skokami warunkowymi. Mikrokontrolery rodziny ST7 J. Emilianowicz Strona | 27 Rozkaz JRNM JRM JRPL JRMI JRNE JREQ JRNC JRC JRNH JRH JRUGT JRULE JRUGE JRULT Znaczenie Not Interrupt Mask Interrupt Mask Plus Minus Not Equal Equal Not Carry Carry Not Half-Carry Half-Carry Unsigned Greater Then Unsigned Lower or Equal Unsigned Greater or Equal Unsigned Lower Than Symbol >=0 <0 <>0 = > <= >= < Warunek I=0 I=1 N=0 N=1 Z=0 Z=1 C=0 C=1 H=0 H=1 (C lub Z)=0 (C lub Z)=1 C=0 C=1 ... call opoznienie ... opoznienie ld A,#0 opoznienie_petla dec A jrne opoznienie_petla ret ;sprawdzenie, czy odliczono juŜ do zera Testowanie bitów i skoki warunkowe Rozkazy btjt i btjf realizują testowanie wskazanego bitu i w zaleŜności od wyniku testowania skok pod wskazaną etykietę, lub przejście do następnego rozkazu. Rozkaz btjt (bit test and jump if true) realizuje skok dla „1”, natomiast btjf (bit test and jump if false) realizuje skok dla „0”. ; klawisz znajduje się na pinie PB0 ; klawisz wciśnięty zwiera pin do masy (0) ; klawisz puszczony podaje na pin zasilanie (1) J. Emilianowicz Mikrokontrolery rodziny ST7 28 | Strona sprawdz_klawisz btjf PBDR,#0,klawisz_wcisniety ... ... klawisz_wcisniety ... Korzystając ze skoków warunkowy naleŜy bardzo ostroŜnie dobierać warunki i etykiety do skoków. PoniŜej przedstawiony jest algorytm, realizujący prostą funkcję zmiany stanu leda na przeciwny. Jeśli led był włączony wyłączenie go, jeśli wyłączony włączenie. Lewy algorytm poniŜej jest algorytmem poprawnym, skok dla warunku spełnionego jest skokiem długim, omijającym fragment programu dla warunku niespełnionego. Natomiast prawy algorytm jest błędny, poniewaŜ dla warunku niespełnionego i spełnionego następuje wykonywanie rozkazów zaraz pod rozkazem testowania. PoniŜej przedstawione są fragmenty programu dla prawidłowego i nieprawidłowego algorytmu. sprawdz_leda btjt PBDR,#7,wylacz_leda wlacz_leda ... wylacz_leda ... Mikrokontrolery rodziny ST7 sprawdz_leda btjt PBDR,#7,wlacz_leda wlacz_leda ... wylacz_leda ... J. Emilianowicz Strona | 29 DZIAŁANIA ARYTMETYCZNE Dodawanie i odejmowanie Dodawanie i odejmowanie realizuje się rozkazami add oraz sub. Dodawać i odejmować moŜna jedynie do i od rejestru A. Tam teŜ będzie znajdować się wynik. dodawanie ld A,zmienna1 add A,zmienna2 sub A,#3F ld wynik,A ; ; ; ; przygotowanie pierwszej wartości dodanie drugiej wartości odjęcie wartości 3F zapamiętanie wyniku Przy operacjach wielobajtowych naleŜy uwzględnić przeniesienie lub poŜyczkę. Pomagają w tym rozkazy adc oraz sbc. PoniŜej znajduje się przykład dodawania dwubajtowego. ; liczba 1 w zmiennych zmienna1_h i zmienna1_l ; liczba 2 w zmiennych zmienna2_h i zmienna2_l ; wynik w zmiennych wynik_h i wynik_l dodawanie_dwubajtowe ld A,zmienna1_l add A,zmienna2_l ; dodanie młodszych części ld wynik_l,A ; zapamiętanie młodszej części wyniku ld A,zmienna2_h adc A,zmienna2_h ; dodanie starszych części ld wynik_h,A ; zapamiętanie starszej części wyniku MnoŜenie MnoŜenie realizuje się rozkazem mul. Wynik mnoŜenia jest 16-bitowy. mnozenie ld A,zmienna1 ld X,zmienna2 mul X,A ld wynik_l,A ld wynik_h,X ; ; ; ; ; przygotowanie pierwszej wartości przygotowanie drugiej wartości mnoŜenie zapamiętanie młodszej części wyniku zapamiętanie starszej części wyniku Dzielenie Mikrokontroler ST7 nie posiada rozkazu dzielenia. Operacje dzielenia naleŜy realizować programowo przez wielokrotne odejmowanie dzielnika od dzielnej oraz równoczesne zliczanie procedur odejmowania. PoniŜej przedstawiono prosty algorytm dzielenia przez 10. J. Emilianowicz Mikrokontrolery rodziny ST7 30 | Strona By zobrazować działanie procedury podzielmy wartość 23 przez 10 tak, aby otrzymać osobno 2 i 3. Licznik 0+1=1 1+1=2 2+1=3 3-1=2 Dzielna 23-10=13 13-10=3 3-10=-7 -7+10=3 Decyzja wartość odejmowania dodatnia, powtarzamy pętlę wartość odejmowania dodatnia, powtarzamy pętlę wartość odejmowania ujemna, cofamy ostatnią pętlę otrzymano wynik dzielenia, osobno 2 i 3 PoniŜej znajduje się przykładowy program dzielenia przez 10. ld A,#23 call dzielenie_przez_10 ... dzielenie_przez_10 ld X,#0 ; przygotowanie dzielnej ; wyzerowanie licznika pętli dzielenie_przez_10_petla inc X ; zwiększenie licznika pętli sub A,#10 ; odjecie 10 od dzielnej jrpl dzielenie_przez_10_petla ; powtórzenie, jeśli wynik dodatni dec X Mikrokontrolery rodziny ST7 ; zmniejszenie licznika pętli J. Emilianowicz Strona | 31 add A,#10 ; dodanie 10 do dzielnej ld dziesiatki,X ld jednosci,A ; zapamiętanie dziesiątek ilorazu ; zapamiętanie jedności ilorazu ret J. Emilianowicz Mikrokontrolery rodziny ST7 32 | Strona PORTY WEJŚCIA-WYJŚCIA KaŜdy port wejścia-wyjścia jest kontrolowany przez 3 rejestry: DR, DDR, OR (dla portu A będą to: PADR, PADDR, PAOR, itd.). - - Rejestr PxDR odpowiada za zapis do portu (w trybie wyjścia) i odczyt z niego (w trybie wejścia). Spełnia wiec równocześnie dwie funkcje. MoŜna sie więc domyśleć, ze zapis do niego w trybie wejścia nie da Ŝadnego efektu. Rejestr PxDDR odpowiada za kierunek portu, dla ”1” port będzie skonfigurowany jako wyjście, dla ”0” jako wejście. Rejestr PxOR to rejestr opcji, odpowiadający za dodatkowa konfiguracje. Dzięki temu mamy do dyspozycji dwie elektrycznie róŜne konfiguracje wejściowe, i tak samo dwie elektrycznie róŜne konfiguracje wyjściowe. JeŜeli naleŜy zasilić diodę LED, segment w wyświetlaczu 7-segmentowym, lub podać stan wysoki na bazę tranzystora, najodpowiedniejsza konfiguracja jest DDR=1 i OR=1. JeŜeli natomiast naleŜy odczytać stan podany z klawisza, czujnika, itd., najodpowiedniejsza konfiguracja jest DDR=0 i OR=0. Ponadto taka właśnie konfiguracja jest włączana po kaŜdym uruchomieniu zasilania, lub po sygnale resetu. Diody LED Do portów PB7, PB6 i PB5 są podłączone diody LED tak, jak to jest przedstawione na rysunku poniŜej. śeby dioda mogła zostać włączona naleŜy wykonać następujące kroki: - zapewnić odpowiednia konfiguracje portu: DDR=1, OR=1 a następnie: - by włączyć diodę podać stan wysoki na odpowiedni port: DR=1, by zgasić diodę podać stan niski na odpowiedni port: DR=0. port_init ld A,#%11100000 ld PBDDR,A ld PBOR,A ;przykład operacji na pojedynczych bitach led_on bset PBDR,#7 led_off bres PBDR,#7 Mikrokontrolery rodziny ST7 J. Emilianowicz Strona | 33 ;przykład operacji na całym bajcie led56_on_led7_off ld A,#%01100000 ld PBDR,A led56_off_led7_on ld A,#%10000000 ld PBDR,A Klawisze Do portów PA2, PF2, PB0 i PB4 są podłączone klawisze tak, jak jest przedstawione na rysunku poniŜej. śeby móc odczytać stan klawisza naleŜy wykonać następujące kroki: - zapewnić odpowiednią konfiguracje portu: DDR=0, OR=0 a następnie odczytać stan klawisza z odpowiedniego portu PxDR: - jeśli DR=1, to klawisz jest wyciśnięty, jeśli DR=0, to klawisz jest wciśnięty. port_init ld A,#%11100000 ld PBDDR,A ld PBOR,A ;przykład czytania stanu klawisza i sterowania diodą LED key_check btjf PBDR,#0,led_on led_off bres PBDR,#5 jp key_check led_on bset PBDR,#5 jp key_check J. Emilianowicz Mikrokontrolery rodziny ST7 34 | Strona Wyświetlacz 7-segmentowy Wyświetlacz 7-segmentowy jest podłączony tak, jak jest przedstawione na rysunku poniŜej (7 segmentów do 7 pinów PD7 do PD1, natomiast bazy tranzystorów do pinów PA3 i PA2). śeby móc wyświetlić informacje na jednym z wyświetlaczy naleŜy wykonać następujące kroki: - zapewnić odpowiednia konfiguracje portu D dla siedmiu segmentów: DDR=1, OR=1, zapewnić odpowiednia konfiguracje portu A dla baz tranzystorów: DDR=1, OR=1, a następnie: - - by przygotować odpowiedni segment podać stan wysoki (DR=1 wybranego pinu portu D) lub by nie był włączony stan niski (DR=0 wybranego pinu portu D), by wyświetlić przygotowana konfiguracje segmentów podać stan wysoki na bazę wybranego tranzystora: DR=1 portu A, lub by zgasić wyświetlaną informacje podać stan niski na bazę tego tranzystora: DR=0 portu A. port_init ld A,#%11111110 ld PDDDR,A ld PDOR,A ld A,#%00001100 ld PADDR,A ld PAOR,A ;wybranie segmentów do włączenia segm_init ld A,#%00111000 ld PDDR,A digit_on bset PADR,#2 digit_off bres PADR,#2 Mikrokontrolery rodziny ST7 J. Emilianowicz