Instrukcja do ćwiczenia 5
Transkrypt
Instrukcja do ćwiczenia 5
Mikroprocesory i mikrosterowniki Wydział Elektroniki Mikrosystemów i Fotoniki Politechniki Wrocławskiej 2014 Ćwiczenie nr 5 Program ćwiczenia: Komunikacja z pamięcią SRAM, Komunikacja z pamięcią EEPROM, Obsługa wyświetlacza LCD ze sterownikiem HD44780. Zagadnienia do przygotowania: Specyfika przestrzeni pamięci danych układu ATmega8535 Obsługa pamięci SRAM i EEPROM układu ATmega8535 Rejestry specjalne – wpisywanie wartości Specyfika układu HD44780 Wywołania podprogramów Inicjalizacja stosu System przerwań Programy obsługi przerwań 1 1 Mikroprocesory i mikrosterowniki Wydział Elektroniki Mikrosystemów i Fotoniki Politechniki Wrocławskiej 2014 1. Wprowadzenie – podstawowe informacje o pamięciach SRAM i EEPROM w ATmega8535 Z punktu widzenia możliwości wykonywania operacji zapis/odczyt rozróżnia się dwa podstawowe typy pamięci półprzewodnikowej: RAM i ROM. Pamięć RAM (ang. Random Access Memory) jest pamięcią o dostępie swobodnym, przeznaczoną do wielokrotnego zapisu i odczytu. Jest pamięcią ulotną, a więc wyłączenie zasilania skutkuje utratą zapisanych w niej danych. Pamięć ROM (ang. Read Only Memory) jest pamięcią tylko do odczytu. Jest pamięcią trwałą (nieulotną), co oznacza, że po wyłączeniu zasilania, dane w niej zapisane nie są kasowane. Oba wymienione wyżej typy pamięci zostały zaimplementowane w mikrokontrolerach AVR rodziny ATmega. 2. Pamięć SRAM W mikrokontrolerach AVR rodziny ATmega zaimplementowana została pamięć SRAM (ang. Static Random Access Memory), czyli statyczna pamięć RAM. Pamięć tego typu nie wymaga okresowego odświeżania, w przeciwieństwie do pamięci dynamicznej DRAM, oraz charakteryzuje się dużą szybkością działania. W układach AVR pamięć SRAM została włączona we wspólną przestrzeń adresową pamięci danych, razem z rejestrami roboczymi ogólnego przeznaczenia (ang. general purpose working registers) oraz rejestrami funkcyjnymi w przestrzeni wejścia-wyjścia (ang. I/O registers). Zostało to zilustrowane na rys. 1. W pamięci SRAM układu ATmega mogą być przechowywane dane (np. zmienne programowe) oraz stos mikrokontrolera, na który odkładane są między innymi adresy powrotu z podprogramów. Aby nie doszło do nadpisania informacji zawartych na stosie przez dane (i odwrotnie), stos powinien zajmować inną przestrzeń adresową w pamięci SRAM niż zapisane do niej dane. W praktyce najczęściej podstawę stosu umieszcza się na końcu pamięci SRAM (adres $025F), a zapis danych zaczyna się od najniższego adresu tej pamięci (adres $0060). 2 2 Mikroprocesory i mikrosterowniki Wydział Elektroniki Mikrosystemów i Fotoniki Politechniki Wrocławskiej 2014 pamięć danych adres $0000 rejestry robocze R0-R31 ... $001F $0020 rejestry funkcyjne (przestrzeń wejścia-wyjścia) ... $005F $0060 SRAM ... $025F Rys.1. Schemat pamięci danych w mikrokontrolerze AVR rodziny ATmega Wykorzystanie pamięci SRAM do przechowywania danych może być konieczne, gdy liczba rejestrów roboczych jest niewystarczająca. Dostęp do pamięci SRAM z poziomu języka asembler jest możliwy m. in. za pomocą instrukcji LDS i STS, które służą odpowiednio do odczytu i zapisu danych w komórce pamięci: LDS R16, $0103 // odczyt zawartości komórki pamięci SRAM o // adresie $0103 do rejestru R16 LDI R16, $23 // zapis wartości $23 w komórce pamięci SRAM o STS $0103, R16 // adresie $0103 Zamiast posługiwać się adresami konkretnych komórek pamięci, można zastosować zmienne programowe. Zmienne deklaruje się za pomocą dyrektywy BYTE. Przed deklaracją zmiennych konieczne jest wskazanie, że kolejne linijki będą odnosić się do pamięci danych, co wykonuje się przy użyciu dyrektywy DSEG. Za pomocą dyrektywy ORG ustala się adres komórki pamięci SRAM, w której ma być umieszczona pierwsza zadeklarowana zmienna. Dla każdej kolejnej zmiennej następuje inkrementacja adresu komórki. Deklarację zmiennych należy zakończyć dyrektywą CSEG, która powoduje powrót do operacji w pamięci programu. Fragment kodu zawierającego deklarację zmiennych przedstawiono poniżej. 3 3 Mikroprocesory i mikrosterowniki Wydział Elektroniki Mikrosystemów i Fotoniki Politechniki Wrocławskiej 2014 .DSEG // wskazanie, że dalsze operacje dotyczą pamięci danych .ORG $0060 // ustawienie adresu na początku pamięci SRAM z1: .BYTE 1 // deklaracja zmiennej z1 o rozmiarze 1 bajtu (pod // adresem $0060) z2: .BYTE 1 // deklaracja zmiennej z2 o rozmiarze 1 bajtu pod // adresem $0061) .CSEG // wskazanie, że dalsze operacje dotyczą pamięci // programu .ORG $0000 RJMP rst // ustawienie adresu na początku pamięci // programu i skok na początek programu rst: ... ... 3. Pamięć EEPROM Choć z definicji pamięć ROM służy tylko do odczytu danych, istnieje specjalny rodzaj tej pamięci, EEPROM (ang. Electrically Erasable Programmable Read Only Memory), którą można wielokrotnie elektrycznie programować i elektrycznie kasować (ale z ograniczoną liczbą cykli zapis/kasowanie). Wykorzystując ten rodzaj pamięci w mikrokontrolerze, można przechowywać dane, które są dostępne nawet po wyłączeniu zasilania. Mikrokontroler AVR ATmega8535 dysponuje pamięcią EEPROM o pojemności 512 B, w której każdą komórkę pamięci można zapisywać co najmniej 100 000 razy. Dostęp do pamięci EEPROM w układzie AVR ATmega jest możliwy z poziomu programu poprzez zapis i odczyt dedykowanych rejestrów funkcyjnych: 4 4 Mikroprocesory i mikrosterowniki Wydział Elektroniki Mikrosystemów i Fotoniki Politechniki Wrocławskiej 2014 EEARH i EEARL – rejestry adresowe (ang. EEPROM Address Registers). Bity od 8 do 0 określają adres komórki w pamięci EEPROM, na której ma zostać przeprowadzona operacja zapisu/odczytu: 15 14 13 12 11 10 9 8 bit - - - - - - - EEAR8 EEARH EEAR7 EEAR6 EEAR5 EEAR4 EEAR3 EEAR2 EEAR1 EEAR0 EEARL 7 6 5 4 3 2 1 0 bit EEDR – buforowy rejestr danych (ang. EEPROM Data Register). Zawiera dane, które mają być zapisane, lub które zostały odczytane z komórki pamięci EEPROM o adresie określonym przez rejestry EEARH i EEARL: 7 6 5 4 3 2 1 MSB 0 bit LSB EEDR EECR – rejestr sterujący (ang. EEPROM Control Register): 7 6 5 4 3 2 1 0 bit - - - - EERIE EEMWE EEWE EERE EECR Uproszczony opis znaczenia bitów rejestru EECR (dla poprawnej realizacji ćwiczenia konieczne jest zapoznanie się z pełnym opisem w nocie katalogowej ATmega8535): EERIE – ustawienie ‘1’ powoduje włączenie zezwolenia na przerwanie EEPROM Ready Interrupt, EEMWE – ustawienie ‘1’ włącza zezwolenie na zapis do pamięci EEPROM, wpisana wartość ‘1’ jest sprzętowo kasowana po 4 cyklach zegara, EEWE – ustawienie ‘1’ powoduje rozpoczęcie sprzętowej procedury zapisu danych z rejestru EEDR w komórce pamięci EEPROM (pod warunkiem, że od ustawienia bitu EEMWE na ‘1’ nie upłynęło więcej niż 4 cykle zegarowe). Sprzętowa procedura zapisu trwa 8448 cykli wewnętrznego oscylatora RC 1 MHz, niezależnie od aktualnego źródła taktowania mikrokontrolera, EERE – ustawienie ‘1’ powoduje odczytanie danych z komórki pamięci EEPROM o adresie wskazywanym rejestrem EEARH/EEARL do rejestru EEDR. 5 5 Mikroprocesory i mikrosterowniki Wydział Elektroniki Mikrosystemów i Fotoniki Politechniki Wrocławskiej 2014 Przed przystąpieniem do zapisu lub odczytu danych w pamięci EEPROM należy sprawdzić czy aktualnie nie trwa operacja zapisu. Można to zrobić przez sprawdzenie wartości bitu EEWE, który jest automatycznie zerowany po zakończeniu zapisu. Po załadowaniu bitu EEMWE wysoką wartością logiczną, jest on automatycznie (sprzętowo) zerowany po 4 cyklach zegarowych. Dlatego też aby dane z rejestru EEDR zapisać do pamięci EEPROM, należy ustawić znacznik EEMWE na ‘1’ nie wcześniej niż 4 cykle zegarowe przed ustawieniem bitu EEWE na ‘1’. Jak wspomniano wyżej sprzetowa procedura zapisu jednego bajta danych w pamięci EEPROM trwa kilka ms. Procedura ta realizowana jest niezależnie od pracy CPU, które już po 2 cyklach zegarowych (od momentu ustawienia bitu EEWE) wykonuje kolejne instrukcje programu, mimo że zapis do EEPROM jeszcze nie został zakończony. Ze szczegółowym opis procedury zapisu do EEPROM należy zapoznać się w nocie katalogowej mikrokontrolera. Odczyt danych z pamięci EEPROM zajmuje 4 cykle zegarowe. 4. Sterowanie wyświetlacza LCD Jednym z często obecnych elementów peryferyjnych w urządzeniach sterowanych mikroprocesorowo jest znakowy wyświetlacz LCD. W tym celu może być zastosowany prosty wyświetlacz alfanumeryczny ze sterownikiem zgodnym z HD44780. Wyprowadzenia sterownika wyświetlacza LCD dołącza się do dowolnych linii portów mikrokontrolera. Pracą wyświetlacza steruje się przez wysyłanie instrukcji (rozkazów) i danych do jego sterownika. Wykorzystuje się do tego następujące linie sygnałowe: RS – służy do wyboru rejestru sterownika wyświetlacza, w którym zostanie wykonany zapis/odczyt: ‘0’ – rejestr instrukcji, ‘1’ – rejestr danych, R/W– służy do wyboru kierunku transmisji: ‘0’ – zapis, ‘1’ – odczyt, E – zbocze opadające sygnału na tej linii uaktywnia transmisję, DB7…DB0 – służą do przesyłania bajtu zawierającego dane lub instrukcję. Sterownik może pracować z 8-bitową lub 4-bitową magistralą danych. 6 6 Mikroprocesory i mikrosterowniki Wydział Elektroniki Mikrosystemów i Fotoniki Politechniki Wrocławskiej 2014 Komunikację z wyświetlaczem należy rozpocząć od odpowiedniego ustawienia stanu linii RS, R/W i E. Przed transmisją bajtu powinno się ustawić linię E w stanie wysokim, a po wystawieniu informacji na linie DB7…DB0 zmienić stan linii E na niski (zbocze opadające wpisuje dane do sterownika). Aby mieć pewność co do zakończenia transmisji i wykonania przez sterownik poprzedniego polecenia, należy wprowadzić w programie opóźnienie (np. kilka ms) przed ustawieniem linii E ponownie w stan niski. Jest to związane z czasem potrzebnym na wykonanie instrukcji lub zapis danych w pamięci sterownika. Bajt zawierający dane lub instrukcję jest wysyłany przez linie DB7…DB0 odpowiednio do rejestru danych lub rejestru instrukcji sterownika wyświetlacza LCD. W bajcie danych zawarty jest kod znaku do wyświetlenia. Bajty z rejestru danych są zapisywane w kolejnych komórkach pamięci DDRAM (ang. Display Data RAM) sterownika. Pamięć ta może pomieścić maksymalnie 80 znaków (bajtów). Organizacja pamięci DDRAM sterownika w wypadku wyświetlacza z jedną linią jest następująca: pozycja na wyświetlaczu 1 2 3 adres pamięci DDRAM $00 $01 $02 .............. 78 79 80 $4D $4E $4F 38 39 40 Natomiast gdy wyświetlacz posiada dwie linie: pozycja na wyświetlaczu 1 2 3 adres pamięci DDRAM (linia 1) $00 $01 $02 ........... $25 $26 $27 adres pamięci DDRAM (linia 2) $40 $41 $42 ........... $65 $66 $67 W zależności od rozmiaru wyświetlacza (czyli maksymalnej liczby znaków wyświetlanych jednocześnie w jednej linii) oraz liczby linii, cała lub tylko część (tzw. okno) zawartości pamięci DDRAM może być wyświetlona równocześnie. 7 7 Mikroprocesory i mikrosterowniki Wydział Elektroniki Mikrosystemów i Fotoniki Politechniki Wrocławskiej 2014 Bajt instrukcji jest kodem rozkazu dla sterownika, zgodnie z poniższą tabelą: Tabela 1. Kody rozkazów dla sterownika LCD HD44780 Rozkaz Kod rozkazu DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Clear display 0 0 0 0 0 0 0 1 Return home 0 0 0 0 0 0 1 x* Entry mode set 0 0 0 0 0 1 I/D S Display on/off 0 0 0 0 1 D C B Cursor or display shift 0 0 0 1 S/C R/L x x Function set 0 0 1 DL N F x x Set CGRAM address 0 1 Set DDRAM address 1 Adres pamięci DDRAM Read busy flag & address BF Adres pamięci DDRAM Adres pamięci CGRAM * x – dowolna wartość Opis rozkazów sterownika: Clear display – wyczyszczenie wyświetlacza i ustawienie zapisu danych od adresu początkowego pamięci DDRAM (czyli w lewym górnym rogu wyświetlacza). Return home – ustawienie zapisu danych od adresu początkowego pamięci DDRAM. Entry mode set – ustawienie przesuwu kursora lub okna podczas zapisu lub odczytu danych: S = ‘0’ – przesuwanie się kursora, S= ‘1’ – przesuwanie się okna, I/D = ‘1’ – inkrementacja adresu znaku (przesuw w prawo), I/D = ‘0’ – dekrementacja adresu znaku (przesuw w lewo). Display on/off – włączanie/wyłączanie kursora i wyświetlacza: D = ‘1’ – włączenie wyświetlacza, D = ‘0’ – wyłączenie wyświetlacza, C = ‘1’ – włączenie kursora, C = ‘0’ – wyłączenie kursora, B = ‘1’ – miganie kursora, B= ‘0’ – brak migania kursora. 8 8 Mikroprocesory i mikrosterowniki Wydział Elektroniki Mikrosystemów i Fotoniki Politechniki Wrocławskiej 2014 Cursor or display shift – przesuwanie kursora lub okna (bez zmiany adresu w pamięci DDRAM): S/C = ‘0’ – przesuwa się kursor, S/C = ‘1’ – przesuwa się okno, R/L = ‘0’ – przesuw w lewo, R/L = ‘1’ – przesuw w prawo. Function set – ustawienie długości danych interfejsu, liczby wyświetlanych linii oraz rodzaju znaków: DL = ‘0’ – interfejs 4-bitowy, DL = ‘1’ – interfejs 8-bitowy, N = ‘0’ – jedna linia wyświetlacza, N= ‘1’ – dwie linie wyświetlacza, F= ‘0’ – znaki 5 x 7 punktów, F= ‘1’ – znaki 5 x 10 punktów. Set CGRAM address – ustawienie adresu pamięci RAM generatora znaków (ang. Character Generator RAM). W pamięci CGRAM użytkownik może zapisać nowe wzory znaków do wyświetlania. Set DDRAM address – ustawienie adresu komórki pamięci DDRAM, w której ma być dokonany zapis lub odczyt. Read busy flag & address – odczyt flagi zajętości (BF) i adresu pamięci DDRAM. Gdy linia R/W = ‘1’ a flaga BF = ‘1’, to sterownik znajduje się w trakcie wykonywania operacji. 9 9 Mikroprocesory i mikrosterowniki Wydział Elektroniki Mikrosystemów i Fotoniki Politechniki Wrocławskiej 2014 W ogólności do poprawnej pracy sterownik HD44780 wymaga inicjalizacji programowej! Należy zatem inicjalizację tę zaimplementować przed przystąpieniem do wyświetlania znaków: Rys.2. Algorytm inicjalizacji programowej sterownika HD44780 [2] 10 10 Mikroprocesory i mikrosterowniki Wydział Elektroniki Mikrosystemów i Fotoniki Politechniki Wrocławskiej 2014 Tabela 2. Kody znaków zapisanych w CG ROM sterownika LCD HD44780 [2] 11 11 Mikroprocesory i mikrosterowniki Wydział Elektroniki Mikrosystemów i Fotoniki Politechniki Wrocławskiej 2014 5. Przykładowe zadania do wykonania 1. a) Napisać krótki program, w którym następuje zapis i odczyt zmiennej programowej w pamięci SRAM. b) Napisać krótki program zawierający wywołanie podprogramu (np. za pomocą instrukcji RCALL), a następnie w podprogramie umieścić kod zapisujący dowolną wartość w komórce pamięci SRAM pod adresem $025F. Jak zmienia to przebieg programu i czym to jest wywołane? (zadanie opcjonalne) 2. Napisać program, w którym następuje zapis i odczyt danych w komórce pamięci EEPROM, według następującego schematu: Po resecie mikrokontrolera odczytywana jest wartość z komórki pamięci EEPROM, a następnie wyświetlana na diodach podłączonych do jednego z portów. Naciśnięcie przycisku powoduje, że do tej komórki pamięci wpisywany jest aktualny wynik przetwarzania (8 najstarszych bitów) ADC. Należy ustawić kilkakrotnie różną wartość napięcia wejściowego dla przetwornika ADC i sprawdzać czy po odłączeniu i ponownym włączeniu zasilania zapisana wartość w pamięci EEPROM jest wciąż przechowywana. 3. Napisać program sterujący wyświetlaczem LCD. Wyświetlić swoje imię (pierwsza linijka) i nazwisko (druga linijka). Należy skorzystać z wyświetlacza LCD ze sterownikiem HD44780 dostępnym na makiecie. 4. Napisać program umieszczający w EEPROM swoje imię i NAZWISKO w kodach wyświetlacza LCD ze sterownikiem HD44780, 5. Napisać program wyświetlający dane z EEPROM przygotowane programem z zadania nr 4 na wyświetlaczu LCD. 6. Zdefiniować nowe znaki na wyświetlaczu LCD (zadanie opcjonalne). 6. Literatura [1] Dokumetacja techniczna mikrokontrolera AVR Atmega 8535 http://www.atmel.com/images/doc2502.pdf [2] Dokumetacja techniczna sterownika HD44780 firmy Hitachi http://datasheets.maximintegrated.com/en/ds/MAX7219-MAX7221.pdf [3] R. Baranowski, Mikrokontrolery AVR Atmega w praktyce, Wydawnictwo BTC, Warszawa 2005 12 12