dodatek A
Transkrypt
dodatek A
Wykład Mikrokontrolery i Mikrosystemy Dodatek A Środowiska IDE oraz programowanie mikrokontrolerów z pamięcią FLASH autor: dr inż. Zbigniew Czaja Gdańsk 2003 Mikrokontrolery i Mikrosystemy – Dodatek A 2 Spis treści 1. Mikrokontrolery oparte na rdzeniu 80C51/52................................................................ 5 1.1. Mikrokontrolery AT89Cxx firmy Atmel ..................................................................... 5 1.2. Mikrokontrolery AT89S53 i AT89S8252 programowalne w systemie (ISP) ............. 18 1.3. Mikrokontrolery serii ADuC8xx firmy Analog Devices ............................................. 20 2. Mikrokontrolery rodziny AVR firmy Atmel .................................................................. 23 2.1. Programowanie równoległe ......................................................................................... 23 2.2. Szeregowe przesyłanie danych .................................................................................... 26 2.3. Środowisko programistyczne AVR Studio firmy Atmel ............................................. 26 2.4. Programatory dla mikrokontrolerów rodziny AVR ..................................................... 29 3. Mikrokontrolery PIC16F87X firmy Microchip.............................................................. 31 3.1. Środowisko IDE MPLAB firmy Microchip ................................................................ 33 3.2. Programatory dla mikrokontrolerów PIC16F87X ....................................................... 36 3.1. Samo-programowanie pamięci FLASH....................................................................... 38 Mikrokontrolery i Mikrosystemy – Dodatek A 3 1. Mikrokontrolery oparte na rdzeniu 80C51/52 1.1. Mikrokontrolery AT89Cxx firmy Atmel Dla tej rodziny mikrokontrolerów używa się środowisk IDE typowych dla standardowych mikrokontrolerów 80C51/52. Niezliczona ilość zarówno asemblerów, kompilatorów języka C, symulatorów programowych, debugerów jest dostępna w Internecie. Są one dostarczane między innymi np. przez firmy: Keil Software, Ceibo, Avocet Systems, ChipTools, IAR, Tasking, Raisonance. Do rodziny AT89Cxx należą między innymi mikrokontrolery: AT89C1051, AT89C2051, AT89C4051, AT89C51, AT89C52. Poniżej pokazano schemat mikrokontrolera AT89C2051 z opisem sygnałów używanych w trybie programowania (rys. 1). Rys. 1. Opis sygnałów używanych w trybie programowania mikrokontrolera AT89C2051 Programowanie mikrokontrolerów serii AT89Cx051 opiera się na algorytmie równoległego programowania AT051. Charakterystyka algorytmu: • U5=5V tylko, Vpp=5V lub Vpp=12V. • Adres dla odczytu sygnatury to: 0, 1, 2. • Algorytm zawiera: - operację odczytu pamięci, - operację kasowania układu, - operację programowania i weryfikacji pamięci, - programowania bitów security, dwa bity tylko programowanie - bez odczytu. Na rys. 2 pokazano konfigurację połączeń przy użyciu algorytmu AT051. Z rys. widać, iż dane programujące pamięć FLASH ładowane i, podczas weryfikacji lub odczytu, odczytywane są za pośrednictwem portu P1. Sygnały sterujące podłączone są do portu P3. Mikrokontrolery i Mikrosystemy – Dodatek A 4 Rys. 2. Konfiguracja połączeń przy użyciu algorytmu AT051 Sygnały V6, V5, V4, V2 (linie 7, 5, 4 i 3 portu P3) służą do wyboru trybu pracy, co pokazano w tabeli 1. Linia PROG (P3.2) powoduje zatrzaśniecie (wprowadzenie/wyprowadzenie) danych na porcie P1. Impuls na linii X0 inkrementuje adres wskazujący na komórkę pamięci FLASH. Gotowość mikrokontrolera do przyjęcia kolejnego rozkazu jest wskazywana przez linię BUSY (P3.1). Tabela 1. Tryby pracy mikrokontrolera dla algorytmu AT051 Na rys. 3 pokazano schemat ogólny algorytmu. Składa się on z trzech cykli START, PROCEDURY i KONIEC. W pierwszym cyklu następuje odczyt sygnatury z linii V6, V5, V4, V2 i wejście w dany tryb pracy (tabela 1). Następnie (cykl PROCEDURY) wykonywana jest właściwa operacja, po czym, o ile chcemy skończyć programować, następuje zakończenie programowania mikrokontrolera. Mikrokontrolery i Mikrosystemy – Dodatek A 5 Rys. 3. Schemat ogólny algorytmu AT051 W konfiguracji programowania (rys. 4), układ scalony zawiera w sobie własny licznik adresowy. Impuls do inkrementacji tego licznika jest na zewnątrz, na pinie 5 = XTAL1. Pamięć programowa posiada orientację adresowania bajtowego. Rys. 4. Programowanie pamięci z weryfikacją Te mikroprocesory zawierają wewnętrzny licznik adresowy. Zerowanie licznika wykonuje się: RST := 0 a następnie RST := 1. Zerowanie następuje w czasie podnoszenia się ze stanu "L" do stanu "H" na RST. ("0" do "1", - logiczny signał <= 5V). Na rys. 5 pokazano procedurę kasowania pamięci programu. Mikrokontrolery i Mikrosystemy – Dodatek A 6 Rys. 5. Procedura kasowania pamięci programu Na kolejnych rysunkach przedstawiono pozostałe operacje wykonywane przez algorytm AT051. Rys. 6. Procedura odczytu danych z pamięci FLASH Mikrokontrolery i Mikrosystemy – Dodatek A Rys. 7. Procedura odczytu sygnatury Rys. 8. Programowanie bitu LB1 (dalsze programowanie jest zablokowane, odczyt pamięci jest możliwy) 7 Mikrokontrolery i Mikrosystemy – Dodatek A 8 Rys. 9. Programowanie bitów LB2 i LB1 (dalsze programowanie jak i odczyt z pamięci są zablokowane) Dzięki udostępnieniu przez firmę Atmel pełnej dokumentacji dotyczącej programowania mikrokontrolerów powstało wiele, w tym darmowych, programatorów jak i programów je obsługujących. Poniżej pokazano schemat ideowy jednego z najprostszych programatorów obsługiwanych między innymi przez program BlowIT lub pip04.exe (pod DOS). Rys. 10. Schemat prostego programatora dla mikrokontrolerów AT89Cx051 Mikrokontrolery i Mikrosystemy – Dodatek A 9 Innym rozwiązaniem może być programator pokazany na rys. 11. Rys. 10. Schemat prostego programatora dla mikrokontrolerów AT89Cx051 bez automatycznej obsługi sygnału RST Programator ten obsługiwany jest przez program, którego ekran pokazano na rys. 12. Rys. 12. Ekran przykładowego programu do programowania mikrokontrolerów AT89Cx051 Mikrokontrolery i Mikrosystemy – Dodatek A 10 Dla mikrokontrolerów serii AT89C51/52 (PDIP 40) korzysta się z równoległego algorytmu programowania AT51, podobnego do poprzedniego. Charakterystyka algorytmu: • U5=5V, • Vpp=5V lub Vpp=12V. • Adres dla odczytu sygnatury to: 30h, 31h, 32h (48,49,50 dziesiętnie.). • Algorytm zawiera: - operację odczytu pamięci, - operację kasowania układu, - operację programowania i weryfikacji pamięci, - programowania bitów security, trzy bity tylko programowanie - bez odczytu. Sygnał PROG ma tylko jeden impuls = 20 µs. Sygnały: A15, A14, A13, ... , A0 są przeznaczone dla wartości adresu dla pamięci programowej. Sygnały: D7, D6, ... , D0 to wartości bajtów wejście / wyjście. Inne sygnały niosą sobą dyrektywy sterujące operacją (rys. 13). Algorytm przewiduje adresowanie zorientowane bajtowo. Rys. 13. Konfiguracja połączeń dla programowania za pomocą algorytmu AT51 Mikrokontrolery i Mikrosystemy – Dodatek A 11 Tabela 2. Tryby pracy mikrokontrolera w trakcie programowania Na kolejnym rysunku pokazano schemat ogólny algorytmu AT51. Analogicznie do poprzedniego algorytmu składa się on z trzech cykli: START, PROCEDURY i KONIEC. Rys. 14. Schemat ogólny algorytmu AT51 Kolejne rysunki przedstawiają przebiegi dla poszczególnych rozkazów. Mikrokontrolery i Mikrosystemy – Dodatek A Rys. 15. Zapis bajta oraz jego odczyt w celu weryfikacji programowania Rys. 16. Odczyt bajtów z pamięci 12 Mikrokontrolery i Mikrosystemy – Dodatek A 13 Rys. 17. Programowanie tylko bitu LB1 (dalsze programowanie pamięci i realizacja MOVC z zewnętrznej pamięci dla odczytu wewnętrznej pamięci zablokowane, ale odczyt pamięci jest możliwy) Rys. 18. Programowanie bitów LB2 i LB1 (dalsze programowanie pamięci i realizacja MOVC z zewnętrznej pamięci dla odczytu wewnętrznej pamięci zablokowane oraz odczyt pamięci zablokowany) Mikrokontrolery i Mikrosystemy – Dodatek A Rys. 19. Programowanie bitów LB3, LB2 i LB1 (dalsze programowanie pamięci, odczyt pamięci i wykonanie zewnętrznego programu są zablokowane) Rys. 20. Kasowanie pamięci 14 Mikrokontrolery i Mikrosystemy – Dodatek A 15 Rys. 21. Odczyt sygnatury Bazując na przedstawionym algorytmie opracowano wiele dostępnych w Internecie schematów programatorów. Poniżej przedstawiono jeden z nich (rys. 22). Rys. 22. Schemat przykładowego programatora dla mikrokontrolerów serii AT89Cxx Mikrokontrolery i Mikrosystemy – Dodatek A 16 1.2. Mikrokontrolery AT89S53 i AT89S8252 programowalne w systemie (ISP) Mikrokontrolery te można programować za pomocą interfejsu SPI w systemie docelowym (ISP). Dzięki temu w bardzo prosty sposób można zrealizować programatory jak i oprogramowanie do nich. Oczywiście, mikrokontrolery te można programować w trybie równoległym, tak jak było to opisane dla mikrokontrolerów AT89Cxx. Na rys. 23 pokazano schemat mikrokontrolera AT89S53 w trybie programowania szeregowego. Rys. 23. Sygnały w trybie programowania szeregowego Jak widać do programowania wykorzystywany jest interfejs SPI (linie MOSI, MISO, SCK) oraz sygnał RST, który wraz z komendą umożliwiającą programowanie uprowadza mikrokontroler w tryb programowania. W tym trybie mikrokontroler musi być zasilany sygnałem zegarowym podłączonym do linii XTAL1 o częstotliwości od 3 do 24MHz, o ile nie jest do niego podłączony oscylator kwarcowy. Sygnał zegarowy SCK taktujący transmisję musi być przynajmniej 40 razy wolniejszy niż częstotliwość na XTAL1. Aby zaprogramować lub zweryfikować układ należy wykonać następującą sekwencję: 1. Włączyć napięcie zasilania i na linię RST podać stan „H”. 2. Umożliwić szeregowe programowanie przez wysłanie komendy Programing Enable za pomocą interfejsu SPI. 3. Wysłać odpowiednią komendę programującą i odczekać czas potrzebny na zaprogramowanie lub komendę związaną z odczytem (lista wszystkich komend zawarta jest w tabeli 3). 4. Na zakończenie programowania lub weryfikacji układu ustawić sygnał RST w stan niski, aby przejść w normalny tryb pracy. Jak wspomniano dane do i z mikrokontrolera są przesyłane za pomocą interfejsu SPI, dla którego przebiegi czasowe podano na rys. 24. Mikrokontrolery i Mikrosystemy – Dodatek A 17 Tabela 3. Lista instrukcji w trybie programowania mikrokontrolera AT89S53 Rys. 24.Przebiegi czasowe dla interfejsu SPI Dzięki przedstawionym właściwościom mikrokontrolera AT89S53 można zrealizować bardzo proste programatory. Przykład takiego programatora, obsługiwanego przez popularny program PonyProg (na licencji freeware, do ściągnięcia z Internetu) pokazano na rys. 25. Rys. 25. Uproszczona wersja programatora PonyProg dla mikrokontrolera AT89S53 Mikrokontrolery i Mikrosystemy – Dodatek A 18 1.3. Mikrokontrolery serii ADuC8xx firmy Analog Devices Firma Analog Devices produkuje mikrokontrolery serii ADuC8xx oparte na rdzeniu 80C52. Są one wyposażane między innymi w bogaty zestaw przetworników A/C i C/A począwszy od rozdzielczości 12-bitowej aż do 24-bitowej. Posiadają wbudowany programowy ładujący (loader) pozwalający na programowanie mikrokontrolera przez interfejs szeregowy UART przy prędkości 9600 bodów. Firma bezpłatnie dostarcza zintegrowane środowisko programistyczne IDE Devices MicroConventer QuickStart Development System. Składa się ono z następujących programów: • WSD (Windows Srial Downloader), • ADSIM (Analog Devices MicroConventer Simulator), • ASM51 (Cross Asambler), • WASP (Windows Analysis Software Package), • DeBugV2 (debugger). Program WSD odpowiada za załadowanie pamięci programu poprzez interfejs RS232 do uruchamianego mikrokontrolera. W programie możemy wyróżnić dwa standardowe okna. W pierwszym, podstawowym oknie WSD opisana jest aktualnie wykonywana operacja. Program umożliwia wybór: • okna konfiguracji, • resetu programatora, • załadowania programu, • uruchomienia załadowanego programu po jego załadowaniu do pamięci Flash. Rys.27. Podstawowe okno Windows Serial Downloader (WDS). Drugie okno konfiguracji, służy do zmiany konfiguracji parametrów pracy programu WDS. Mikrokontrolery i Mikrosystemy – Dodatek A 19 Rys. 28. Okno konfiguracji Windows Srial Downloader(WDS). ADSIM jest programowym symulatororem mikrokontrolerów rodziny ADuC. Symulator ADSIM jest aplikacją działającą w środowisku Windows pozwalającą w pełni symulować wszystkie peryferia mikrokontrolera z uwzględnieniem przetworników A/D i D/C. Posiada łatwy w użyciu i intuicyjny interfejs. Łączy wiele standardowych funkcji śledzenia programu miedzy innymi: • wielokrotny breackpoint, • tryb pracy krokowej, • zdolność do śledzenia wykonywanego kodu programu, • ustawianie punktów kontrolnych. Rys. 29. Przykładowe okno symulatora ADSIM. Mikrokontrolery i Mikrosystemy – Dodatek A 20 Programowanie mikrokontrolera następuje poprzez port szeregowy UART. W tym trybie programowania mikrokontroler nie musi zostać demontowany z uruchomianego urządzenia. Za obsługę tego typu programowania odpowiedzialny jest specjalny program znajdujący się w mikrokontrolerze - LOADER. Aby zaprogramować mikrokontroler w trybie szeregowym należy wejście PSEN mikrokontrolera zewrzeć do masy układu poprzez rezystor o wartości 1 kΩ, wyzerować (zresetować) mikrokontroler i załadować program z komputera poprzez interfejs RS232. Rys.30. Zalecany sposób programowania mikrokontrolera ADuC812. Rys. 31. Schemat ideowy interfejsu RS232. • • • • • • • Np. w celu zaprogramowania mikrokontrolera ADuC812 należy wykonać następujące kroki: na liniach portu P0 nie powinno być poziomów niskich, sygnały RX i TX powinny być podłączone do interfejsu UART mikrokontrolera, na linię EA mikrokontrolera podać stan niski, zewrzeć linię PSEN przez rezystor 1kΩ do masy (poziom zero na tym pinie w trakcie resetu wprowadza mikrokontroler w tryb programowania), zresetować mikrokontroler, uruchomić program wsd.exe. Powinien pojawić się komunikat w okienku programu wsd.exe informujący, iż nawiązano połączenie z mikrokontrolerem ADuC812, załadować plik *.hex do pamięci FLASH mikrokontrolera, Mikrokontrolery i Mikrosystemy – Dodatek A • • • 21 po poprawnym załadowaniu pliku, co zostaje potwierdzone odpowiednim komunikatem, na linii EA ustawić stan wysoki – mikrokontroler wykonuje instrukcje z wewnętrznej pamięci programu, nacisnąć klawisz RESET, program wsd.exe można już zamknąć, Mikrokontrolery i Mikrosystemy – Dodatek A 22 2. Mikrokontrolery rodziny AVR firmy Atmel Sposób programowania i uruchamiania rodziny mikrokontrolerów AVR zostanie przedstawiony na przykładzie mikrokontrolera AT90S8515. Mikrokontroler AT90S8515 oferuje 8K bajtów reprogramowalnej w systemie pamięci programu typu Flash oraz 512 bajtów pamięci danych typu EEPROM. AT90S8515 są dostarczane przez producenta z wewnętrzną pamięcią programu typu Flash oraz tablicami pamięci danych typu EEPROM w stanie wykasowania (zawartość = $FF) gotowymi do zaprogramowania. Układ jest przystosowany do wysokonapięciowego (12V) równoległego trybu programowania oraz niskonapięciowego szeregowego trybu programowania. Napięcie +12V jest używane jedynie jako sygnał odblokowania trybu programowania układu i poza tym nie spełnia żadnej innej znaczącej funkcji. Tryb programowania szeregowego układu jest bardzo dogodną formą przesyłania informacji do pamięci programu i danych układów AT90S8515 zagnieżdżonych wewnątrz systemu użytkownika. Tablice pamięci programu i danych wewnątrz AT90S4414/8515 są programowane bajt po bajcie w obydwu z trybów programowania. Dla pamięci EEPROM w trybie programowania szeregowego cykl auto-kasowania jest zapewniony wewnątrz operacji samotaktującego zapisu. Podczas programowania napięcia zasilające muszą być dla programowania szeregowego od 2,7 do 6V, a dla równoległego od 4,5 do 5,5V. 2.1. Programowanie równoległe. Końcówki XA1/XA0 wyznaczają procedurę działania w przypadku, gdy na wejściu XTAL1 pojawi się impuls dodatni. Tabela stanów pokazana jest w tabeli 4. Zmiana wartości sygnałów WR lub OE służy do wprowadzania komend programujących i weryfikujących (tabela 5). Listę komend podano w tabeli 6. Tabela 4. Tabela stanów dla linii XA1 i XA0 Tabela 5. Funkcje sygnałów w trybie programowania Mikrokontrolery i Mikrosystemy – Dodatek A 23 Tabela 6. Lista komend w trybie programowania Rys. 32. Schemat połączeń mikrokontrolera AT90S8515 w trybie programowania równoległego Aby wejść w tryb programowania równoległego należy postępować zgodnie z algorytmem: 1. podaj napięcie zasilające, 2. ustaw końcówki RESET i BS w stan „0” i odczekaj przynajmniej 100ns, 3. podaj na końcówkę RESET napięcie 11.5-12.5V. Jakakolwiek aktywność logiczna na końcówce BS w przeciągu 100ns od podania +12V na RESET będzie powodowała błąd przy wchodzeniu w tryb programowania. Następnie można wykonać jedną z komend. Dla przykładu wykonanie komendy Chip Erase – kasowanie układu - spowoduje wykasowanie pamięci Flash i EEPROM oraz bitów blokady. Żaden z bitów blokady nie zostanie wcześniej skasowany dopóki pamięci Flash i EEPROM nie zostaną wykasowane do końca. Bity zabezpieczenia pozostaną nienaruszone. Komenda Chip Erase musi zostać wykonana przed ponownym programowaniem pamięci Flash lub EEPROM. Algorytm ładowania komendy „Chip Erase”: 1. ustaw XA1, XA0 w stan „10”. Odblokowuje to ładowanie komend, 2. ustaw BS=0, Mikrokontrolery i Mikrosystemy – Dodatek A 24 3. ustaw DATA na „1000 0000”. To jest komenda Chip Erase, 4. podaj na XTAL impuls dodatni. Zostanie załadowana komenda, 5. podaj na WR w przeciągu czasu tWLWH_CE impuls ujemny by wykonać komendę Chip Erase. Komenda Chip Erase nie generuje żadnej aktywności na końcówce RDY / BSY . Programowanie bitów blokady pamięci danych i programu. Mikrokontroler AT90S8515 oferuje dwa bity zabezpieczenia, które mogą pozostać nie zaprogramowane (wtedy mają stan ‘1’) lub też zaprogramowane (stan ‘0’). Znaczenie bitów obrazuje tabela 7. Bity blokady (Lock Bits) mogą być skasowane jedynie komendą kasowania całego układu (Chip Erase). Tabela 7. Tryby blokady Bity zabezpieczenia. Mikrokontroler AT90S8515 posiada dwa bity zabezpieczenia: SPIEN i FSTRT. • kiedy bit SPIEN jest zaprogramowany (ustawiony na ‘0’) dozwolone są operacje szeregowego programowania oraz kopiowania danych (odczytu zawartości układu). Domyślnie zaprogramowany (‘0’), • kiedy bit FSTRT jest zaprogramowany (ustawiony na ‘0’) wybrana zostanie opcja krótkiego czasu startu (short start-up time). Domyślnie nie jest zaprogramowany (‘1’) jednakże mikrokontrolery z bitem FSTRT zaprogramowanym na ‘0’ mogą być dostarczane na zamówienie. Do bitów zabezpieczenia nie ma dostępu w trybie szeregowego trybu programowania (Serial Programming Mode). Bity zabezpieczenia pozostają nienaruszone w przypadku wykonania komendy Chip Erase. Bity sygnatury – cyfrowego podpisu. Wszystkie mikrokontrolery firmy Atmel posiadają trzybajtowy kod sygnatury, który identyfikuje urządzenie. Kod ten może zostać odczytany zarówno w szeregowym jak i równoległym trybie odczytu. Trzy bajty sygnatury są ulokowane w oddzielnej przestrzeni adresowej. Dla układu AT90S8515(1) : 1. $000: $1E (wskazuje, że układ wyprodukowany został przez firmę Atmel) 2. $001: $93 (wskazuje na 8KB rozmiar pamięci Flash) 3. $002: $01 (wskazuje na układ AT90S8515, gdy bajt $001 sygnatury wynosi $93) Mikrokontrolery i Mikrosystemy – Dodatek A 25 (1) kiedy obydwa bity blokady są zaprogramowane (tryb 3 blokady) bity sygnatury nie mogą zostać odczytane w trybie szeregowym. Odczyt tych bitów w trybie szeregowym zwróci wartości $00, $01, $02. 2.2. Szeregowe przesyłanie danych. Obydwa obszary pamięci programu i danych mogą zostać zaprogramowane używając szyny SPI w momencie podciągnięcia końcówki RESET do masy (GND). Interfejs szeregowy składa się z końcówek SCK, MOSI (wejście szeregowe) i MISO (wyjście szeregowe) (rys. 33). Po ustawieniu RESET w stan niski najpierw należy wykonać instrukcję Programming Enable (programowanie dozwolone) zanim zostanie wykonana jakakolwiek z instrukcji programowania / kasowania. Rys. 33. Schemat połączeń mikrokontrolera AT90S8515 w trybie programowania szeregowego Dla pamięci EEPROM cykl autokasowania jest zapewniony w środku samotaktującej się instrukcji zapisu i nie ma potrzeby wykonywania instrukcji Chip Erase. Instrukcja Chip Erase zamienia każdą z komórek pamięci programu (Flash) i EEPROM na wartość $FF. Pamięć programu i EEPROM posiadają odrębne przestrzenie adresowe: • $0000 do $0FFF na pamięć programu. • $0000 do $01FF na pamięć EEPROM. Zegar zewnętrzny taktujący mikrokontroler podłączany jest do końcówki XTAL1. Gdy używamy generatora kwarcowego umieszcza się go między wyprowadzenia XTAL1 i XTAL2. Minimalny okres stanów wysokiego i niskiego dla wejścia zegara szeregowego (SCK) jest zdefiniowany następująco: Stan niski ! 2 * XTAL1 cykli zegara. Stan wysoki ! 2 * XTAL1 cykli zegara. 2.3. Środowisko programistyczne AVR Studio firmy Atmel Firma Atmel udostępnia na stronach www.atmel.com nieodpłatnie aplikacje AVR Studio 3.5 i 4 ułatwiające pisanie, kompilowanie programów dla mikrokontrolerów rodziny AVR. Pakiet zawiera asembler, ale umożliwia również podłączenie zewnętrznego kompilatora języka C. Mikrokontrolery i Mikrosystemy – Dodatek A 1. 2. 3. 4. 5. 6. 26 W skład AVR Studio 3.5 wchodzą następujące bloki: menager projektów, edytor tekstowy, kompilator asemblera, symulator procesorów, interfejsy obsługi układów uruchomieniowych, oprogramowanie programatora ISP. Menager projektów. Ułatwia zarządzanie istniejącymi projektami i tworzenie nowych. Nadzoruje pracę edytora tekstowego, kompilatora (przechwytuje jego komunikaty i wysyła do niego polecenia). Rys.34.Przykładowe okno managera projektu Kompilator. Po napisaniu kodu programu, w celu skompilowania, wciskamy klawisz F7, który uruchamia kompilator. Wynikiem jego działania jest okienko Project Output. Menager projektów automatycznie wybierze odpowiedni kompilator, w zależności od tego, czy projekt pisany jest w C, czy w asemblerze. W wyniku kompilacji pokaże się okno, jak na rysunku 35. Mikrokontrolery i Mikrosystemy – Dodatek A 27 Rys.35.Okno kompilatora. Prawidłowo skompilowany plik można za pomocą programatora wgrać bezpośrednio do mikrokontrolera, wykorzystując plik w formacie HEX, wygenerowany przez kompilator (rys. 36). Rys.36.Okno generacji pliku. Symulator programowy Napisany i skompilowany wcześniej kod można przetestować za pomocą programowego symulatora procesorów. Uruchomienie symulatora odbywa się poprzez wybranie polecenia Build and Run (rys. 37). Mikrokontrolery i Mikrosystemy – Dodatek A 28 Rys.37.Okno podglądu rejestrów głównych, układów we/wy procesora. W symulatorze dostępnych jest wiele opcji ustawienia pułapek programowych, zatrzymywania warunkowego programu itd. oraz możliwość bezpośredniej edycji wartości w poszczególnych rejestrach, pinach we/wy, komórkach pamięci i rejestrach procesora, do której to edycji uzyskujemy dostęp przez dwukrotne kliknięcie na danym obiekcie. Dzięki temu uzyskuje się możliwość bezpośredniego wpływania (online) na sposób wykonywania danego programu. Można symulować zaistnienie określonych warunków zewnętrznych (wywołanie przerwania itp). Interfejsy obsługi układów uruchomieniowych. Oprócz symulatora można wykorzstać również możliwość komunikacji między AVR Studio a układami uruchomieniowymi produkcji Atmel, dostępnej w wersji 3.55, na przykład komunikacji z modułami STK500, ICE10, ICE200 (Tools->...; rys.3.17). Oprogramowanie programatora ISP. AVR Studio posiada również własne oprogramowanie sterujące programatorem ISP. Jednakże wymaga ono programatora firmy Atmel lub zgodnego z nim. Możliwe jest jednak podstawienie zamiast oryginalnego oprogramowania programatora innego programu i wykorzystanie innego programatora. Aby z poziomu AVR Studio wywołać oprogramowanie programatora wciskamy ALT+F9 lub z poziomu menu wybieramy opcję Tools i AVR Prog. 2.4. Programatory dla mikrokontrolerów rodziny AVR W Internecie dostępnych jest wiele programatorów i oprogramowania do nich. Poniżej przedstawiono kilka wybranych programatorów. Mikrokontrolery i Mikrosystemy – Dodatek A 29 Rys. 38. Schemat ideowy programatora obsługiwanego przez oprogramowanie Atmel AVR ISP firmy Kanda Na rys. 38 pokazano programator obsługiwany przez oprogramowanie Atmel AVR ISP firmy Kanda. Jest to programator zrealizowany zgodnie ze standardem STK200. Programator należy podłączyć do złącza LPT komputera, kabel zakończony złączem IDC10 do złącza ISP modułu uruchomieniowego. Zasilanie programatora (+5V) pobierane jest z płytki laboratoryjnej (PIN 2). Firma Atmel wprowadziła wiele standardów programatorów, między innymi STK200, STK300 i STK500. Rys. 39. Schemat ideowy programatora obsługiwanego przez oprogramowanie PonyProg Kolejny programator (rys. 39) podłączany jest do portu szeregowego komputera PC. Jako stabilizator U1 może być wyłącznie użyty układ LM2936Z-5 firmy National Semiconductors lub jego odpowiednik. Programator jest obsługiwany przez popularny program PonyProg. Mikrokontrolery i Mikrosystemy – Dodatek A 30 3. Mikrokontrolery PIC16F87X firmy Microchip Mikrokontrolery PIC16F87X mogą być programowane w finalnym układzie (w mikrosystemie elektronicznym). Jest to realizowane za pomocą dwóch linii z zegarem i danymi oraz trzech: zasilanie, masa i napięcie programujące. Zatem użytkownik może zbudować urządzenie z zamontowanym nie zaprogramowanym mikrokontrolerem, poczym go wielokrotnie programować. Tryb programowania mikrokontrolera PIC16F87X pozwala na wpisanie do pamięci programu danych oraz programu użytkownika, danych pod specjalne lokacje typu ID i do rejestru konfiguracyjnego. Istnieją dwie metody programowania mikrokontrolera: • normalne programowanie – Algorytm 1 (dla napięć zasilania od 2,2V do 5,5V i napięcia programowania VPP wynoszącego 13V ±0,5V), • programowanie niskonapięciowe – Algorytm 2 (dla napięć zasilania od 4,5V do 5,5V), nazywane w skrócie LVP (Low Voltage ICSP, gdzie ICSP – In-Circuit Serial Programmable). W trybie programowania wykorzystuje się trzy linie portu B: RB3 (PGM) linia wejściowa wykorzystywana w trybie LVP, RB6 (CLOCK) wejście zegara, RB7 (DATA) wejście/wyjście danych oraz pin resetu MCLR służący do wyboru trybu programowania, VDD zasilanie i VSS masa. W tym trybie obszar programu rozszerza się z 8K (0000h do 1FFFh) do 16K (0000h do 3FFFh), przy czym pierwsza część służy do trzymania kodu programu i stałych, i tylko ona jest dostępna w normalnym trybie pracy. Druga część obszaru zwana pamięcią konfiguracyjną zawiera cztery rejestry indentyfikacyjne ID (adresy od 2000h do 2003h i 2006h) oraz rejestr konfiguracyjny (adres 2007h). Pamięć EEPROM jest mapowana od adresu 2100h, zatem zawartość, która ma się w niej znaleźć może być wprowadzona w trakcie programowania z pliku HEX. a) b) Rys. 40. Sposoby wejścia w tryb programowania: a) tryb normalny, b) tryb niskonapięciowy Jak pokazano na rys. 40a w normalny tryb programowania można wprowadzić mikrokontroler, jeżeli linie RB6 i RB7 są trzymane w stanie niskim podczas gdy napięcie na linii MCLR rośnie z VIL (0V) do VIHH (około 13V). W tym przypadku nie jest wykorzystywany pin RB3. Natomiast tryb programowania LVP (rys. 40b) uzyskuje się przez podanie na RB3 sygnału narastającego podczas gdy MCLR=0, a następnie zwiększenie na linii MCLR napięcia z VIL do VIH (VDD równe około 5V). Linie RB6 i RB7 również muszą być w stanie niskim. Mikrokontrolery i Mikrosystemy – Dodatek A 31 W obu przypadkach pozostałe linie mikrokontrolera są w stanie resetu, tzn. są liniami wejściowymi o wysokiej impedancji. Ponadto w trybie programowania linie RB6 i RB7 są wejściami Schmitta. Po wprowadzeniu w ten tryb licznik rozkazów PC jest ustawiony na 0. Rozkaz inkrementacji (increment address) będzie zatem zwiększał licznik o jeden. Aby przejść do pamięci konfiguracyjnej należy wykonać instrukcję ładowania konfiguracji (load configuration), która ustawia licznik PC na 2000h. Listę komend zestawiono w tabeli 8. Tabela 8. Zestawienie komend obsługi trybu programowania mk PIC16F873 Pin RB6 służy jako linia zegarowa, natomiast na linii RB7 szeregowo wprowadza się rozkaz oraz dane do zapisu lub wyprowadza się dany w przypadku odczytu. Dane na linii RB7 są wprowadzane na narastające zbocze sygnału zegarowego, a próbkowane opadającym zboczem. Aby wprowadzić komendę potrzeba sześć impulsów zegarowych, po których jak mają być przesyłane dane powinno być opóźnienie minimum 1µs. Następnie można wprowadzić dane (14 bitów). Zaczynają się one od bitu START („0”) i kończą bitem STOP („0”), co łącznie daje 16 bitów do przesłania. Rozkazy oraz dane są przesyłane od najmłodszego do najstarszego bitu. Na rys. 41 pokazano przykładowy diagram czasowy dla rozkazu Load Configuration. Rys. 41. Diagram czasowy rozkazu Load Configuration Zatem programowanie mk polega na wydawaniu odpowiednich rozkazów zgodnie z algorytmami zawartymi w dokumentacji mk. Np. aby wykasować pamięć programu należy wykonać kroki: 1. Wykonać komendę Load Data for Program Memory z daną 3FFFh, 2. Wykonać komendę Bulk Erase Setup1, 3. Wykonać komendę Bulk Erase Setup2, 4. Wykonać komendę Begin Erase Programming Cycle, Mikrokontrolery i Mikrosystemy – Dodatek A 32 5. Odczekać 8ms, 6. Wykonać komendę Bulk Erase Setup1, 7. Wykonać komendę Bulk Erase Setup2. 3.1. Środowisko IDE MPLAB firmy Microchip MPLAB jest zintegrowanym środowiskiem programistycznym (Integrated Development Environment) umożliwiającym pisanie, edytowanie, kompilowanie i symulowanie działań programów dla mikrokontrolerów PIC. Jeśli komputer, na którym zainstalowany jest pakiet MPLAB wyposażony jest dodatkowo w odpowiedni sprzęt, możliwe jest programowanie mikrokontrolerów (np.: programator PICSTART PLUS) lub emulowanie ich działania (np.: MPLAB-ICD) z poziomu programu. Dostępne są również inne programatory i emulatory. Pakiet PMLAB rozprowadzany bezpłatnie przez firmę Microchip. Najnowszą wersję pakietu można ściągnąć z serwera internetowego firmy: www.microchip.com. W skład pakietu wchodzą: - MPLAB Project Manager – menadżer projektu, który umożliwia zarządzanie plikami z jakich składa się projekt, - MPLAB SIM Software Simulator – symulator programowy, umożliwiający śledzenie działania programu, umożliwia korzystanie z pułapek programowych, podglądanie zawartości zmiennych, modyfikowanie stanów linii wejścia / wyjścia, - MPLAB Editor – edytor tekstowy, - MPASM Universal Macro Assembler – asembler, który umożliwia między innymi korzystanie z makr, kompilację warunkową, - MPLINK Linker – program, który pozwala na łącznie wielu modułów relokowalnych, tworzonych za pomocą asemblera lub kompilatora C w jednym pliku z danymi dla programatora, emulatora, symulatora, - MPLIB Librarian – program, który umożliwia tworzenie bibliotek z funkcjami do późniejszego wykorzystania w projektach. Wygodną formą przechowywania i archiwizacji wyników pracy związanych z danym zadaniem jest tworzenie „projektów”. Plikiem głównym jest wówczas plik z rozszerzeniem .pjt przechowujący informacje o stanie realizacji zadnia w momencie zamykania projektu lub całego programu MPLAB). Rys. 42. Okienko managera projektów W prosty sposób można skonfigurować kompilator. Służy do tego okno Node Properites pokazane na rys. 43. Mikrokontrolery i Mikrosystemy – Dodatek A 33 Rys. 43. Okienko Node Properites W polu Language Tool jest wybierany rodzaj kompilatora. Pole Description umożliwia: - określenie formatu pliku wyjściowego .hex – pole Hex Format (najczęściej używany jest format INHX8M). - włączanie lub wyłącznie generowania przez asembler pliku z listą błędów kompilacji, listingu i pliku typu cross referece zawierającego informacje o wszystkich zdefiniowanych w pliku źródłowym etykietach, tzn. w której linii została zdefiniowana i w których liniach programu występuje, - określenie poziomu generowania komunikatu o błędach i ostrzeżeniach ( warning level), - włączenie lub wyłącznie rozróżniania małych i dużych liter (case sensitive), - określenie domyślnego formatu stałych numerycznych (default radix), - rozwijanie makrodefinicji (macro expansion), - włącznie dostępu tabulacji (tab size). Dodatkowe polecenia można wpisać w pole Additional Command Line Options. Podczas pierwszego wywołania okna Node Properites MPLAB ustawia opcje domyślne, które w większości przypadków nie muszą być zmieniane. Należy pamiętać, że gdy w obszarze Hex Format nie zostanie wybrana żadna opcja to domyślnym będzie format INHX8M. MPLAB wraz z modułem ICD umożliwia programowanie mikrokontrolera, sprzętowy debuging i symulację programową. Jest to realizowane przez polecenia z menu Debug, które zarządzają symulowaniem i uruchamianiem programów w środowisku MPLAB. Na rys. 44 przedstawiono okienko Debug z rozwiniętym menu Run. Mikrokontrolery i Mikrosystemy – Dodatek A 34 Rys. 44. Okienko Debug. - - Poniżej przedstawiono opispoleceń: Run – Wykonanie polecenia Run (F9) wymaga aby istniał plik .hex. Wybranie tego polecenia powoduje uruchomienie symulacji wykonania programu. Reset – Polecenie Reset (F6) powoduje zerowanie kontrolera (odpowiada to podaniu 0 na linię MCLR). Powoduje to wyzerowanie licznika rozkazów (0 do PC) i wpisanie do rejestrów SFR wartości początkowych. Step – Polecenie Step (F7) pozwala na krokową pracę symulatora. Jednocześnie podświetlana jest instrukcja, która jest aktualnie wykonywana. Można także oglądać zawartość rejestrów aktualizowanych po każdym kroku. Step Over – Polecenie Step Over (F8) umożliwia przejście do kolejnej instrukcji bez wizualizacji wchodzenia do podprogramu, które jednak są wykonywane. Po wykonaniu symulacji wykonania podprogramu symulator zatrzymuje się w następnej, widocznej na ekranie linii programu co sprawia wrażenie przeskoku. Halt –Polecenie Halt (F5) – symuluje zatrzymanie pracy procesora. Animate – Polecenie Animate (ALTF9) powoduje symulowanie wykonania programu z aktualizacją zawartości rejestrów w otwartych okienkach po każdej linii programu. Powoduje to spowolnienie przebiegu symulacji ale możemy śledzić zmiany w rejestrach itp. Obsługa programatora ICD jest realizowana za pomocą okienka pokazanego na rys. 45. Rys. 45. Okienko do obsługi emulatora sprzętowego ICD Natomiast opcje programowania ustawia się w oknie „ICD Options”, które należy wywołać naciskając przycisk Options.. (rys. 46). 35 Mikrokontrolery i Mikrosystemy – Dodatek A Rys. 46. Okno „ICD Options” z poprawnie ustawionymi opcjami Aby zaprogramować mikrokontroler nacisnąć na przycisk Program (rys. 45). Poczekać aż mikrokontroler zostanie zaprogramowany. W celu uruchomienia programu zawartego w mikrokontrolerze należy uruchomić debugger sprzętowy wykonując polecenie Debug > Run > Run (klawisz F9). 3.2. Programatory dla mikrokontrolerów PIC16F87X Moduł ICD Moduł ICD wykorzystuje możliwość debagowania w systemie (In-Circuit Debugging) mikrokontrolera PIC16F87X oraz możliwość programowania w systemie (In-Circuit Serial Programming (ICSP)). Funkcje te są realizowane przez oprogramowanie MPLAB IDE. Moduł ICD pokazany na rys. 47 oferuje następujące możliwości: • praca w czasie rzeczywistym oraz praca krokowa, • pułapki programowe, • In-Circuit debugging, • programowanie w systemie, • zakres napięć roboczych od 3V do 5,5V, • możliwość korzystania z napięcia zasilającego urządzenie docelowe, • częstotliwość pracy od 32kHZ do 20MHz, • korzystanie z oprogramowanie MPLAB IDE, • kompatybilność z oprogramowaniem Microsoft Windows®3.X, WindowsNT® oraz Windows 2000®, • interfejs RS-232. Windows95/98, Mikrokontrolery i Mikrosystemy – Dodatek A 36 Rys. 47. Schemat ideowy modułu ICD Aby korzystać z trybu debagowania należy pamiętać o tym, że: • Programowanie niskim napięciem (Low Voltage Programing) nie jest wykorzystywane przez MPLAB ICD. W trybie debagowania należy wyłączyć możliwość programowania niskim napięciem. • Piny RB6 oraz RB7 zarezerwowane są do programowania i debagowania w systemie. • Sześć lub siedem rejestrów ogólnego przeznaczenia zarezerwowanych jest dla trybu debagowania (opis w tabeli poniżej). • Początek obszaru pamięci programu (adres 0x0000) musi zawierać instrukcję NOP. • Ostatnich 256 lub 288 słów w pamięci programu jest zarezerwowanych dla kodu debagera (opis w tabeli poniżej). • Jeden poziom stosu jest niedostępny. MPLAB ICD używa następujących rejestrów i obszarów pamięci programu w mikrokontrolerach PIC16F87X: Mikrokontroler Używane rejestry Używany obszar pamięci programu PIC16F870/871/872 PIC16F873/874 PIC16F876/877 0x70, 0x0BB-0x0BF 0x06E0-0x07FF 0x6D,0x16D,0x0EB- 0x0EE0-0x0FFF 0x0F0, 0x1EB-0x1F0 0x70, 0x1EB-0x1EF 0x1F00-0x1FFF Programator JDM Programator ten jest obsługiwany przez program ic-prog, który to obsługuje przynajmniej 14 różnych typów programatorów zarówno do programowania mikrokontrolerów PIC16, PIC18 jak i mikrokontrolerów firmy Atmel. Mikrokontrolery i Mikrosystemy – Dodatek A Na rys. 48 i 49 pokazano przykładowe panele programu ic-prog. Rys. 48. Podstawowy panel programu ic-prog Rys. 48. Panel programu ic-prog w wyborem programowanego mikrokontrolera Na rys. 50 pokazano jedną z wersji programatora JDM: 37 Mikrokontrolery i Mikrosystemy – Dodatek A 38 Rys. 50. Schemat programatora JDM Ponadto istnieje wiele innych programatorów np. PICPROG czy JUPIC, do których schematy ideowe oraz oprogramowanie dostępne jest w Internecie. 3.3. Samo-programowanie pamięci FLASH Jedną z cech mikrokontrolerów PIC16F87X jest możliwość modyfikacji pamięci FLASH (pamięci programu) przez sam program zapisany w mikrokontrolerze. Odbywa się to za pomocą identycznego mechanizmu, jak mechanizm dostępu do pamięci EEPROM. Pamięć danych typu EEPROM i pamięć programu typu FLASH może być zapisywana i odczytywana podczas normalnej pracy mikrokontrolera. Operacja zapisu powoduje wymazanie poprzednio wpisanej danej przed zapisem nowej. Zapisywanie do pamięci danych EEPROM nie wpływa na operacje wykonywane przez układ. Zapisywanie do pamięci programu powoduje wstrzymanie wykonywania instrukcji przez mikrokontroler dopóki operacja zapisu nie dobiegnie końca. Pamięć programu nie jest dostępna podczas operacji zapisu. Oscylator oraz układy peryferyjne pracują wtedy bez przerwy. Przerwania są wykrywane i kolejkowane do czasu zakończenia operacji zapisu. Kiedy się ona zakończy następna instrukcja w programie jest wykonywana i jeśli wystąpiło przerwanie oraz jest ono aktywne wykonywany jest skok do wektora przerwań. Zapis i odczyt z obu rodzajów pamięci wykonywany jest pośrednio przez rejestry specjalne (SFR): EEDATA, EEDATH, EEADR, EEADRH, EECON1, EECON2. Odczyt z pamięci programu FLASH jest możliwy w każdym momencie pracy mikrokontrolera. Natomiast operacja zapisu powoduje zatrzymanie pracy mikrokontrolera, aż do momentu jej zakończenia. Rejestry EEADRH : EEADR przechowują 13-bitowy adres pamięci, do którego użytkownik chce mieć dostęp. Rejestry EEDATH : EEDATA przechowują 14-bitową daną, która ma być wpisana pod wskazany adres lub została spod tego adresu odczytana. Wartości w rejestrach EEADRH : EEADR muszą pokrywać się z dostępnym obszarem pamięci dla danego mikrokontrolera. Dla mikrokontrolera PIC16F873/874 wynosi on od 0000h do 1FFFh, a dla mikrokontrolera PIC16F876/877 od 0000h do 3FFFh. Adresy spoza 39 Mikrokontrolery i Mikrosystemy – Dodatek A zakresu nie są automatycznie przenoszone na początek obszaru pamięci np.: nie ma automatycznego przejścia między adresami 4000h i 0000h dla mikrokontrolera PIC16F877. Rejestr EECON1 (Adres 18Ch) R/W-x U-0 EEPGD bit 7 U-0 - U-0 - R/W-x R/W-0 WRERR WREN R/S-0 WR R/S-0 RD Bit 0 EEPGD: Bit wybory pamięci (danych lub programu): 1 = dostęp do pamięci programu, 0 = dostęp do pamięci danych (bit ten nie może być zmieniany podczas operacji zapisu lub odczytu). WRERR: Bit informujący o błędzie podczas zapisu: 1 = operacja zapisu została przerwana, 0 = operacja zapisu została ukończona. WREN : Bit zezwalający na zapis do pamięci EEPROM: 1 = zezwolenie na zapis, 0 = zakaz zapisu do pamięci EEPROM. WR : Bit kontrolny zapisu: 1 = inicjowanie operacji zapisu(bit ten może być ustawiona programowo, a zerowany może być tylko przez mikrokontroler), 0 = operacja zapisu do EEPROM została zakończona. RD : Bit kontrolny odczytu: 1 = inicjowanie operacji odczytu (bit ten jest zerowany przez mikrokontroler), 0 = odczyt nie jest inicjowany. Rejestry EECON1 i EECON2 Rejestr EECON1 jest rejestrem kontrolnym. Rejestr EECON2 jest rejestrem, który jest używany podczas operacji zapisu aby uniknąć przypadkowych błędów zapisu. Istniej kilka bitów kontrolnych, które są używane podczas operacji zapisu i odczytu pamięci danych EEPROM i pamięci programu FLASH. Bit EEPGD decyduje o tym, do którego rodzaju pamięci (danych / programu) będzie możliwy dostęp. Kiedy jest on równy zero EEPGD=0, wszystkie kolejne operacje będą wykonywane na pamięci danych EEPROM. Ustawienie bitu EEPGD = 1 powoduje, że kolejne operacje będą dotyczyć pamięci programu. Operacje odczytu są kontrolowane prze bit RD, który inicjuje odczyt z określonej lokalizacji. RD=1 oznacza, że dana z określonego obszaru będzie dostępna w rejestrach danych. Bit ten jest automatycznie zerowany po zakończeniu operacji odczytu. Jeśli odczytywana jest pamięć EEPROM, dane są dostępne w rejestrze EEDATA w następnym cyklu po ustawieniu bitu RD na 1. Operacje zapisu sterowane są przez dwa bity kontrolne WR i WREN oraz dwa bity statusowe WRERR i EEIE. Bit WREN uaktywnia operacje zapisu. Kiedy WREN=0 zapis będzie uniemożliwiony, dlatego WREN musi być ustawiony WREN=1 przez rozpoczęciem zapisu. Bit WR inicjuje operacje zapisu. Po jej zakończeniu bit ten jest automatycznie zerowany. Flaga EEIF jest używana do określenia kiedy operacja zapisu dobiegła końca. Musi ona być wyzerowana w programie przed ustawieniem bitu WR (WR=1). Mikrokontrolery i Mikrosystemy – Dodatek A 40 Kiedy bity WREN i WR są ustawione – równe jeden, określony w rejestrze EEADR adres pamięci danych EEPROM będzie wymazany po zapisie danej do rejestru EEDATA. Działanie te są wykonywane równolegle z normalną pracą mikrokontrolera. Po zakończeniu operacji zapisu flaga EEIF jest ustawiana (EEIF=1). Natomiast po ustawieniu bitów WREN i WR dla pamięci programu, spowoduje zatrzymanie wykonywania instrukcji przez mikrokontroler. Pożądany obszar pamięci zapisany w rejestrach EEADRH : EEDATA jest wymazywany, a następnie dane z rejestrów EEDATH : EEDATA są zapisywane. Po zakończeniu tych operacji flaga EEIF jest ustawiana, a mikrokontroler kontynuuje prace. Bit WRERR jest używany do wskazania, czy mikrokontroler był zresetowany podczas operacji zapisu. Bit ten powinien być wyzerowany po włączeniu zasilania (Power-on Reset). Powinien być on również sprawdzany po każdym resecie. Jest on ustawiany jeśli operacja zapisu zostanie przerwana przez sygnał MCLR lub gdy nastąpi reset od układu od WDT (WDT Time-out RESET) podczas normalnej pracy. Wtedy, po stwierdzenia przez użytkownika, że bit WRERR jest ustawiony, powinien on powtórzyć operacje zapisu. Zawartości rejestrów danych, adresów i bit EEPGD nie są zmieniane podczas resetu podczas normalnej pracy mikrokontrolera. Odczytywanie pamięci programu FLASH Odczytywanie pamięci programu jest bardzo podobne do odczytywania pamięci danych. Różnica polega na dodaniu dwóch instrukcji NOP po ustawieniu bitu RD (RD=1). Dwa dodatkowe cykle, które są wykonywane podczas realizacji instrukcji NOP są używane przez mikrokontroler do odczytu danych z pamięci programu i przesłania danych od rejestrów EEDATH : EEDATA. Dane są dostępne do odczytu po wykonaniu drugiej instrukcji NOP. Rejestry EEDATH i EEDATA będą przechowywały dane, aż do momentu rozpoczęcia się kolejnej operacji odczytu lub zapisania do nich danych przez program. Aby odczytać pamięć programu FLASH należy wykonać następujące kroki: • zapisać adres do rejestrów EEADRH:EEADR (należy się upewnić, że wpisany adres nie jest większy od dostępnego obszaru dla danego mikrokontrolera), • ustawić bit EEPGD – EEPGD=1, • ustawi bit RD – RD=1, • wykonać dwie instrukcje NOP , • odczytać dane z rejestrów EEDATH:EEDATA. Przykład fragmentu programu do odczytu pamięci programu: BSF BCF MOVF MOVWF MOVF MOVWF BSF BSF BSF NOP NOP BCF MOVF MOVWF MOVF MOVWF STATUS, RP1 STATUS, RP0 ADDRL, W EEADR ADDRH,W EEADRH STATUS, RP0 EECON1, EEPGD EECON1, RD STATUS, RP0 EEDATA, W DATAL EEDATH,W DATAH ; ;Bank 2 ;wpisz ;adres bajtu ;do odczytu ; ;Bank 3 ; ;rozpoczęcie operacji odczytu ; ; ;Bank 2 ;DATAL = EEDATA ; ;DATAH = EEDATH ; Mikrokontrolery i Mikrosystemy – Dodatek A 41 Zapisywanie do pamięci programu FLASH Operacja zapisywania do pamięci programu FLASH powoduje przerwanie wykonywania programu przez mikrokontroler. Oscylator oraz układy peryferyjne pracują bez przerwy. Przerwania są wykrywane i kolejkowane. Po zakończeniu operacji zapisu mikrokontroler kontynuuje wykonywanie programu od miejsca zatrzymania. Wyzerowanie bitu WRT zapobiega zapisaniu do pamięci programu jakichkolwiek danych. Aby zapisać daną do pamięci programu należy wykonać kilka kroków. Adres i dane do zapisu muszą być wpisane w odpowiednie rejestry. Aby uaktywnić możliwość zapisu należy ustawić bit EEPGD (EEPGD=1) i bit WREN. Bit WR może być ustawiony tylko jeśli bit WREN był ustawiony wcześniej. Bity te nie mogą być ustawione w tej samej instrukcji jednocześnie. Po zakończeniu zapisu bit WREN powinien być wyzerowany w programie. Zapis do pamięci programu musi być także poprzedzony sekwencją operacji, aby uniknąć błędów zapisu. Sekwencja ta składa się z pięciu instrukcji. Następnie muszą być wykonane dwie instrukcje NOP. Po zakończeniu operacji zapisu wykonywanie instrukcji rozpoczyna się od wykonania instrukcji po drugim NOP. Aby zapisać daną do pamięć programu FLASH należy wykonać następujące kroki: • zapisać adres do rejestrów EEADRH:EEADR (należy się upewnić, że wpisany adres nie jest większy od dostępnego obszaru dla danego mikrokontrolera), • zapisać do rejestrów EEDATH : EEDATA 14–bitową daną, która ma być zapisana do pamięci, • ustawić bit EEPGD, • ustawić bit WREN, • zablokować przerwania (jeśli aktywne), • wykonać sekwencję pięciu instrukcji aby uniknąć błędów: − zapisać 55h od rejestru EECON2 w dwóch krokach (najpierw do W potem do rejestru EECON2), − zapisać AAh do rejestru EECON2 w dwóch krokach (najpierw do W potem do rejestru EECON2), • ustawić bit WR (WR=1), • wykonać dwie instrukcje NOP, • uaktywnić przerwania (jeśli są używane), • wyzerować bit WREN. • Po zakończeniu operacji zapisu bit WR jest wyzerowany, a flaga EEIF jest ustawiona (EEIF=1). Przykład fragmentu programu do zapisu pamięci programu: BSF BCF MOVF MOVWF MOVF MOVWF MOVF MOVWF MOVF MOVWF BSF BSF BSF STATUS, RP1 STATUS, RP0 ADDRL, W EEADR ADDRH, W EEADRH VALUEL, W EEDATA VALUEH, W EEDATH STATUS, RP0 EECON1, EEPGD EECON1, WREN ; ;Bank 2 ;wpisanie adresu ;żądanego obszaru pamięci ; ; ;wpisanie danej ; ; ; ;Bank 3 ; ;uaktywnienie zapisu Mikrokontrolery i Mikrosystemy – Dodatek A BCF INTCON, GIE ;ten krok jest wymagany gdy aktywne są przerwania MOVLW MOVWF MOVLW MOVWF BSF NOP NOP 0x55 EECON2 0xAA EECON2 EECON1, WR ;zapisanie 55h do ;EECON2 ;zapisanie AAh do ;EECON2 ;rozpoczęcie operacji zapisu ; ; BSF BCF INTCON, GIE EECON1, WREN ;ten krok jest wymagany gdy używane są przerwania ;dezaktywowanie możliwości zapisu 42