Spis tresci - castor.am.gdynia.plcastor.am.gdynia.pl/~dorra/pliki/instrukcja.pdf · Podczas RESET-u...

118
Technika mikroprocesorowa 1 Spis tresci Spis tresci................................................................................................................................................................................... 1 1. Wstep...................................................................................................................................................................................... 3 2. Architektura mikrokontrolera AT90S8515 ................................................................................................................. 3 2.1. Pamiec programu EPROM Flash .............................................................................................................................. 4 2.2. Pamiec danych SRAM ................................................................................................................................................. 5 2.3. Nieulotna pamiec danych EEPROM ......................................................................................................................... 6 3. Srodowisko programowania AVR Studio .................................................................................................................... 6 3.1. Zakladanie projektu w jezyku asembler .................................................................................................................... 6 3.2. Struktura programu w jezyku asembler.................................................................................................................... 9 3.3. Symulacje dzialania programu ................................................................................................................................11 4. Petle czasowe ......................................................................................................................................................................13 5. Porty mikrokontrolera ....................................................................................................................................................15 5.1. Przyklad obslugi portów wyjsciowych ....................................................................................................................18 5.2. Przyklad obslugi portów wejsciowych ....................................................................................................................20 6. Zródla przerwan mikrokontrolera ..............................................................................................................................23 7. Przerwania zewnetrzne ...................................................................................................................................................24 7.1. Przyklad przerwania zewnetrznego aktywowanego poziomem niskim .............................................................26 7.2. Przyklad przerwania zewnetrznego aktywowanego zboczem opadajacym......................................................29 8. TIMER 0 8-mio bitowy ....................................................................................................................................................31 8.1. Przyklad programowej obslugi przepelnienia timera ..........................................................................................32 8.2. Przyklad sprzetowej obslugi przepelnienia timera (wlaczenie przerwania timera) .......................................33 9. Korzystanie z dyrektyw asemblera..............................................................................................................................35 10. Sposoby adresowania pamieci RAM.........................................................................................................................37 10.1. Przyklady adresowania bezposredniego i posredniego .....................................................................................38 10.2. Przyklad zapisu i odczytu rejestru 16-sto bitowego...........................................................................................39 10.3. Zapis i odczyt bufora metoda adresowania posredniego ..................................................................................39 11. Wyswietlacz LCD w przestrzeni adresowej ............................................................................................................41 11.1. Zestaw komend inicjalizujacych wyswietlacz LCD ............................................................................................42 11.2. Przyklad wyswietlania znaków ..............................................................................................................................44 11.3. Przyklad pobierania stalych umieszczonych w kodzie programu ....................................................................45 12. Definiowanie polskich znaków na wyswietlaczu LCD..........................................................................................46

Transcript of Spis tresci - castor.am.gdynia.plcastor.am.gdynia.pl/~dorra/pliki/instrukcja.pdf · Podczas RESET-u...

Technika mikroprocesorowa

1

Spis tresci

Spis tresci...................................................................................................................................................................................1

1. Wstep......................................................................................................................................................................................3

2. Architektura mikrokontrolera AT90S8515.................................................................................................................3 2.1. Pamiec programu EPROM Flash..............................................................................................................................4 2.2. Pamiec danych SRAM .................................................................................................................................................5 2.3. Nieulotna pamiec danych EEPROM .........................................................................................................................6

3. Srodowisko programowania AVR Studio....................................................................................................................6 3.1. Zakladanie projektu w jezyku asembler....................................................................................................................6 3.2. Struktura programu w jezyku asembler....................................................................................................................9 3.3. Symulacje dzialania programu ................................................................................................................................11

4. Petle czasowe ......................................................................................................................................................................13

5. Porty mikrokontrolera ....................................................................................................................................................15 5.1. Przyklad obslugi portów wyjsciowych....................................................................................................................18 5.2. Przyklad obslugi portów wejsciowych....................................................................................................................20

6. Zródla przerwan mikrokontrolera..............................................................................................................................23

7. Przerwania zewnetrzne ...................................................................................................................................................24 7.1. Przyklad przerwania zewnetrznego aktywowanego poziomem niskim.............................................................26 7.2. Przyklad przerwania zewnetrznego aktywowanego zboczem opadajacym......................................................29

8. TIMER 0 8-mio bitowy....................................................................................................................................................31 8.1. Przyklad programowej obslugi przepelnienia timera ..........................................................................................32 8.2. Przyklad sprzetowej obslugi przepelnienia timera (wlaczenie przerwania timera).......................................33

9. Korzystanie z dyrektyw asemblera..............................................................................................................................35

10. Sposoby adresowania pamieci RAM.........................................................................................................................37 10.1. Przyklady adresowania bezposredniego i posredniego.....................................................................................38 10.2. Przyklad zapisu i odczytu rejestru 16-sto bitowego...........................................................................................39 10.3. Zapis i odczyt bufora metoda adresowania posredniego..................................................................................39

11. Wyswietlacz LCD w przestrzeni adresowej............................................................................................................41 11.1. Zestaw komend inicjalizujacych wyswietlacz LCD............................................................................................42 11.2. Przyklad wyswietlania znaków..............................................................................................................................44 11.3. Przyklad pobierania stalych umieszczonych w kodzie programu....................................................................45

12. Definiowanie polskich znaków na wyswietlaczu LCD..........................................................................................46

Technika mikroprocesorowa

2

12.1. Przyklad zapisu kodu znaku „c” do pamieci CGRAM sterownika LCD........................................................48 12.2. Przyklad wyswietlania tekstu z polskimi znakami zapisanymi w pamieci CGRAM......................................49

13. TIMER 1 16-sto bitowy................................................................................................................................................50 13.1. Przyklad wykorzystania trybu przechwytu TIMER-a 1 do pomiaru dlugosci impulsów.............................55

14. Pamiec EEPROM..........................................................................................................................................................58

15. Transmisja szeregowa UART......................................................................................................................................61

16. Szeregowy interfejs SPI................................................................................................................................................68 16.1. Tryby pracy interfejsu SPI ......................................................................................................................................70 16.2. Sterowanie interfejsem SPI.....................................................................................................................................71

17. Zegar czasu rzeczywistego DS1305 na magistrali SPI..........................................................................................73 17.1. Rejestry zegara czasu rzeczywistego DS1305.....................................................................................................74 17.2. Transfer danych po magistrali SPI.......................................................................................................................78 17.3. Przyklad konfiguracji magistrali SPI i nadawania bajtów...............................................................................79 17.4. Przyklad odczytu rejestru sekund zegara DS1305 po magistrali SPI.............................................................81 17.4. Przyklad zapisu danych do pamieci RAM zegara DS1305 z wykorzystaniem przerwania SPI..................82

18. Magistrala I2C ................................................................................................................................................................84

19. Pamiec EEPROM AT24CXX na magistrali I2C....................................................................................................87 19.1. Transmisja danych z pamiecia EEPROM AT24CXX po magistrali I2C........................................................88 19.2. Wybrane procedury transmisji danych (start, stop, zapis, odczyt slowa danych)........................................92 19.3. Przyklad zapisu slowa danych w pamieci AT24C04..........................................................................................95 19.4. Przyklad odczytu danych z pamieci AT24C02....................................................................................................96

20. Magistrala 1-wire............................................................................................................................................................98

21. Termometr cyfrowy DS18B20.................................................................................................................................. 100

22. Lista wybranych rozkazów....................................................................................................................................... 107 22.1. Rozkazy obslugujace stos..................................................................................................................................... 107 22.2. Rozkazy skoków..................................................................................................................................................... 107 22.3. Rozkazy dzialajace na rejestrach roboczych.................................................................................................... 110 22.4. Rozkazy dzialajace na rejestrach przestrzeni Input/Output........................................................................... 113 22.5. Rozkazy dzialajace na bitach .............................................................................................................................. 114 22.6. Bezposrednie adresowanie pamieci RAM......................................................................................................... 115 22.7. Posrednie adresowanie pamieci RAM............................................................................................................... 115

Technika mikroprocesorowa

3

1. Wstep Skrypt jest przeznaczony do praktycznego nauczania programowania mikrokontrolerów rodziny AVR firmy Atmel w jezyku asembler. W procesie dydaktycznym wykorzystano srodowisko AVR Studio oferowane bezplatnie przez firme Atmel wyposazone w kompilator i debugger do usuwania bledów programistycznych przez prowadzenia „wirtualnych” symulacji dzialania programu. Do sprawdzenia przygotowanych projektów studenci maja do dyspozycji zestawy uruchomieniowe EVB-503 Advanced firmy Propox z mikrokontrolerem AT90S8515 (lub ATMega8515). Programowanie mikrokontrolera w zestawie nastepuje po laczu szeregowym w systemie ISP (in system programing) lub po laczu JTAG. Wykorzystanie interfejsu JTAG umozliwia dodatkowo prowadzenie emulacji dzialania programu tj. obserwacji w czasie rzeczywistym stanu rejestrów mikrokontrolera, do którego zaladowano program wykonywalny. Zestaw EVB-503 w wersji Advanced posiada wyposazenie dodatkowe w postaci: 8 diod, 8 przycisków, zewnetrznej pamieci RAM 32kB, wyswietlacza LCD, buzzera, zegara czasu rzeczywistego DS1305 i pamieci AT45DB081B na magistrali SPI, zegara czasu rzeczywistego PCF8583 i pamieci EEPROM 24CXX na magistrali I2C.

Cykl nauczania przewiduje: poznanie zasad obslugi urzadzen peryferyjnych mikrokontrolera: portów, timerów,

interfejsów magistral UART, SPI, I2C, tworzenie projektów i prowadzenie symulacji w srodowisku AVR Studio, tworzenie programów w jezyku asembler z watkiem glównym i watkami bocznymi

(przerwaniami), ladowanie programów wykonywalnych, obserwacje dzialania programów w zestawie

uruchomieniowym. 2. Architektura mikrokontrolera AT90S8515

Uklad AT90S8515 jest 8- bitowym mikrokontrolerem CMOS malej mocy bazujacym

na architekturze AVR RISC. Wiekszosc rozkazów jest wykonywana w jednym cyklu zegarowym, co pozwala mikrokontrolerowi AT90S8515 na osiagniecie predkosci 1MIPS na MHZ. Po podlaczeniu zegara z kwarcem o czestotliwosci X MHz mikrokontroler wykonuje X Mega rozkazów na sekunde (cykl zegarowy = 1/X µs). Predkosc mikrokontrolera rosnie wprost proporcjonalnie do czestotliwosci kwarcu, lecz pociaga to za soba równiez wzrost poboru mocy ze zródla zasilajacego.

Rdzen mikrokontrolera AT90S8515 tworzy jednostka arytmetyczno- logiczna ALU i 32 rejestry robocze. Wszystkie 32 rejestry sa bezposrednio podlaczone do jednostki arytmetyczno- logicznej ALU zezwalajac na równoczesny dostep do dwóch niezaleznych rejestrów w czasie wykonywania jednego rozkazu w jednym cyklu zegarowym. Zapewnia to 10-krotny wzrost predkosci mikrokontrolera w stosunku do urzadzen zbudowanych w oparciu o architekture CISC.

W strukturze mikrokontrolera AT90S8515 mozna rozróznic nastepujace bloki: 8K bajtów pamieci programu typu Flash z mozliwoscia programowania szeregowego w ukladzie przez interfejs SPI, 512 bajtów nielotnej pamieci EEPROM, 512 bajtów ulotnej pamieci SRAM, 32 linie wejsciowe/wyjsciowe portów, 32 rejestry ogólnego przeznaczenia, zegar czasu rzeczywistego (RTC), trzy elastyczne timery pracujace m.in. w tryb ie porównawczym, jednostke obslugi przerwan wewnetrznych i zewnetrznych, modul transmisji szeregowej UART, uklad wewnetrznej kontroli wykonania programu Watchdog, port szeregowy SPI.

Technika mikroprocesorowa

4

Procesor AT90S8515 reaguje na trzy zródla przerwania RESET-u. § Obnizenie napiecia zasilajacego ponizej wymagana wartosc progowa § Impuls ujemny na linii RESET o czasie trwania nie krótszym niz 50ns § Przepelnienie timera wewnetrznego systemu nadzoru wykonania programu

WATCHDOG (przepelnienie to nastepuje, jesli program w okreslonym czasie nie przejdzie przez petle glówna)

Podczas RESET-u do wszystkich rejestrów przestrzeni I/O sa wpisywane wartosci poczatkowe, a program jest wykonywany od adresu $0000.

Rys.1. Architektura mikrokontrolera AT90S8515

Mikrokontroler moze pracowac w trzech trybach energooszczednych wybieranych

programowo. Tryb Idle zatrzymuje CPU utrzymujac dzialanie pamieci SRAM, timer/licznika, portu SPI i systemu przerwan. Tryb Power Down zachowuje zawartosc rejestrów, ale zatrzymuje oscylator i wszystkie funkcje mikrokontrolera az do kolejnego przerwania lub resetu. W trybie Power Save oscylator pracuje, podczas gdy pozostale funkcje sa zatrzymane. Mikrokontroler AT90S8515 zbudowano w architekturze Harvardzkiej , która przewiduje oddzielne przestrzenie adresowe i szyny adresowe dla pamieci programu i pamieci danych. Dodatkowo wydzielono pamieci nielotna danych EEPROM.

2.1. Pamiec programu EPROM Flash Mikrokontroler AT90S8515 posiada 8Kbajtów pamieci programu typu FLASH.

Wszystkie rozkazy mikrokontrolera sa 16 lub 32- bitowe, co implikuje organizacje pamieci Flash jako 4K slów 16 bitowych. Wytrzymalosci na przeprogramowanie wynosi co najmniej 1000 cykli zapisu/odczytu. Slowo adresowe pamieci Flash jest 12-sto bitowe co pozwala wykorzystac 4096 adresów do pamieci Flash. Pamiec Flash jest programowana elektrycznie

Technika mikroprocesorowa

5

szeregowo lub równolegle, przy czym za kazdym razem nalezy przeprogramowac cala pamiec.

Dostepne sa nastepujace sposoby programowania pamieci Flash:

Programowanie równolegle, które ze wzgledu na znaczna liczbe wykorzystanych linii przewaznie wymaga wyjecia mikrokontrolera z ukladu i umieszczenia go w podstawce programatora.

Programowanie szeregowe po magistrali ISP wykorzystuje 4 dedykowane linie wyjsciowe mikrokontrolera i jest przeprowadzone bez wyjmowania mikrokontrolera z ukladu.

Programowanie szeregowe JTAG wykorzystuje wewnetrznie wbudowany interfejs JTAG, który pozwala wyprowadzic na zewnetrzne lacze krawedziowe mikrokontrolera sygnaly z wybranych komórek pamieci oraz portów I/O. Interfejs JTAG jest wygodnym narzedziem do debuggowania programu wykonywalnego, poniewaz daje wglad w komórki pamieci na kazdym etapie wykonywania programu.

Programowania pamieci Flash mozna równiez dokonac z wykorzystaniem wbudowanego programu ladujacego zwanego bootloader’em rezydujacego w pamieci Flash. Program ladujacy bootloader moze korzystac z dowolnego interfejsu w celu pobrania pliku programu wykonywalnego, najczesciej jest to interfejs szeregowy UART lub interfejs JTAG. W procesorze AT90S8515 program ladujacy bootloader musi (przed wykorzystaniem) zostac zapisany w pamieci Flash przez uzytkownika w sektorze o najwyzszych adresach i rozmiarze ustalonym za pomoca bitów fuse.

2.2. Pamiec danych SRAM Dane ulotne (kasowane po zaniku napiecia zasilania) sa przechowywane w pamieci SRAM o bardzo krótkim czasie dostepu (zarówno w cyklu zapisu, jak i odczytu). Pamiec SRAM jest adresowana w trybie 16-bitowym, zatem procesor moze zaadresowac przestrzen o rozmiarze 216 = 65536 = $FFFF komórek pamieci. Organizacja pamieci RAM przedstawia sie nastepujaco: − W dolnej czesci pamieci RAM znajduja sie 32 8-bitowe rejestry robocze ogólnego

przeznaczenia z bezposrednim dostepem do ALU o czasie dostepu równym jednemu cyklowi zegarowemu. Daje to mozliwosc wykonywania operacji matematycznych w kazdym z powyzszych rejestrów. Rejestry robocze moga byc adresowane bezposrednio (przez podanie nazwy) lub jako lokacje przestrzeni adresowej z obszaru od $0000 do $001F. 6 sposród wymienionych 8-mio bitowych rejestrów roboczych zostalo sparowanych w 3 16-sto bitowe wskazniki do przestrzeni adresowej noszace nazwy X, Y oraz Z. Jeden z powyzszych wskazników (Z) sluzy do pobierania danych z tablic umieszczonych w kodzie zródlowym programu.

− Nad obszarem rejestrów roboczych umieszczono 64 bajtowa przestrzen rejestrów I/O obslugujacych moduly peryferyjne mikrokontrolera tj.: rejestry kontrolne, timerów i liczników, portów, przerwan itp. Rejestry I/O moga zostac zaadresowane bezposrednio (przez podanie nazwy) lub jako lokacje przestrzeni adresowej z obszaru od $0020 do $005F.

− Nad obszarem rejestrów I/O, pod adresami $0060 do $025F znajduje sie wewnetrzna pamiec SRAM przeznaczona do przechowywania danych o pojemnosci 512 slów 8-mio bitowych.

Technika mikroprocesorowa

6

Mikrokontroler AT90S8515 posiada 16-bitowa szyne adresowa i moze dodatkowo zaadresowac zewnetrzna pamiec RAM o pojemnosci 64kbajty. Bedzie ona widziana pod adresami $0260 do $FFFF.

Rys.2. Organizacja pamieci SRAM

2.3. Nieulotna pamiec danych EEPROM W strukturze wewnetrznej mikrokontrolera znajduje sie pamiec nieulotna EEPROM (zachowujaca dane po wylaczeniu napiecia zasilania) o objetosci 512 bajtów i dlugim kilku-milisekunowym cyklu zapisu bajtu danych. Pamiec EEPROM jest zorganizowana jako oddzielna przestrzen adresowa o adresach od 0 do 512. Mozna z niej odczytywac i zapisywac pojedyncze bajty, a wytrzymalosc pamieci EEPROM na przeprogramowanie wynosi co najmniej 100 000 cykli zapisu i odczytu.

3. Srodowisko programowania AVR Studio Srodowisko programowania AVR Studio jest darmowym produktem firmy ATMEL

dostepnym, zawsze w aktualnej wersji, na stronie http://www.atmel.com. Srodowisko umozliwia pisanie, kompilowanie, debuggowanie (usuwanie bledów programistycznych) oraz symulacje programów pisanych w jezykach asembler oraz C dla mikrokontrolerów Atmel AVR.

3.1. Zakladanie projektu w jezyku asembler Po otwarciu srodowiska AVR Studio automatycznie pojawia okienko Create New Project

lub okienko to mozna otworzyc z Menu Project → New Project. W pozycji Project Type wybieramy Atmel AVR Asembler.

Technika mikroprocesorowa

7

W pozycji Location wybieramy sciezke, w której zostanie umieszczony katalog z projektem, przy czym sam katalog mozna samodzielnie utworzyc podczas wyboru sciezki lub zlecic utworzenie katalogu srodowisku AVR Studio przez zaznaczenie opcji Create Folder.

Zaznaczamy opcje Create Initial File, wówczas podczas zakladanie projektu zostanie automatycznie utworzony flik edycyjny z rozszerzeniem .asm. W pliku tym edytuje sie kod zródlowy programu.

W okienkach Project Name oraz Initial File wpisujemy nazwe (najprosciej identyczna z nazwa katalogu projektu).

Rys.3. Zakladanie projektu w srodowisku AVR Studio – wybór nazwy i katalogu

Podczas zakladania nowego projektu generowany jest plik zalozycielski z rozszerzeniem

.aps. (Podwójne klikniecie w plik z rozszerzeniem .aps w otwartym katalogu projektu pozwala prawidlowo otworzyc projekt zamkniety.)

Klikamy przycisk Next. Pojawia sie okienko, które pozwala wybrac Debug Platform, czyli platforme do

sprawdzania poprawnosci dzialania programu i prowadzenia symulacji.

Technika mikroprocesorowa

8

Rys.4. Zakladanie projektu w srodowisku AVR Studio – wybór platformy i procesora Do wyboru mamy:

− emulatory (ICE40, ICE50, ICE200) –Jest to rodzaj hardware-owego próbnika pozwalajacy na symulowanie dzialanie wybranego procesora w ukladzie rzeczywistym, w którym podlaczono urzadzenia zewnetrzne.

− zlacze JTAG ICE (JTAGICE moll), które przez wewnetrzny interfejs dostepny w niektórych mikrokontrolerach i przy wykorzystaniu rezydujacego w nich oprogramowania pozwala dotrzec do zawartosci rejestrów w dzialajacym programie, zalozyc break pionts, sledzic wartosci zmiennych itp.

− AVR Simulator - symulator dzialania programu realizowany na komputerze PC, pozwala realizowac prace krokowa, sledzic wartosci zmiennych, czas wykonania programu itp.

Wybieramy AVR Simulator. Z listy wyboru Device wybieramy typ mikrokontrolera. Klikamy Finish. Z prawej otwiera sie okienko edycyjne, które wygodnie jest zmaksymalizowac. Oprócz tego z lewej widoczne jest okienko Project, w którym dostepne sa pliki nalezace

do projektu (Source Files pliki zródlowe, Included Files pliki wlaczane automatycznie przez kompilator i Linker, Object Files pliki definiujace obiekty, Output Files pliki wyjsciowe) oraz etykiety uzyte w projekcie. Przelaczniki w srodkowej czesci ekranu pozwala ja zastapic okienko Project okienkiem I/O View, które w procesie symulacji bedzie pokazywac zawartosc rejestrów operacyjnych i rejestrów przestrzeni INPUT/OUTPUT lub okienkiem Info, które zawiera m.in. informacje o wektorach przerwan wybranego mikrokontrolera.

Na dole pojawia sie okienko Message, w którym pokazywane sa wyniki kompilacji. Ewentualne bledy kompilacji sa zaznaczane czerwonymi kropkami. Podwójne klikniecie w czerwona kropke ustawia kursor w linijce, która wymaga poprawienia.

Technika mikroprocesorowa

9

Rys.5. Zakladanie projektu w srodowisku AVR Studio – okna nowego projektu

Kolejna czynnoscia jest napisanie i skompilowanie kodu zródlowego. W wyniku

pomyslnej kompilacji powstaje plik wyjsciowy z rozszerzeniem .hex, który mozna zaladowac do pamieci Flash mikrokontrolera.

3.2. Struktura programu w jezyku asembler Program pisany w jezyku asembler ma nastepujaca strukture:

• Wczytanie biblioteki mikrokontrolera • Zespól dyrektyw odnoszacych sie do pamieci RAM (.dseg) dotyczacych lokowania

stalych i zmiennych w pamieci RAM • Zespól dyrektyw odnoszacych sie do wewnetrznej pamieci EEPROM (.eseg)

dotyczacych lokowania stalych i zmiennych w pamieci EEPROM • Zespól dyrektyw odnoszacych sie do pamieci programu Flash (.cseg) dotyczacych

lokowania stalych i zmiennych w pamieci Flash • Wektor przerwan (tylko elementy uzywane w pisanym programie) • Program glówny

o Ustawienie wskaznika stosu o Zerowanie pamieci RAM o Rozkazy (w tym wywolania podprogramów) o Zakonczenie programu glównego przez zapetlenie lub skoki w miejscu

• Procedury podprogramów • Procedury obslugi przerwan

Technika mikroprocesorowa

10

Wprawdzie struktura programu jest nieprzekraczalna, ale nie wszystkie wymienione elementy musza wystapic w kazdym programie. Ponizej przedstawiono przyklad prostego programu:

Wczytanie biblioteki mikrokontrolera

.include "8515def.inc" Dyrektywa kompilatora wskazujaca, ze ponizszy fragment programu zawiera kod

zródlowy .cseg

Adres w pamieci Flash rozpoczecia programu .org $0000

Skok bezwarunkowy do etykiety reset rjmp reset

Przed etykieta reset mozna umiescic adresy obslugi przerwan lub dane, które zostana zapisane w kodzie programu

reset: Zestaw rozkazów inicjalizujacy stos na adresie $025F

ldi r16, high(ramend) out sph, r16 ldi r16, low(ramend) out spl, r16

W tym miejscu przewaznie umieszcza sie petla zerujaca zawartosc pamieci RAM (chwilowo pomijamy)

Dalsze rozkazy programu (wsród których mozna umiescic wywolanie podprogramu rcall podprogram1

Zakonczenie programu glównego np. skokiem w miejscu (na etykiete koniec) Koniec: rjmp koniec

Ponizej programu glównego umieszczamy podprogramy (powrót rozkazem ret) podprogram1:

4 instrukcje puste nop nop nop nop ret

Niezbednym elementem kazdego programu jest zespól rozkazów (umieszczanych na

poczatku kou zródlowego) inicjujacych stos.

Stos jest obszarem wydzielanym w pamieci danych SRAM, teoretycznie jego wielkosc jest ograniczona jedynie przez rozmiar tej pamieci. Po resecie mikrokontrolera stos jest inicjowany na poczatku pamieci RAM i pozostawienie go w tym miejscu zwiazane jest z duzym ryzykiem nadpisania, dlatego niezbedne jest przeniesienie stosu w inny obszar RAMu (typowo na koniec) pierwszym zespolem rozkazów po resecie mikrokontrolera.

Wskaznik stosu powinien zostac ustawiany na najwyzszym adresie wewnetrznej pamieci SRAM znanym procesorowi pod zdefiniowana nazwa ramend czyli „end of RAM” (mikrokontrolerze AT90S8515 jest to adres $025F). Stos jest budowany od konca RAM-u wstecz. Po programowym zlozeniu na stosie jednego bajtu (rozkazem push) wskaznik stosu

Technika mikroprocesorowa

11

ulega zmniejszeniu o 1, po programowym pobraniu ze stosu 1 bajtu (rozkazem pop) wskaznik stosu ulega zwiekszeniu o 1.

Podczas wykonywania procedur przerwan i podprogramów 16-bitowy (2-bajtowy) adres powrotu do programu glównego jest przechowywany na stosie. Adres powrotu z przerwania lub podprogramu jest sprzetowo skladany na stosie przed rozpoczeciem procedury, co powoduje zmniejszenie wskaznika stosu o 2. Po zakonczeniu procedury (rozkazem RET lub RETI) adres powrotu do programu glównego jest sprzetowo pobierany ze stosu, co powoduje zwiekszenie wskaznika stosu o 2.

Stos moze zostac wykorzystany do przechowania zawartosci rejestru wykorzystywanego wielokrotnie do róznych celów podczas wykonywania programu. Wówczas jednak na programiscie spoczywa obowiazek sprawdzania, czy liczba bajtów pobranych ze stosu dokladnie odpowiada liczbie bajtów zlozonych na stosie.

Zestaw rozkazów inicjujacych stos na koncu RAM-u ma nastepujaca postac:

Zaladowanie starszego bajtu adresowego do rejestru 16-stego (liczba kryjaca sie pod nazwa high(ramend) ma wartosc $02

ldi r16, high(ramend) Przepisanie starszego bajtu adresowego z rejestru 16-stego do starszego rejestru

wskaznika stosu sph out sph, r16

Zaladowanie mlodszego bajtu adresowego do rejestru 16-stego (liczba kryjaca sie pod nazwa high(ramend) ma wartosc $5F

ldi r16, low(ramend) Przepisanie mlodszego bajtu adresowego z rejestru 16-stego do mlodszego rejestru

wskaznika stosu spl out spl, r16

Skopiuj program z tego podrozdzialu do okienka edycyjnego zalozonego projektu. Kod programu zapisz wybierajac z Menu File opcje Save, a nastepnie skompiluj wybierajac Build. Potwierdz, ze w okienku kompilatora nie ma bledów. Sprawdz, czy w katalogu projektu pojawily sie pliki wyjsciowe .hex i .map.

3.3. Symulacje dzialania programu Zaladuj symulacje dla platformy AVR Simulator wybierajac z Menu Build opcje Build

and Run lub z Menu Debug opcje Start Debugging. Po zaladowaniu symulacji przy pierwszej linii programu pojawi sie zólta strzalka. Z menu Debug wybierz AVR Simulator Options i ustaw czestotliwosc kwarcu zgodna z projektem. W okienku Project wybierz przelacznikiem I/O View. Rozwin liste rejestrów procesora. Zwróc uwage na: − Licznik programu Program Counter, wskazujacy postep w wykonaniu programu − Rejestr wskaznika stosu Stack Pionter (16-bitowy) − Licznik cykli wykonania programu (rózni sie od licznika programu, poniewaz

poszczególne rozkazy maja od 1 do3 cykli)

Technika mikroprocesorowa

12

Rys.6. Symulacje prostego programu Dodatkowo rozwin liste rejestrów 16-31. Zwróc uwage na liczby wpisywane do rejestru 16-ego w czasie wykonania programu. Wykonaj program praca krokowa. W tym celu z Menu Debug wybierz Step Into (F11). W kolejnych krokach wykonywane sa nastepujace czynnosci: − Krok 1: wpis do rejestru 16 − Krok 2: przepisanie starszej czesci adresu z rejestru 16 do rejestru Stack Pointer − Krok 3: wpis do rejestru 16 − Krok 4: przepisanie mlodszej czesci adresu z rejestru 16 do rejestru Stack Pointer (w tym

momencie w Stack Pointer znajduje sie liczba $025F) wskazujaca na koniec RAM-u). − Krok 5: wywolanie podprogramu (na skutek zlozenia adresu powrotu na stos wskaznik

stosu wskazuje na liczbe o dwa mniejsza czyli $025D) − Krok 6,7,8,9: wykonanie czterech rozkazów „pustych” nop. − Krok 10: podjecie adresu powrotu i powrót z podprogramu na etykiete koniec (wskaznik

stosu ulega zwiekszeniu o 2 i wskazuje na liczbe $025F) − Kroki 11 - ∞ : skoki w miejscu

Rozwin program przez dopisanie miedzy ustawieniem wskaznika stosu, a koncem nastepujacych rozkazów: − Do rejestrów 16, 17 i 18 wstaw 3 rózne liczby (pamietaj, ze mamy do czynienia z

mikrokontrolerem 8-mio bitowym i najwieksza liczba w tym systemie to 28 – 1. Operacje matematyczne sa bowiem wykonywane modulo 256.

− Rejestry r16, r17, r18 zlóz 3-ma kolejnymi rozkazami push na stos. − Podejmij rejestry ze stosu 3-ma kolejnymi rozkazami pop Pamietaj, ze stos ma organizacje jak „talerze na stosie”, tj. ostatni polozony jest 1-szym zdjetym.

Technika mikroprocesorowa

13

Rys.7. Wykorzystanie stosu do przechowania adresów i danych

Skompiluj program i rozpocznij symulacje. Z Menu View pobierz okienko Memory2 i zadokuj je w prawym dolnym rogu. Z listy rozwijalnej okienka Memory2 wybierz opcje Data (odnosi sie to do pamieci RAM). Myszka przesun sie na koniec pamieci Data, gdzie bedzie tworzony stos.

W trakcie pracy krokowej zaobserwuj, jak na stosie pojawiaja sie kolejne liczby z rejestrów 16, 17, 18. Liczby te ogladamy w zapisie szesnastkowym. Klikajac myszka podwójnie bezposrednio w liczbe spowodujemy otwarcie dodatkowego okienka, które pozwoli obejrzec liczbe w innym systemie numerycznym np. dziesietnym lub dwójkowym.

Zauwaz, ze rozkazy push i pop wykonuja kopie liczb z rejestrów na stos (do RAMU) oraz ze stosu do rejestrów. Oryginaly liczb pozostaja bez zmian w poprzedniej lokacji. Jest to jednak bez znaczenia dla organizacji stosu, poniewaz po pobraniu liczby ze stosu do rejestru przesuwa sie wskaznik stosu i przestaje wskazywac na juz pobrana (skopiowana) liczbe, tym samym przeznaczajac ja do nadpisania nowa dana w najblizszej przyszlosci.

4. Petle czasowe Czas wykonania programu mozna liczyc w cyklach zegarowych lub w sekundach. W

mikrokontrolerach AVR czas cyklu zegarowego jest odwrotnoscia czestotliwosci kwarcu np. dla kwarcu 6MHz, cykl zegarowy trwa 1/6 µs. Wiekszosc rozkazów mikrokontrolera AVR jest wykonywana w jednym cyklu zegarowym, jednak sa takie, które zajmuja 2 lub 3 cykle. AVR Simulator umozliwia sledzenie czasu wykonania programu zarówno w cyklach zegarowych, jak i w sekundach.

Czas mozna odliczac w petlach czasowych lub w dedykowanym module liczacym zwanym Timer-em. Odliczanie czasu w petlach polega na wielokrotnej dekrementacji

Technika mikroprocesorowa

14

zawartosci rejestru i liczeniu uplywajacego przy tym czasu. Przesledzmy prace ponizszej petli:

Zaladowanie wartosci 0 do rejestru 16 ldi r16, 0

Kazda etykieta posiada swój adres w kodzie programu i jest wykorzystywana w skokach

etykieta1: Dekrementacja zawartosci rejestru (1-sze wykonanie tego rozkazu daje wyniku

wartosc 255, poniewaz operacje matematyczne wykonywane sa modulo 256) dec r16

Porównanie zawartosci rejestru ze wskazana liczba (tu: z zerem) cpi r16, 0

Skok warunkowy, jesli w wyniku dekrementacji nie osiagnieto zera, to program skacze do etykiety1, w przeciwnym razie przechodzi do nastepnej instrukcji (tu: etykieta koniec)

brne etykieta1 koniec:

W wyniku porównania cpi zawartosci rejestru (tu: 16) i stalej (tu: 0) nastepuje ustawienie (lub wyzerowanie) dwóch flag: Z i C. Rozkaz skoku warunkowego np. brne lub breq lub brlo itd. nastepujacy bezposrednio po rozkazie porównania cpi lub cp testuje flage Z lub flage C i wg jej wartosci orientuje sie czy nalezy wykonac skok warunkowy. Z tej przyczyny rozkazy: porównania i skoku warunkowego musza nastepowac bezposrednio po sobie tj. nie moga zostac rozdzielone rozkazem trzecim, który móglby wplynac w sposób niezaplanowany na wartosc flag: Z lub C.

Wykonaj symulacje dzialania programu. Przechodzac program praca krokowa sprawdz, ile cykli potrzeba na wykonanie poszczególnych rozkazów w petli tj. dec, cpi i brne. Liczba cykli jednokrotnego wykonania petli pomnozona przez liczbe obejsc petli da calkowita liczbe cykli traconych w tej petli. Policz ja.

Ustaw kursor na etykiecie koniec: i z Menu Debug pobierz Toggle Breakpoint. Z lewej strony etykiety koniec: pojawi sie czerwona kropka, oznaczajaca punkt, w którym zatrzyma sie wykonanie programu. Z Menu Debug wybierz Reset, a nastepnie Run. Program wykona wszystkie rozkazy az do osiagniecia punktu Breakpoint. Z Cycle Counter sprawdz, w ilu cyklach program zostal wykonany, a ze Stop Watch , w jakim czasie zostal wykonany dla wybranej czestotliwosci kwarcu.

Technika mikroprocesorowa

15

Rys.8. Odliczanie czasu w petli pojedynczej Rozbuduj petle tak, aby liczyla dluzsze czasy. W tym celu obejmij ja petla zewnetrzna liczaca na innym rejestrze, która wykonuje tylko jeden krok na kazde 256 kroków petli wewnetrznej. W ten sposób liczba wykonan petli wzrosnie do 256 * 256. Sprawdz w drodze symulacji, jaki czas odlicza petla podwójna. W podobny sposób zbuduj petle potrójna o liczbie obejsc 256 * 256 * 256. Polecenia

1. Zaladuj trzy stale do trzech róznych rejestrów. Stale te zlóz na stosie trzema kolejnymi rozkazami push , po czym po kolei podejmij je ze stosu trzema kolejnymi rozkazami pop. Przeprowadz symulacje dzialania programu. Zaobserwuj, gdzie w pamieci RAM jest formowany stos.

2. Napisz petle czasowa odmierzajaca czas okolo 30µs. 3. Napisz petle czasowa odmierzajaca czas okolo 30ms 4. Napisz petle czasowa odmierzajaca czas okolo 300ms.

5. Porty mikrokontrolera Mikrokontroler AT90S8515 posiada 4-ry uniwersalne porty dwukierunkowe (Input/Output): A, B, C, D, z których kazdy ma 8 linii. Wyjscia kazdej linii portu moga byc obciazone pradem 20mA.

Technika mikroprocesorowa

16

Rys.9. Uproszczona budowa interfejsu wybranej linii portu B Do obslugi kazdego portu zostaly przydzielone trzy rejestry: − rejestr kierunkowy DDR − rejestr danych PORT − rejestr wejsciowy PIN Rejestr kierunkowy DDR Rejestr kierunkowy portu A nosi nazwe DDRA i odpowiednio DDRB dla portu B, DDRC dla portu C, DDRD dla portu D. Rejestr kierunkowy DDR okresla kierunek transmisji danych. Wyzerowanie wybranego bitu w rejestrze kierunkowym determinuje odpowiadajaca mu linie jako wejsciowa. Ustawienie wybranego bitu w rejestrze kierunkowym determinuje odpowiadajaca mu linie jako wyjsciowa. Jako przyklad przedstawiono rejestr kierunkowy portu D. Kazdy jego bit odpowiada jednej linii. Wartosc poczatkowa wszystkich bitów to logiczne 0.

Rejestr kierunkowy portu D - DDRD

Bit 7 6 5 4 3 2 1 0 Nazwa DDD7 DDD6 DDD5 DDD4 DDD3 DDD2 DDD1 DDD0

Odczyt/zapis R/W R/W R/W R/W R/W R/W R/W R/W Wartosc poczatkowa 0 0 0 0 0 0 0 0

Przykladowa para rozkazów ustawia cztery mlodsze linie: 0, 1, 2, 3 portu D jako wejsciowe, natomiast cztery starsze linie: 4, 5, 6, 7 jako wyjsciowe: Ldi r16, 0b11110000 Out DDRB, r16

Rejestr danych PORT Rejestr danych portu A nosi nazwe PORTA i odpowiednio PORTB dla portu B, PORTC dla portu C, PORTD dla portu D.

Technika mikroprocesorowa

17

W przypadku konfiguracji linii jako wejsciowa ustawienie bitu rejestru PORT aktywuje wewnetrzny rezystor podwieszajacy linie do zasilania, natomiast wyzerowanie bitu rejestru PORT wprowadza odpowiadajaca mu linie w stan wysokiej impedancji. Jako przyklad przedstawiono rejestr danych portu D. Kazdy jego bit odpowiada jednej linii. Wartosc poczatkowa wszystkich bitów to logiczne 0.

Rejestr danych portu D - PORTD

Bit 7 6 5 4 3 2 1 0 Nazwa PORTD7 PORTD6 PORTD5 PORTD4 PORTD3 PORTD2 PORTD1 PORTD0

Odczyt/zapis R/W R/W R/W R/W R/W R/W R/W R/W Wartosc poczatkowa 0 0 0 0 0 0 0 0

Przykladowy zestaw rozkazów podwiesza cztery mlodsze linie: 0, 1, 2, 3 portu wejsciowego D do zasilania, natomiast cztery starsze linie: 4, 5, 6, 7 wprowadza w stan wysokiej impedancji: Ldi r16, 0b00000000 Out DDRB, r16 Ldi r16, 0b00001111 Out PORTB, r16 W przypadku konfiguracji linii jako wyjsciowa podanie na linie stanu logicznego 0 lub logicznej 1 pelni role sterowania urzadzeniem zewnetrznym. Przykladowy zestaw rozkazów podaje na cztery mlodsze linie: 0, 1, 2, 3 portu wyjsciowego D stan logiczny 1, natomiast na cztery starsze linie: 4, 5, 6, 7 podaje stan logiczny 0: Ldi r16, 0b11111111 Out DDRB, r16 Ldi r16, 0b00001111 Out PORTB, r16

Rejestr wejsciowy PIN Rejestr wejsciowy portu A nosi nazwe PINA i odpowiednio PINB dla portu B, PINC dla portu C, PIND dla portu D. PIN wlasciwie nie jest rejestrem, umozliwia on dostep do fizycznego wyprowadzenia linii portu. Odczyt wartosci rejestru PIN pozwala stwierdzic stan wystepujacy na wyprowadzeniu linii portu. Jako przyklad przedstawiono rejestr wejsciowy PIND portu D. Kazdy jego bit odpowiada jednej linii. Wartosc poczatkowa nie jest okreslona.

Rejestr wejsciowy portu D - PIND

Bit 7 6 5 4 3 2 1 0 Nazwa PIND7 PIND6 PIND5 PIND4 PIND3 PIND2 PIND1 PIND0

Odczyt/zapis R R R R R R R R Wartosc poczatkowa N/A N/A N/A N/A N/A N/A N/A N/A N/A – wartosc nieustalona

Przykladowy rozkaz wczytuje stany wystepujace na fizycznym wyprowadzeniu linii portu D do rejestru r16: In r16, DDRB

Technika mikroprocesorowa

18

Rys.10. Konfiguracja wyprowadzen mikrokontrolera AT90S8515 w obudowie PDIP.

Linie portów A, B, C, D uniwersalnie pelnia role linii wejsciowych lub wyjsciowych. Po odpowiednim skonfigurowaniu moga równiez pelnic funkcje dodatkowe (na rysunku podane w nawiasach) jako linie róznych interfejsów. Oprócz 32-ch linii portów A, B, C, D mikrokontroler AT90S8515 posiada ponadto: linie zasilania Vcc , linie masy GND, linie do podlaczenia kwarcu XTAL1, XTAL2, linie RESET i trzy linie portu E: PE0, PE1, PE2.

5.1. Przyklad obslugi portów wyjsciowych Skonfiguruj wszystkie linie portu B jako wyjsciowe i podlacz na nich 8 diod. Z czestotliwoscia okolo 1s zapalaj na zmiane diody parzyste i nieparzyste.

Ustalenie kierunku linii portu B: wszystkie linie staja sie wyjsciami ldi r16, 0b11111111 out DDRB, r16

Zgaszenie wszystkich diod ldi r16, 0b11111111 out PORTB, r16

Wywolanie podprogramu z opóznieniem czasowym Etyk1: rcall czas

Zapalenie diod parzystych ldi r16, 0b10101010 out PORTB, r16

Wywolanie podprogramu z opóznieniem czasowym rcall czas

Zapalenie diod nieparzystych, zgaszenie parzystych ldi r16, 0b01010101 out PORTB, r16

Powrót w petle , skok bezwarunkowy rjmp etyk1 Czas:

Technika mikroprocesorowa

19

. . . . . ret Wykonaj symulacje programu w trybie Auto Step wybranym z Menu Debug. W okienku symulatora rozwin rejestry portu B.

Rys.11. Obsluga portów wyjsciowych

Polecenia

5. Do linii portu B podlaczono diody. Skonfiguruj linie do pracy jako wyjsciowe. Zapalaj i gas wszystkie diody z czestotliwoscia okolo 200ms (wykorzystaj rozkaz out do sterowania 8-mioma diodami).

6. Do linii portu B podlaczono diody. Zapalaj i gas wybrana diode (np. 1-sza) z czestotliwoscia okolo 200ms (wykorzystaj rozkazy cbi i sbi do sterowania wybrana dioda).

7. Zapal jedna diode i uzyskaj efekt swiatelka biegnacego z czestotliwoscia 200ms zawsze z lewej do prawej (lub zawsze z prawej do lewej).

Sprawdz w wykazie rozkazów, jak dzialaja rozkazy rotacji liczby przez bit przeniesienia rol i ror.

Do linii portu B podlacz 8 diod Skonfiguruj linie do pracy jako wyjsciowe i zgas podlaczone do nich diody Wybierz (i zapisz w postaci binarnej) liczbe podlegajaca , która podana na port B

spowoduje zapalenie tylko jednej diody Ustaw bit C (rozkazem sec) W nieskonczonej petli:

− Wykonaj obrót liczby o 1 bit − Podaj liczbe po rotacji na diody − Odczekaj 200ms − Wykonaj obrót liczby o 1 bit, itd.

Technika mikroprocesorowa

20

W trakcie dzialania petli bit przeniesienia C musi pozostac zawsze ustawiony w stan logicznej 1, poniewaz wchodzi do rotacji jako logiczna 1 (co ustalono na poczatku rozkazem sec). Tymczasem stosowane w petlach czasowych rozkazy cpi, brne, breq zmieniaja wartosc bitu przeniesienia C. W celu zachowania pierwotnej wartosci bitu C nalezy wykorzystac stos do przechowania wartosci rejestru statusowego sreg, w którym znajduje sie bit przeniesienia.

Czas: In r16, sreg Push r16 ….. ….. Pop r16 Out sreg, r16 ret

5.2. Przyklad obslugi portów wejsciowych Skonfiguruj linie 0 portu D jako wejsciowa podwieszona do zasilania i podlacz na niej przycisk (switch), natomiast linie 1 portu D jako wyjsciowa i podlacz na niej diode. Konfiguracja pozostalych linii portu D jest nieistotna (niech np. beda wejsciami). Zwarcie switcha sygnalizuj swieceniem diody. Odczyt stanów wejsciowych za pomoca rozkazu „in”

Ustalenie kierunku linii portu D: linia 0 staje sie wejsciem, linia 1 wyjsciem ldi r16, 0b00000010 out DDRD, r16

Podwieszenie linii 0 do zasilania, zgaszenie diody na linii1 ldi r16, 0b00000011 out PORTD, r16 petla:

Wczytanie stanu na wejsciach fizycznych portu D In r16, PIND

Iloczyn logiczny rejestru r16 z liczba 0b00000001 pozwoli wyselekcjonowac wylacznie stan linii 0

Andi r16, 0b00000001 Porównanie z liczba np. 0b00000001 pozwoli okreslic, czy linia 0 jest zwarta czy

rozwarta Cpi r16, 0b00000001

W przypadku zwarcia linii 0 skaczemy do etykiety Zapal:, w przeciwnym razie przechodzimy do etykiety Zgas:

Brne zapal Zgas:

Diode gasi logiczna 1 na linii 1 Sbi portd, 1

Skok bezwarunkowy na etykiete Dalej Rjmp petla

Technika mikroprocesorowa

21

Zapal:

Diode zapala logiczne 0 na linii 1 Cbi portd, 1

Skok bezwarunkowy na etykiete Dalej Rjmp petla Odczyt stanów wejsciowych za pomoca rozkazów „sbic”, „sbis” Identyczne dzialanie programu mozna uzyskac wykorzystujac rozkazy sbic lub sbis. Kod zródlowy bedzie mial wówczas nastepujaca postac: ldi r16, 0b00000010 out DDRD, r16 ldi r16, 0b00000011 out PORTD, r16 petal:

− Pomin jeden rozkaz, jesli bit 0 w rejestrze PIND jest ustawiony w stan logicznej 1 sbis PIND, 0 rjmp zapal Zgas: Sbi portd, 1 Rjmp petla Zapal: Cbi portd, 1 Rjmp petla Wykonaj symulacje obu wersji programu w trybie pracy krokowej (F11). W okienku symulatora rozwin rejestry portu D i przed rozpoczeciem symulacji ustaw wszystkie bity rejestru PIND zaznaczajac kazdy z nich na czarno za pomocy myszki. W ten sposób symulacje zostana rozpoczete od styków rozwartych. Symulacja zwarcia styku polega na wyzerowaniu odpowiadajacej mu linii PIND przez zaznaczenie odpowiedniego bitu na bialo za pomoca myszki.

Technika mikroprocesorowa

22

Rys.12. Obsluga portów wejsciowych

Polecenia

8. Polacz 8 przycisków z 8-mioma liniami portu D, polacz 8 diod z 8-mioma liniami portu B. Napisz program, który nacisniecie N-tego przycisku sygnalizuje zapaleniem N-tej diody. − Skonfiguruj 8 linii portu D do pracy w roli wejsc (podlacz na nich przyciski) − Podwies przyciski wewnetrznie do zasilania − Skonfiguruj 8 linii portu B do pracy w roli wyjsc (podlacz na nich diody) − Zgas diody podajac na nie logiczna 1 − Wykorzystaj rozkaz IN do odczytania stanu 8-miu przycisków − Wykorzystaj rozkaz OUT do sterowania 8-mioma diodami.

9. Polacz przynajmniej 1 przycisk np. na linii 1 portu D, polacz 8 diod z 8-mioma liniami portu B. Napisz program, który reaguje zapaleniem wszystkich diod na nacisniecie 1-ego przycisku, zgaszeniem wszystkich diod na puszczenie 1-ego przycisku. Na pozostale przyciski program nie reaguje. − Skonfiguruj 1 linii portu D do pracy w roli wejsc (podlacz przynajmniej 1 przycisk) − Podwies przycisk wewnetrznie do zasilania − Skonfiguruj 8 linii portu B do pracy w roli wyjsc (podlacz na nich diody) − Zgas diody podajac na nie logiczna 1 − Wykorzystaj rozkaz IN do odczytania stanu 8-miu przycisków − Wykorzystaj rozkaz ANDI (iloczynu logicznego) do selekcji 1-go przycisku − Wykorzystaj rozkaz porównania ze stala CPI do sprawdzenia stanu zwarcia

przycisku − Wykorzystaj rozkaz skoku warunkowego BREQ lub BRNE do skierowania

programu we wlasciwa sciezke

Technika mikroprocesorowa

23

− Wykorzystaj rozkaz OUT do sterowania 8-mioma diodami.

6. Zródla przerwan mikrokontrolera

Mikrokontroler AT90S8515 obsluguje 12 róznych przerwan i dodatkowo przerwanie RESET. Kazde z przerwan ma oddzielna procedure obslugi. Kazde z przerwan ma maske, która musi by zdjeta (ustawiona), aby wlaczyc (uaktywnic) przerwanie.

Mikrokontroler AT90S8515 ma dwa 8-bitowe rejestry masek przerwan: GIMSK, w którym znajduja sie maski przerwan zewnetrznych i TIMSK, w którym znajduja sie maski przerwan timerów. Ponadto w celu wlaczenia przerwan konieczne jest ustawienie bitu I globalnego zezwolenia na przerwania znajdujacego sie w rejestrze statusowym SREG.

Najnizsze adresy w pamieci programu sa automatycznie definiowane jako RESET i wektor przerwan. Kompletna liste wektorów przerwan przedstawia tabela, w której przerwania sa uporzadkowane wg hierarchii waznosci. Im nizszy adres przerwania, tym wyzszy jego priorytet. Najwyzszy priorytet ma przerwania RESET, zaraz potem jest przerwanie zewnetrzne 0 (INT0).

Jesli nastapi zdarzenie zdefiniowane jako zródlo przerwania, to zostaje ustawiona flaga przerwania w rejestrze flagowym. Wówczas, jesli dane przerwanie ma zdjeta maske ( i ustawiono w stan logicznej 1 bit I w rejestrze SREG) nastapi automatyczny skok do adresu obslugi przerwania, a stamtad do procedury obslugi przerwania. Np. jesli nastapilo przepelnienie liczacego TIMER 1, to program skoczy do adresu $006, a stamtad do etykiety tim1_ovf, od której rozpoczyna sie procedura obslugi przerwania. W momencie skoku do procedury przerwania program odklada na stos 16-bitowy adres powrotu do programu glównego. Adres ten jest podejmowany po spotkaniu rozkazu reti, konczacego procedure przerwania. Po skoku do procedury przerwania flaga przerwania zostaje wyzerowana sprzetowo. Wyzerowany zostaje równiez bit I (w rejestrze SREG) uniemozliwiajac obsluge innych przerwan, dopóki nie zostanie zakonczona biezaca procedura. Nie przeszkadza to jednak ustawianiu flag innych przerwan, jesli nastapia definiujace je zdarzenia. Po napotkaniu rozkazu reti, bit I zostaje ponownie sprzetowo ustawiony w stan logicznej 1 i sprawdzone zostaja flagi innych przerwan. Jesli program napotka ustawiona flage, to przystapi do wykonania procedury kolejnego przerwania.

Wektory przerwan

Adres przerwania

Zródlo przerwania objasnienie

$000 RESET Brak zasilania, linia RESET, watchdog $001 INT0 Przerwanie zewnetrzne 0 $002 INT1 Przerwanie zewnetrzne 1 $003 TIMER1 CAPT TIMER 1 w trybie przechwytu $004 TIMER1 COMPA TIMER 1 w trybie porównawczym z rejestrem A $005 TIMER1 COMPB TIMER 1 w trybie porównawczym z rejestrem B $006 TIMER1 OVF TIMER 1 w trybie przepelnienia $007 TIMER0 OVF TIMER 0 w trybie przepelnienia $008 SPI, STC ukonczenie transmisji szeregowej SPI

Technika mikroprocesorowa

24

$009 UART, RX zakonczenie odbioru UART $00A UART, UDRE pusty rejestr danych UART $00B UART, TX zakonczenie nadawania UART $00C ANA_KOMP komparator analogowy

Ponizej przedstawiono zapis kompletnego wektora przerwan w kodzie zródlowym programu. W rzeczywistosci w kodzie mozna pominac adresy przerwan nie obslugiwanych.

.include "8515def.inc" .cseg .org $0000 rjmp reset .org $0001 rjmp ext_int0 .org $0002 rjmp ext_int1 .org $0003 rjmp tim1_capt .org $0004 rjmp tim1_compa .org $0005 rjmp tim1_compb .org $0006 rjmp tim1_ovf .org $0007 rjmp tim0_ovf .org $0008 rjmp spi_stc .org $0009 rjmp uart_rxc .org $000a rjmp uart_dre .org $000b rjmp uart_txc .org $000c rjmp ana_comp reset: ldi r16, high(ramend) out sph, r16 ldi r16, low(ramend) out spl, r16

7. Przerwania zewnetrzne

Technika mikroprocesorowa

25

Przerwania zewnetrzne INT0 i INT1 sa wywolywane przez stan niski, zbocze narastajace lub zbocze opadajace na okreslonych liniach zewnetrznych mikrokontrolera. Przerwanie INT0 reaguje na stany na linii 2 portu D, a przerwanie INT1 na linii 3 portu D.

Przerwania zewnetrzne INT0 i INT1 wywolywane poziomem niskim nie posiadaja flag. W zwiazku z tym, przerwania te sa wywolywane tylko w czasie rzeczywistym. Bity konfigurujace zródlo przerwania INT0 oraz INT1 znajduja sie w rejestrze kontrolnym MCUCR. Rejestr kontrolny - MCUCR

Bit 7 6 5 4 3 2 1 0 Nazwa SRE SRW SE SM ISC11 ISC10 ISC01 ISC00

Odczyt/zapis R/W R/W R/W R/W R/W R/W R/W R/W Wartosc poczatkowa 0 0 0 0 0 0 0 0 Konfiguracja zródla przerwania zewnetrznego INT1 ISC11 ISC10 Zródlo przerwania

0 0 Poziom niski na linii INT1

0 1 Zarezerwowane

1 0 Zbocze opadajace na linii INT1

1 1 Zbocze narastajace na linii INT1

Konfiguracja zródla przerwania zewnetrznego INT0 ISC01 ISC00 Zródlo przerwania

0 0 Poziom niski na linii INT0

0 1 zarezerwowane

1 0 Zbocze opadajace na linii INT0

1 1 Zbocze narastajace na linii INT0

Maski przerwan zewnetrznych znajduja sie w rejestrze masek GIMSK. Rejestr masek przerwan - GIMSK

Bit 7 6 5 4 3 2 1 0 Nazwa INT1 INT0 - - - - - -

Odczyt/zapis R/W R/W R R R R R R Wartosc poczatkowa 0 0 0 0 0 0 0 0 Bit 7 – INT1: maska 1-go przerwania zewnetrznego

Technika mikroprocesorowa

26

Gdy bit INT1 jest ustawiony w stan logicznej 1 i bit I w rejestrze statusowym SREG jest ustawiony w stan logicznej 1, to 1-sze przerwanie zewnetrzne jest aktywne na linii 3 portu D. Bity ISC11 i ISC10 w rejestrze kontrolnym MCUCR definiuja, czy przerwanie jest wywolywane zboczem narastajacym, opadajacym czy poziomem niskim. Zdefiniowane zdarzenie na linii 3 portu D wywola zadanie przerwania nawet, jesli linia jest skonfigurowana jako wyjscie. Procedura obslugi przerwania jest wykonywana poczawszy od adresu $002. Bit 6 – INT0: maska 0-go przerwania zewnetrznego Gdy bit INT0 jest ustawiony w stan logicznej 1 i bit I w rejestrze statusowym SREG jest ustawiony w stan logicznej 1, to 0-we przerwanie zewnetrzne jest aktywne na linii 2 portu D. Bity ISC01 i ISC00 w rejestrze kontrolnym MCUCR definiuja, czy przerwanie jest wywolywane zboczem narastajacym, opadajacym czy poziomem niskim. Zdarzenie na linii na linii 2 portu D wywola zadanie przerwania nawet, jesli linia jest skonfigurowana jako wyjscie. Procedura obslugi przerwania jest wykonywana poczawszy od adresu $001. Rejestr flag przerwan - GIFR

Bit 7 6 5 4 3 2 1 0 Nazwa INTF1 INTF0 - - - - - -

Odczyt/zapis R/W R/W R R R R R R Wartosc poczatkowa 0 0 0 0 0 0 0 0 Bit 7 – INTF1: flaga 1-go przerwania zewnetrznego Jesli 1-sze przerwanie zewnetrzne jest wyzwalane zboczem, to zdarzenie na linii 3 portu D powoduje ustawienie flagi INTF1. Jesli w chwili wystapienia zdarzenia jest ustawiony w stan logicznej 1 bit I w rejestrze SREG oraz zdjeta maska przerwania w rejestrze GIMSK, to zdarzenie spowoduje skok do wektora przerwan. Flaga przerwania jest sprzetowo zerowana w momencie rozpoczecia wykonywania procedury obslugi przerwania. Alternatywnie flaga przerwania moze zostac wyzerowana programowo przez wpisanie do niej logicznej 1. Flaga jest zawsze równa zero, gdy przerwanie INT1 jest wyzwalane poziomem niskim. Bit 6 – INTF0: flaga 0-go przerwania zewnetrznego Jesli 0-we przerwanie zewnetrzne jest wyzwalane zboczem, to zdarzenie na linii 2 portu D powoduje ustawienie flagi INTF0. Jesli w chwili wystapienia zdarzenia jest ustawiony w stan logicznej 1 bit I w rejestrze SREG oraz zdjeta maska przerwania w rejestrze GIMSK, to zdarzenie spowoduje skok do wektora przerwan. Flaga przerwania jest zerowana sprzetowo w momencie rozpoczecia wykonywania procedury obslugi przerwania. Alternatywnie flaga przerwania moze zostac wyzerowana programowo przez wpisanie do niej logicznej 1. Flaga jest zawsze równa zero, gdy przerwanie INT0 jest wyzwalane poziomem niskim.

7.1. Przyklad przerwania zewnetrznego aktywowanego poziomem niskim Zalózmy, ze do linii 2 portu D podlaczono przycisk, natomiast do linii 2 portu B diode. W odpowiedzi na przycisniecie przycisku zapalaj diode. .include "8515def.inc" .cseg

Technika mikroprocesorowa

27

.org $0000 rjmp reset .org $0001 rjmp ext_int0 reset: ldi r16, high(ramend) out sph, r16 ldi r16, low(ramend) out spl, r16

Ustawienie linii 2 portu D jako wejscie podwieszone do zasilania (pozostale linie portu D równiez ustawiamy jako wejscia podwieszone)

ldi r16, 0b00000000 out DDRD, r16 ldi r16, 0b11111111 out PORTD, r16

Ustawienie linii 2 portu B jako wyjscie i podanie na nie logicznej 1 w celu zgaszenia podlaczonej tam diody (pozostale linie portu B ustawiamy jako wejscia podwieszone)

ldi r16, 0b00000100 out DDRB, r16 ldi r16, 0b11111111 out PORTB, r16

Konfiguracja przerwania zewnetrznego INT0: aktywowane poziomem niskim ldi r16, 0b00000000 out MCUCR, r16

Zdjecie maski przerwania INT0 ldi r16, 0b01000000 lub ldi r16, 1<<int0 out GIMSK, r16 out GIMSK, r16

Globalne wlaczenie przerwan sei lub ldi r16, 0b10000000 out sreg, r16

W petli glównej program gasi diode. Koniec: sbi portb, 2 rjmp koniec

Procedura obslugi przerwania ext_int0:

Program wchodzi w te sciezke pod warunkiem, ze przycisk jest zwarty. Nie ma zatem potrzeby sprawdzania, czy na pewno jest zwarty. Przystepujemy od razu do zapalenia diody.

cbi portb, 2

Technika mikroprocesorowa

28

Powrót z przerwania reti

Rys.13. Obsluga linii wejsciowych w trybie przerwania zewnetrznego aktywnego poziomem niskim Wykonaj krokowe (F11) symulacje dzialania programu. Rozwin nastepujace grupy rejestrów: − CPU ( statusowy SREG, starszy wskaznika stosu SPH, mlodszy wskaznika stosu SPL,

kontrolny MCUCR), − przerwan zewnetrznych (masek GIMSK oraz flag GIFR), − portu B (DDRB, PORTB, PINB), − portu D (DDRD, PORTD, PIND). W programach, w których przerwanie jest aktywne poziomem niskim flaga INTF0 w rejestrze GIFR nigdy nie jest ustawiana. Wykonaj symulacje dla 2-ch stanów przycisku: − Przycisk rozwarty (rozwarcie przycisku mozna uzyskac zaznaczajac na czarno mysza linie

2 portu D w okienku symulatora). W tej sytuacji program pozostaje w petli glównej gaszac diode.

− Przycisk zwarty (zwarcie przycisku mozna uzyskac zaznaczajac na bialo mysza linie 2 portu D w okienku symulatora). W tej sytuacji program skacze do adresu $0001, a stamtad do procedury rozpoczynajacej sie etykieta ext_int0 . Nastepuje sprzetowe wyzerowanie bitu I w rejestrze SREG na czas wykonywania procedury obslugi przerwania tzn. ze inne przerwania nie beda obsluzone przed zakonczeniem biezacej procedury.

Technika mikroprocesorowa

29

W procedurze przerwania dioda jest zapalana, po czym program wraca z przerwania. Tak dlugo, jak styk pozostaje zwarty program sukcesywnie skacze do przerwania i zapala diode. Procedura przerwania jest wykonywana w czasie rzeczywistym.

Polecenia 10. W przykladzie z p.7.1 wlacz przerwanie INT1 zamiast przerwania INT0. Wykonaj

analogiczne symulacje.

7.2. Przyklad przerwania zewnetrznego aktywowanego zboczem opadajacym

Aktywowanie przerwania zewnetrznego zboczem opadajacym nastepuje przez ustawienie odpowiedniego bitu w rejestrze MCUCR.

W tym przykladzie zalozono, ze w odpowiedzi na pierwsze i kazde nieparzyste przycisniecie przycisku na linii 2 portu D program zapala diode, natomiast w odpowiedzi na kazde parzyste nacisniecie gasi diode. Kolejnymi nacisnieciami dioda jest wiec zapalana i gaszona.

Kazdemu nacisnieciu oraz puszczeniu przycisku towarzyszy drzenie styków przycisku. Czas drzenia nalezy szacowac na kilkadziesiat milisekund (np. 60) ze wzgledu na prosta budowe styków w ukladzie. W czasie drzenia styków wystepuje seria impulsów ze zboczami na przemian opadajacymi i narastajacymi. Program reaguje przerwaniem na kazde zbocze opadajace, zatem w czasie kilkudziesieciu milisekund zareaguje przerwaniem co najmniej kilka razy. W celu unikniecia tego zjawiska na poczatku procedury przerwania wstawia sie petle opózniajaca. Nastepnie przez odczyt PIND, 2 nalezy sprawdzic, czy przerwanie bylo spowodowane nacisnieciem czy puszczeniem styku. Jesli nastapilo puszczenie, to program wraca z przerwania. Jesli nacisniecie, to wykonywana jest procedura przerwania. Przez odczyt zawartosci rejestru r31 program ustala, czy nacisniecie bylo parzyste. W przypadku nacisniec nieparzystych dioda jest zapalana, a do rejestru r31 wpisywana wartosc 1, w przypadku nacisniec nieparzystych dioda jest gaszona, a do rejestru r31 wpisywana jest wartosc 0. Procedura obslugi przerwania: ext_int0:

Przeczekanie drzenia styków rcall czas rcall czas

Sprawdzenie stanu zwarcia styku sbis pind, 2 rjmp zwarty

Styk rozwarty, powrót reti

Styk zwarty, wykonanie procedury zwarty:

Sprawdzenie zawartosci rejestru 31 cpi r31, 1 breq ety1

Wpisanie logicznego 0 do rejestru 31, zapalenie diody i powrót ldi r31, 1

Technika mikroprocesorowa

30

cbi portb, 2 reti ety1:

Wpisanie logicznej 1 do rejestru 31, zgaszenie diody i powrót ldi r31, 0 sbi portb, 2 reti Uzupelnij brakujace czesci projektu, a w szczególnosci: − Skonfiguruj rejestr MCUCR (dla przerwan aktywowanych zboczem opadajacym), − Nie gas diody w petli glównej programu (dioda jest gaszona jako reakcja na parzyste

przycisniecia przycisku). Wykonaj symulacje krokowe z pominieciem podprogramów (F10). Zauwaz, ze program wchodzi w przerwanie tylko po przejsciu zbocza opadajacego tj., gdy styk rozwarty (czarny) zostanie zwarty (jego kolor zostanie mysza zmieniony na bialy). Po jednokrotnym wykonaniu procedury przerwania program skacze w miejscu w petli koniec oczekujac na kolejne zbocze opadajace wywolane mysza w taki sam sposób.

Rys.14. Obsluga linii wejsciowych w trybie przerwania zewnetrznego aktywnego zboczem opadajacym Polecenia

11. W przerwaniu odczytuj stan przycisków podlaczonych do linii 2 i 3 portu D i gdy przycisniete zapalaj odpowiadajace im diody.

12. Napisz program, który wyswietla binarnie na diodach numer kolejnego przycisniecia przycisku podlaczonego do linii 2 portu D (modulo 256). Stan przycisku odczytuj w

Technika mikroprocesorowa

31

przerwaniu. Po stwierdzeniu nacisniecia (puszczenia ) przycisku, a przed wykonaniem zwiazanych z tym procedur odczekaj okolo 50ms (aby ustalo drzenie styków).

8. TIMER 0 8-mio bitowy

Mikrokontroler AT90S8515 posiada dwa timery: 8-mio bitowy i 16-sto bitowy, wyposazone w niezalezne prescalery (dzielniki wstepne). 8-mio bitowy TIMER 0 moze zliczac impulsy zegarowe CK, impulsy zegarowe podzielone przez N w dzielniku wstepnym CK/N, zbocza narastajace lub opadajace na linii 0 portu B, jak wyspecyfikowano w rejestrze kontrolnym TCCR0 TIMER-a 0.

Rejestr kontrolny TIMER-a 0 – TCCR0

Bit 7 6 5 4 3 2 1 0 Nazwa - - - - - CS02 CS01 CS00

Odczyt/zapis R R R R R R/W R/W R/W Wartosc poczatkowa 0 0 0 0 0 0 0 0 Zródlo impulsów dla TIMER-a 0 CS02 CS01 CS00 Zródlo impulsów

0 0 0 Zatrzymanie TIMER-a 0

0 0 1 CK

0 1 0 CK/8

0 1 1 CK/64

1 0 0 CK/256

1 0 1 CK/1024

1 1 0 Zbocza opadajace na linii 0 portu B

1 1 1 Zbocza narastajace na linii 0 portu B

Zliczanie impulsów dokonywane jest „w góre” w rejestrze TCNT0 od wartosci poczatkowej ustawionej w tym rejestrze do przepelnienia, które wystepuje przy wartosci 28. Po przepelnieniu rejestr TCNT0 zapelnia sie zerami i kontynuowane jest zliczanie impulsów. Rejestr zliczania TIMER-a 0 – TCNT0

Bit 7 6 5 4 3 2 1 0 Nazwa MSB - - - - - - LSB

Odczyt/zapis R/W R/W R/W R/W R/W R/W R/W R/W Wartosc poczatkowa 0 0 0 0 0 0 0 0

Technika mikroprocesorowa

32

Maska przerwania TIMER-a 0 znajduje sie w rejestrze masek timerów TIMSK Rejestr masek timerów – TIMSK

Bit 7 6 5 4 3 2 1 0 Nazwa TOIE1 OCIE1A OCIE1 - TICIE1 - TOIE0 -

Odczyt/zapis R/W R/W R/W R R/W R R/W R Wartosc poczatkowa 0 0 0 0 0 0 0 0 Bit 1 – TOIE0: maska przerwania wywolywanego przepelnieniem TIMER-a 0 Gdy bit TOIE0 jest ustawiony w stan logicznej 1 oraz bit I w rejestrze SREG jest ustawiony w stan logicznej 1 nastepuje wlaczenie przerwania wywolanego przepelnieniem TIMER-a 0. Wówczas przepelnienie liczacego timera i towarzyszace mu ustawienie flagi przepelnienia TOV0 w rejestrze flagowym timerów TIFR powoduje wykonanie procedury przerwania od adresu $007. Flaga przepelnienia TIMER-a 0 znajduje sie w rejestrze flagowym timerów TIFR. Rejestr flagowy timerów – TIFR

Bit 7 6 5 4 3 2 1 0 Nazwa TOV1 OCF1A OCF1B - ICF1 - TOV0 -

Odczyt/zapis R/W R/W R/W R R/W R R/W R Wartosc poczatkowa 0 0 0 0 0 0 0 0 Bit 1 – TOV0: flaga przepelnienia TIMER-a 0 Bit TOV0 zostaje ustawiony w stan logicznej 1, gdy nastapi przepelnienie liczacego TIMER-a 0. Bit TOV0 jest zerowany sprzetowo podczas wykonywania procedury obslugi przerwania. Alternatywnie mozna wyzerowac bit TOV0 programowo przez wpisanie logicznej 1 do pozycji tej flagi. Jesli w chwili przepelnienia timera (i ustawienia flagi TOV0) byl ustawiony w stan logicznej 1 bit I w rejestrze SREG oraz zdjeta maska TOIE0 przerwania, to bedzie wykonywana procedura przerwania.

8.1. Przyklad programowej obslugi przepelnienia timera Uruchom TIMER 0 w trybie zliczania do przepelnienia z prescalerem równym 1. Nie aktywuj przerwania timera (nie zdejmuj maski). W petli sprawdzaj wartosc flagi przepelnienia. Gdy flaga przepelnienia sie ustawi wyzeruj ja i zatrzymaj timer.

Wybór prescalera Ldi r16, 0b00000001 lub ldi r16, 1<<cs00 Out tccr0, r16 petla:

Wczytanie rejestru flagowego tifr In r16, tifr

Pomin 1 rozkaz, jesli bit tov0 w rejestrze r16 jest ustawiony w stan logicznej 1 sbrs r16, tov0

Powrót w petle, jesli flaga tov0 nie jest ustawiona rjmp petla

Technika mikroprocesorowa

33

Przejscie dalej, gdy flaga tov0 zostanie ustawiona i wyzerowanie jej przez wpisanie logicznej 1 na pozycje tov0 w rejestrze tifr

out tifr, r16

Zatrzymanie timera Ldi r16, 0 Out tccr0, r16 koniec: rjmp koniec Wykonaj symulacje. Zwróc uwage na sprzetowe ustawienie flagi tov0 po przepelnieniu timera oraz jej zerowanie rozkazem out tifr, r16, który w tym przypadku dokonuje kopiowania zawartosci rejestru flagowego tifr na ten sam rejestr.

Rys.15. Programowa obsluga przepelnienia timera

8.2. Przyklad sprzetowej obslugi przepelnienia timera (wlaczenie przerwania timera) Uruchom TIMER 0 w trybie zliczania do przepelnienia z prescalerem równym 1. Aktywuj przerwania timera spowodowane przepelnieniem (zdejmij maske). W przerwaniu timera nie wykonuj zadnych rozkazów (wylacznie rozkazy puste nop).

Wybór prescalera ldi r16, 0b00000001 lub ldi r16, 1<<cs00 out tccr0, r16

Technika mikroprocesorowa

34

Zdjecie maski przerwania TIMER-a 0 ldi r16, 0b00000010 lub ldi r16, 1<<toie0 out timsk, r16

Zezwolenie na przerwania sei koniec: rjmp koniec

Procedura przerwania TIMER-a 0 Tim0_ovf:

Rozkaz pusty nop

Powrót z przerwania reti Uruchom symulacje w trybie Auto-step. Zwróc uwage na nastepujace fakty:

− Po przepelnieniu timera program skacze do adresu $0007, a stamtad do procedury przerwania odkladajac adres powrotu na stos. Po spotkaniu rozkazu reti program podejmuje ze stosu adres powrotu do punktu wyjscia w watku glównym ( w tym przypadku jest to adres etykiety koniec:)

− Po przepelnieniu timer nie przestaje liczyc, a rejestr liczacy timera tcnt0 zapelnia sie zerami.

− Flaga przepelnienia timera jest ustawiana i zerowana sprzetowo w tym samym cyklu zegarowym, dzieki czemu nie trzeba jej obslugiwac programowo.

− Sztuczne wywolanie przerwania w trakcie symulacji mozna uzyskac ustawiajac flage tov0 przez zaczernienie jej pozycji mysza.

Technika mikroprocesorowa

35

Rys.16. Aktywacja przerwania timera Polecenia 13. Wyswietlaj binarnie na diodach (modulo 28) numer kolejnego przepelnienia TIMER-a 0.

W tym celu: − Uruchom TIMER 0 z prescalerem 1024 − Zdejmij maske przerwania TIMER-a 0 − skonfiguruj 8 diod i po resecie wszystkie zapal − przeznacz 1 rejestr na licznik, w którym bedzie zliczana liczba przepelnien TIMER-a

0 − w przerwaniu inkrementuj licznik i jego zawartosc podaj na linie wyjsciowe (diody)

14. Kazdym nieparzystym nacisnieciem przycisku (linia 2 portu D) wlaczaj funkcje zdefiniowana w poleceniu 14, a kazdym parzystym nacisnieciem przycisku wylaczaj te funkcje. Stan przycisku czytaj w przerwaniu. W tym celu: − Wlacz i skonfiguruj przerwanie zewnetrzne zerowe INT0 aktywujac je zboczem

opadajacym impulsu − Wlacz TIMER 0 z prescalerem 1024 i wlacz jego przerwanie − Zalóz, ze rejestr 20 bedzie licznikiem liczby przepelnien TIMER-a 0, natomiast rejestr

21 bedzie przechowywal wartosc 0 dla parzystych nacisniec przycisku, a wartosc 1 dla nieparzystych.

− W procedurze przerwania INT0 zakladaj maske przerwania TIMER 0 w przypadku przycisniec nieparzystych, a zdejmuj przy parzystych.

9. Korzystanie z dyrektyw asemblera

Technika mikroprocesorowa

36

Dyrektywy okreslajace obszar pamieci: − .cseg poprzedza kod zródlowy (odnosi sie do pamieci FLASH programu mikrokontrolera) − .dseg poprzedza dyrektywy, które rozporzadzaja pamiecia RAM danych mikrokontrolera − .eseg poprzedza dyrektywy, które rozporzadzaja pamiecia EEPROM danych

mikrokontrolera Dyrektywa wskazujaca na adres w pamieci FLASH, RAM lub EEPROM − .org wskazuje na adres w pamieci FLASH ze skokiem 2 (poniewaz slowa w pamieci

FLASH sa dwubajtowe lub na adres w pamieci RAM lub EEPROM ze skokiem 1 (poniewaz slowa w pamieci RAM i EEPROM sa jednobajtowe)

Rezerwacja obszaru w pamieci RAM lub EEEPROM − .byte umieszczona pod dyrektywa .dseg lub .eseg rezerwuje wskazana liczbe komórek

pamieci. Adres poczatkowy zarezerwowanego zakresu nie jest znany i jest przydzielany automatycznie przez kompilator (pierwszy wolny).

Wczytanie biblioteki procesora − .include wczytanie biblioteki procesora, dyrektywa umieszczana na poczatku kodu

zródlowego Definiowanie stalej − .equ przypisanie do nazwy stalej wartosci, do nazwy zdefiniowanej ta dyrektywa nie

mozna przypisac innej wartosci Definiowanie zmiennej − .set przypisanie do nazwy zmiennej wartosci, dyrektywa .set moze byc w programie

uzywana wielokrotnie przypisujac rózne wartosci do tej samej nazwy Przypisanie nazwy rejestrowi roboczemu − .def przypisuje rejestrowi roboczemu nazwe przerznie odzwierciedlajaca jego funkcje w

programie, rejestr moze miec wiele nazw Dyrektywa pozwalajace umiescic stale w pamieci programu FLASH lub pamieci danych EEPROM − .db stala bajtowa (8 bitów) − .dw stala dwubajtowa (16 bitów) Przyklady Umieszczenie procedury obslugi przerwania zewnetrznego INT0 w pamieci FLASH pod adresem $0001 .cseg …… .org $0001 rjmp interrupt_INT0 Rezerwacja w pamieci RAM obszaru o pojemnosci 10 bajtów poczynajac od 1-szego wolnego adresu .dseg Bufor: .byte 10

Technika mikroprocesorowa

37

Rezerwacja w pamieci RAM obszaru o pojemnosci 10 bajtów poczynajac od adresu $0090 .dseg .org $0090 Bufor: .byte 10 Zdefiniowanie stalej, zmiennej przypisanie nazwy rejestrowi .cseg .equ to_stala = 8 .set to_zmienna = 7 .def licznik = r19 Umieszczenie stalych w kodzie programu pod 1-szym wolnym adresem .cseg Liczby_8bitowe: .db 120, -20, 0x45, 0b01010101 Znaki ASCII: .db ‘a’, ‘b’, ‘c’ Lancuch: .db „to jest tekst” Liczby_16bitowe: .dw 1200, -2000, 0x4535 Umieszczenie stalych w pamieci EEPROM pod wskazanym adresem .eseg .org $0010 Liczby_8bitowe: .db 120, -20, 0x45, 0b01010101 Znaki ASCII: .db ‘a’, ‘b’, ‘c’ Lancuch: .db „to jest tekst” Liczby_16bitowe: .dw 1200, -2000, 0x4535

10. Sposoby adresowania pamieci RAM

RAM wewnetrzny kontrolera AT90S8515 rozciaga sie od adresu $0060 do adresu $025F. Na magistrali równoleglej mozna podlaczyc RAM zewnetrzny, który rozpoczyna sie od adresu $0260 i przy maksymalnej wielkosci 64kbajtów (mozliwej do zaadresowania w trybie 16-bitowym) konczy sie na adresie $FFFF.

Proces zapisu i odczytu pamieci RAM wewnetrznej oraz zewnetrznej umieszczonej na magistrali równoleglej przebiega bardzo szybko, nie przekracza kilkuset ns/bajt.

Pamiec RAM jest ulotna, traci zawartosc po wylaczeniu napiecia zasilania.

Komórki pamieci RAM sa adresowane w trybie 16-bitowym. W tym trybie procesor moze zaadresowac 216 komórek pamieci. Nalezy pamietac o tym, ze dane umieszczane w komórkach pamieci mikrokontrolera AT90S8515 sa liczbami 8-mio bitowymi.

Pamiec RAM moze byc adresowana bezposrednio przez podanie adresu w postaci 16-bitowej liczby lub posrednio z wykorzystaniem 16-bitowych rejestrów X, Y lub Z.

Adresowanie posrednie odbywa sie z udzialem rejestrów X, Y, Z. Rejestr X sklada sie z rejestrów r27 (starszy bajt rejestru X) i r26 (mlodszy bajt rejestru X). Rejestr Y sklada sie z rejestrów r29 (starszy bajt rejestru Y) i r28 (mlodszy bajt rejestru Y). Rejestr Z sklada sie z rejestrów r31 (starszy bajt rejestru Z) i r30 (mlodszy bajt rejestru Z).

Technika mikroprocesorowa

38

Zapis i odczyt pamieci z wykorzystaniem rejestrów Y i Z umozliwia wykonanie operacji z offsetem. Zapis i odczyt pamieci z wykorzystaniem rejestru X nie umozliwia wykonania operacji z offsetem.

10.1. Przyklady adresowania bezposredniego i posredniego Bezposrednie adresowanie pamieci RAM ldi r2, 0xAA zapisz liczbe 0xaa do rejestru 2 sts $0060, r2 przepisz zawartosc rejestru 2 do RAM-u pod adres $0060 lds r3, $0600 przepisz zawartosc komórki RAM-u o adresie $0600 do rejestru 3.

Posrednie adresowanie pamieci RAM clr r27 przygotowanie adresu wpisu w rejestrach r27 ($00) i r26 ($60) ldi r26, $60 lacznie nazywanych rejestrem X ldi r16, 0x01 przygotowanie liczby do wpisania w rejestrze r16 ($01) st X+, r16 zapisanie liczby pod adresem $0060 z post- inkrementacja adresu ldi r27, 0x01 przygotowanie adresu odczytu w rejestrach r27 ($00) i r26 ($60) ldi r26, 0x61 lacznie nazywanych rejestrem X ld r16, −X odczyt spod adresu $0161 z pre-dekrementacja adresu (czyli spod

adresu $0160) i wpis odczytanej liczby do rejestru r16 ldi r16, 64 ldi yh, high($0080) przygotowanie adresu wpisu w rejestrach r29 ($00) i r28 ($80) ldi yl, low($0080) lacznie nazywanych rejestrem Y st Y, r16 zapis liczby z rejestru 16 po adres $0080 ldi xh, high($0080) przygotowanie adresu odczytu w rejestrach r27 ($00) i r26 ($80) ldi xl, low($0080) lacznie nazywanych rejestrem X ld r16, X odczyt spod adresu $0080 i wpis odczytanej liczby do rejestru r16 clr r29 przygotowanie adresu wpisu w rejestrach r29 ($00) i r28 ($60) ldi r28, $60 lacznie nazywanych rejestrem Y ldi r16, 0x01 przygotowanie liczby do wpisu w rejestrze r16 ($001) std Y+2, r16 wpisanie liczby pod adres $0060 z offsetem 2 (czyli adres $0062), przy

czym po operacji Y nadal wskazuje na adres $0060

ldi r29, 0x01 przygotowanie adresu odczytu w rejestrach r27 ($00) i r26 ($60) ldi r28, 0x60 lacznie nazywanych rejestrem X ld r16, Y+3 odczyt spod adresu $0160 z offsetem 3 (czyli adres $0163) i wpis

Technika mikroprocesorowa

39

odczytanej liczby do rejestru r16, przy czym po operacji Y nadal wskazuje na adres $0060

Polecenia 15. Do RAM-u pod adresy od $0070 do $0074 wpisz 5 roznych liczb. Odczytaj liczby spod

adresów od $0070 do $0074 przepisujac je do rejestrów r16 – r20. 16. Do RAM-u pod adresy od $0070 do $0079 wpisz znaki ASCII kolejnych cyfr od 0 do 9.

Przyklad: ldi r16, ‘0’ wpisanie znaku ASCII cyfry 0 do rejestru 16. Sprawdz w pamieci RAM, jaka jest wartosc liczbowa znaków ASCII cyfr.

10.2. Przyklad zapisu i odczytu rejestru 16-sto bitowego W procesie zapisu lub odczytu do rejestru 16-sto bitowego jednoczesny dostep do jego czesci skladowych jest mozliwy przy wykorzystaniu rejestru tymczasowego TEMP. zapis Gdy jednostka centralna wpisuje 8-bitowa liczbe do czesci H (starszej) rejestru docelowego liczba ta jest „de facto” umieszczana w rejestrze TEMP. Nastepnie, gdy jednostka centralna wpisuje 8-bitowa liczbe do czesci L (mlodszej) rejestru docelowego liczba ta jest laczona z 8-bitowa liczba z rejestru TEMP i cala 16-bitowa liczba jest wpisywana do rejestru docelowego. Wynika z tego, ze w procesie zapisu do rejestru 16-sto bitowego bajt H (starszy) musi byc zaadresowany jako pierwszy. W przykladzie starszy bajt adresu bufora zostaje zapisany w starszej czesci rejestru x, natomiast mlodszy bajt adresu bufora zostaje zapisany w mlodszej czesci rejestru x. Ldi xh, high(bufor) Ldi xl, low(bufor) odczyt Z tych samych powodów w procesie odczytu rejestru 16-sto bitowego bajt L (mlodszy) musi zostac zaadresowany jako pierwszy. W przykladzie mlodszy bajt rejestru x zostaje zapisany rejestrze r16, natomiast starszy bajt rejestru x zostaje zapisany rejestrze r17. mov r16, x l mov r17, xh

10.3. Zapis i odczyt bufora metoda adresowania posredniego − Zalóz w pamieci RAM bufor o pojemnosci 20-stu znaków. − W 1-szej petli zapelnij bufor liczbami od 1 do 20 wykorzystujac wpis z post-

inkrementacja adresu. − W 2-giej petli wyzeruj wszystkie komórki bufora wykorzystujac wpis z pre-

dekrementacja adresu. − Wpisz liczbe 5 na 10-ta pozycje bufora wykorzystujac offset adresowy. − Odczytaj 10-ta pozycje bufora wykorzystujac offset adresowy.

Zalozenie bufora

Technika mikroprocesorowa

40

.dseg Bufor: .byte 10 .cseg …….

Ustawienie wskaznika adresowego Y na poczatku bufora Ldi yh, high(bufor) Ldi yl, low(bufor)

Wpisanie liczby 0 do rejestru 16 Ldi r16, 0

Wpisanie liczby 20 do licznika obejsc petli Ldi licznik, 20 Petla1:

Inkrementacja liczby wpisywanej, w ten sposób w kolejnych komórkach RAM-u znajda sie liczby 1, 2, 3 itd.

Inc r16 Wpisanie liczby do bufora w RAM-ie z post inkrementacja adresu

St y+, r16 Dekrementacja licznika obejsc petli

Dec licznik Sprawdzenie, czy licznik osiagnal zero, jesli nie to powrót w petle

Brne petla1

W tym punkcie wskaznik adresu stoi na koncu bufora. Wykonujac kolejne polecenie wyzerowania wszystkich komórek bufora wykorzystamy pre-dekrementacje adresu od pozycji koncowej do poczatkowej w buforze.

Wpisanie 0 do rejestru 16

Ldi r16, 0 Wpisanie 20 do licznika obejsc petli

Ldi licznik, 20 Petla2:

Wpisanie liczby do bufora w RAM-ie z pre-dekrementacja adresu St − y, r16

Dekrementacja licznika obejsc petli Dec licznik

Sprawdzenie, czy licznik osiagnal zero, jesli nie to powrót w petle Brne petla2

Przed wykonaniem kolejnego polecenia wpisu pod adres z offsetem wskaznik do bufora nalezy ustawic na poczatku bufora.

Ustawienie wskaznika adresowego Y na poczatku bufora Ldi yh, high(bufor) Ldi yl, low(bufor)

Wpisanie liczby 5 do rejestru 16 Ldi r16, 5

Technika mikroprocesorowa

41

Wpisanie liczby 5 na 10-ta pozycje w buforze bez przesuwania wskaznika adresu Std y+10, r16

Odczyt 10-tej pozycji bufora z wpisem do rejestru 17. ldd r17, y+10 Wykonaj symulacje. Z Menu → View pobierz okienko Memory, na liscie rozwijalnej okienka wybierz DATA, co odpowiada pamieci RAM i ogladaj zawartosc bufora w trakcie symulacji krokowej. Bufor jest zakladany na poczatku RAM-u tj. od adresu $60, poniewaz caly RAM jest wolny.

Rys.17. Zapis i odczyt pamieci RAM Polecenia 17. Zalóz w RAM-ie trzy bufory o rozmiarze 20 kazdy: bufor1 i bufor2 i bufor_suma. Do

adresowania 3-ch zalozonych buforów wykorzystaj wskazniki adresowe X, Y, Z. Bufory 1 i 2 wypelnij jednakowymi liczbami. Odczytuj kolejne liczby z bufora 1 do rejestru 16, a z bufora2 do rejestru 17, sumuj je i umiesc w bufor_suma.

18. Wypelnij caly RAM wewnetrzny procesora tymi samymi liczbami. Odtad petle zerujaca RAM umieszczaj na poczatku kazdego programu, zaraz po ustawieniu wskaznika stosu.

11. Wyswietlacz LCD w przestrzeni adresowej

W ukladzie uruchomieniowym EVB-503 zaopatrzono w typowy wyswietlacz tekstowy ze sterownikiem HD4480. Wyswietlacz LCD jest sterowany za posrednictwem wybranych linii interfejsu równoleglego mikrokontrolera (na tym samym interfejsie jest

Technika mikroprocesorowa

42

podlaczona zewnetrzna pamiec RAM). Mikrokontroler widzi wyswietlacz LCD w przestrzeni adresowej, pod konkretnym adresem ustalonym sprzetowo. Impulsy niezbedne do sterowania wyswietlaczem sa generowane sprzetowo przez uklady RC, nie sa zatem potrzeby podawania ich programowo.

Ustawienie najstarszego bitu w rejestrze mcucr powoduje inicjalizacje obslugi 64k-bitowej przestrzeni adresowej. Ustawienie 6-tego bitu w rejestrze mcucr powoduje spowolnienie (o 1 impuls zegarowy) obslugi pamieci RAM, dostosowujac predkosc obslugi do mozliwosci pamieci.

Sterownik HD4480 posiada 128-mio znakowa pamiec danych DDRAM, przystosowana do obslugi dwóch linii wyswietlacza po maksymalnie 64 znaki w kazdej linii. Wyswietlacz zastosowany w zestawie EVB-503 ma 2 linie po 16-cie znaków w kazdej. Adresy pamieci danych DDRAM od 0 do 15 dotycza 16-stu pozycji widzialnych górnej linii, Adresy pamieci danych DDRAM od 16 do 63 dotycza 48-miu pozycji niewidzialnych górnej linii, Adresy pamieci danych DDRAM od 64 do 79 dotycza 16-stu pozycji widzialnych dolnej linii, Adresy pamieci danych DDRAM od 80 do 127 dotycza 48-miu pozycji niewidzialnych dolnej linii. Obsluga wyswietlacza polega na podaniu odpowiednich bajtów:

• komend pod adres komend LCD w przestrzeni adresowej • danych pod adres danych LCD w przestrzeni adresowej

W ukladzie uruchomieniowym EVB-503 wyswietlacz LCD jest sterowany przez interfejs 8-mio bitowy. Konfiguracja sprzetowa dekodera adresów determinuje adres dla komend o wartosci $1f90, i adres dla danych o wartosci o 1 wiekszej, czyli $1f91. Adresy te wygodnie jest zdefiniowac jako stale programu dyrektywa .equ (umieszczona w kodzie tj. w czesci .cseg). .equ komenda = $1f90 .equ dane = $1f91

11.1. Zestaw komend inicjalizujacych wyswietlacz LCD Zestaw komend obslugiwanych przez sterownik HD4480: (* oznacza dowolny stan) 0 0 1 D/L N F * * D/L liczba bitów danych interfejsu sterujacego : D/L=1 interfejs 8-bitowy, D/L=0 interfejs

4-bitowy, N liczba wyswietlanych linii: N=1 dwie linie, N=0 jedna linia F format znaku: F=1 znak 5*10 punktów, F=0 znak 5*7 punktów (czas wykonania 5ms) 0 0 0 1 S/C R/L * * S/C S/C=1 przesuwanie napisu bez zmiany zawartosci pamieci danych DDRAM

sterownika LCD, S/C=0 przesuwanie kursora bez zmiany zawartosci pamieci danych DDRAM sterownika LCD,

Technika mikroprocesorowa

43

R/L R/L=1 przesuwanie w prawo, R/L=0 przesuwanie w lewo

(czas wykonania120 us) 0 0 0 0 1 D C B D wlacza/wylacza wyswietlacz) C wlacza/wylacza kursor B wlacza/wylacza funkcje mrugania kursora (czas wykonania120 us) 0 0 0 0 0 1 I/D S I/D ustala kierunek przesuwu kursora: I/D = 1 w prawo, I/D = 0 w lewo S wlacza (S = 1) i wylacza (S = 0) funkcje przesuwu napisu podczas zapisu do pamieci

danych DDRAM sterownika (tj. podczas wyswietlania) (czas wykonania120 us) 0 0 0 0 0 0 1 *

ustawia kursor na pozycji poczatkowej (adres=0).Jesli napis byl przesuniety, ustawia go w pozycji oryginalnej. Pamiec danych DRRAM nie ulega zmianie.

(czas wykonania 5ms) 0 0 0 0 0 0 0 1

czysci wyswietlacz i ustawia kursor na adresie 0 pamieci danych DDRAM. (czas wykonania 5ms) 1 DD DD DD DD DD DD DD

ustawia adres pamieci danych DDRAM. (czas wykonania120 us) Przykladowy zestaw komend inicjujacych wyswietlacza LCD ze sterownikiem HD4480: .equ komenda=$1F90 .equ dane=$1F91 − wlaczenie obslugi przestrzeni adresowej ldi r16, 0xc0 out mcucr, r16 ldi YH, high (komenda) ldi YL, low (komenda) − 8-mio bitowy interfejs sterujacy, 2 linie, znak 5*7 punktów (komenda podawana 3 razy) ldi r16, 0x38 st Y, r16 rcall czas_5ms ldi r16, 0x38 st Y, r16 rcall czas_5ms ldi r16, 0x38 st Y, r16

Technika mikroprocesorowa

44

rcall czas_5ms − Przesuwanie kursora o 1 w prawo po wyswietleniu kolejnego znaku (tj. po zapisaniu

kolejnego znaku pamieci danych DDRAM) ldi r16, 0x14 st Y, r16 rcall czas_120us − Wlaczenie wyswietlacza, kursora niewidzialny ldi r16, 0x0c st Y, r16 rcall czas_120us − Wylaczona funkcja przesuwu napisu podczas wyswietlania znaków, czyli zapisu do

pamieci danych DDRAM ldi r16, 0x06 st Y, r16 rcall czas_120us − Wyczyszczenie wyswietlacza, ustawienie adresu pamieci danych DDRAM na pozycji 0

(górna linia, lewy skraj) ldi r16, 0x01 st Y, r16 rcall czas_5ms − Ustawienie adresu pamieci danych DDRAM tj. adresu poczatkowego wyswietlania

znaków tu: (górna linia, lewy skraj) ldi r16, 0x80 st Y, r16 rcall czas_120us Dane do wyswietlania musza byc podawane w formacie ASCII. Przyklad wyswietlania litery A (czas wykonania 120us): ldi YH, high (dane) ldi YL, low (dane) ldi r16, ‘A’ lub ldi r16, 0x41 ;0x41 jest kodem ASCII litery A st Y, r16 rcall czas Po wyswietleniu znaku sterownik HD4480 automatycznie inkrementuje adres pamieci danych DDRAM, zatem kolejny wyswietlany znak trafia na kolejna pozycje na LCD. Nie nalezy czyscic wyswietlacza, jesli planowane jest nadpisanie starych znaków nowymi, gdyz powoduje to „mruganie” znaków.

11.2. Przyklad wyswietlania znaków W 1-szej linii wyswietl slowo lekcja pobierajac poszczególne znaki napisu z komórek

RAMu. Symulacje mozna wykonac tylko w ograniczonym zakresie. Nie mozna obejrzec zawartosci komórek w zewnetrznej przestrzeni adresowej np. lokacji $1f90 i $1f91, które zapisujemy komendami i danymi do wyswietlenia.

Technika mikroprocesorowa

45

Wykonujac symulacje krokowo przeskakuj podprogramy (F10). Zwróc uwage na: − wpis slowa lekcja do bufora w RAM-ie wewnetrznym − inkrementacje wskaznika x do bufora (rejestry r26 i r27) w trakcie pobierania liter wyrazu − brak inkrementacji wskaznika y (rejestry r29 i r28) do lokacji danych wyswietlacza –

wskaznik ten jest inkrementowany sprzetowo przez sterownik HD4480.

Rys.18. Wyswietlanie znaków pobranych z pamieci RAM Polecenia 19. Wpisz do bufora zalozonego w pamieci RAM 10 znaków ASCII i wyswietl je na LCD: w

drugiej linii, w drugiej linii od trzeciej pozycji. 20. Wpisz do bufora zalozonego w pamieci RAM 40 kolejnych znaków ASCII (z zakresu od

0x31 do 0x6f).Wpisu dokonaj metoda adresowania posredniego z inkrementacja liczby wpisywanej. Wyswietl wszystkie znaki na LCD w pierwszej linii od lewej skrajnej pozycji. Po 20-stu sekundach od wyswietlenia ostatniego znaku rozpocznij powolny obrót napisu, aby po kolejnych kilku sekundach zobaczyc jego koniec.

21. Napisz program, który po nacisnieciu przycisku podlaczonego na wybranej linii portu D

wysyla na wyswietlacz znak ASCII litery zwiazanej z tym przyciskiem np. przyciskowi podlaczonemu na linii 0 portu D odpowiada litera A, przyciskowi podlaczonemu na linii 1 portu D odpowiada litera B itd.

11.3. Przyklad pobierania stalych umieszczonych w kodzie programu Dyrektywa .db rezerwuje przestrzen w pamieci FLASH programu na zapisanie stalych. Adres pierwszej komórki zarezerwowanej przestrzeni przechowywany jest przez etykiete

Technika mikroprocesorowa

46

poprzedzajaca dyrektywe .db Stale: .db 0,1,2,3,4,5,6,7,8,9,10 Napis: .db „to jest napis” − W pamieci programu slowa sa dwubajtowe, natomiast w pamieci danych jednobajtowe,

dlatego dla ustalenia wlasciwego adresu pobierania znaków z pamieci programu adres etykiety musi byc mnozony razy 2. 16-sto bitowy rejestr Z przechowuje adres do etykiety napis.

ldi ZH, high(napis*2) ldi ZL, low(napis*2) − Ustalenie wartosci poczatkowej licznika obejsc petli ldi licznik, 10 − Ustawienie wskaznika do danych wyswietlacza ldi YH, high(dane) ldi YL, low(dane) petla: − Instrukcja lpm odczytuje z pamieci programu stala (na która wskazuje adres

przechowywany przez rejestr Z) i przepisuje ja do rejestru r0. lpm odczyt stalej spod adresu Z i wpisanie jej do rejestru r0 mov r16, r0 kopiuje znak do rejestru r16 st Y, r16 wyswietla znak rcall delay wywoluje podprogram opózniajacy − Instrukcja adiw inkrementuje adres odczytu zapewniajac prawidlowe przeniesienie

miedzy czesciami ZL i ZH rejestru adresowego. adiw ZL,1 dec licznik dekrementuje licznik brne petla Polecenia 22. Gdy TIMER 0 z prescalerem 1024 przepelni sie wyswietl napis : ”***Wesolych

Swiat***” .

12. Definiowanie polskich znaków na wyswietlaczu LCD

Pamiec sterownika HDD4480 pozwala na przechowywanie obrazu 8-miu samodzielnie zdefiniowanych znaków. W systemie 5*7 punktów obraz kazdego znaku sklada sie 8-miu 8-mio bitowych slów (bajtów) reprezentujacych 8 linii rysunku znaku w tym: 7 linii samego znaku i 1 linia podstawy (linia pod znakiem).

Technika mikroprocesorowa

47

Obraz znaku „c” mozna zakodowac w postaci 8-miu slów przedstawionych w tabeli xx??????? Rysunek znaku „c”

Znak c Slowa obrazu znaku

O O O V O 00000010 = 2

O O V O O 00000100 = 4

O V V V O 00001110 = 14

V O O O O 00010000 = 16

V O O O O 00010000 = 16

V O O O V 00010001 = 17

O V V V O 00001110 = 14

O O O O O 00000000 = 0

W podobny sposób mozna kodowac inne znaki np. polskie. Kody samodzielnie zdefiniowanych znaków wygodnie jest przechowac w kodzie zródlowym programu. Przyklad przechowania kodów wybranych znaków w kodzie zródlowym programu (np.: c, e, S, Z) Znak_c: .db 2 ,4, 14, 16, 16, 17, 14, 0 Znak_e: .db 0, 0, 14, 17, 31, 16, 14, 2 Znak_SS: .db 2, 14, 16, 14, 1, 1, 30, 0 Znak_ZZ: .db 31, 1, 2, 14, 8, 16, 31, 0

Przed uzyciem samodzielnie zdefiniowanych znaków kody tych znaków nalezy wpisac do pamieci CGRAM sterownika, pod adresami: 0x40 – 0x47 (1-szy znak), 0x48 – 0x4f (2-gi znak), 0x50 – 0x57 (3-ci znak) itd. do 8-miu.

Przy pobieraniu kodu znaku z pamieci CGRAM sterownika adres pobierania nalezy zmniejszyc o wartosc 0x40 w stosunku do adresu wpisania kodu znaku tzn. 1-szy wpisany znak nalezy pobrac spod adresu 0x00, 2-gi spod adresu 0x80, 3-ci 0x10, 4-ty 0x18 itd. Wyswietlenie tekstu z polskimi znakami nalezy wykonac w nastepujacym porzadku: − Sprawdz, jakie znaki polskie w formacie ASCII) wystepuja w analizowanym tekscie − Kod kazdego napotkanego znaku (do 8-miu) wpisz do CGRAM-u pod kolejny adres − Wyswietlaj znaki po kolei, za kazdym razem sprawdzajac, czy mamy do czynienia ze

znakiem polskim – jesli tak, to jego kod pobierz z CGRAM-u. Kody ASCII polskich znaków

Znak polski Kod ASCII znaku

A $A5

Technika mikroprocesorowa

48

C $C6

E $CA

L $A3

N $D1

Ó $D3

S $8C

Z $AF

Z $8F

a $B9

c $E6

e $EA

l $B3

n $F1

ó $F3

s $9C

z $BF

z $9F

12.1. Przyklad zapisu kodu znaku „c” do pamieci CGRAM sterownika LCD

Ustawienie wskaznika adresowego z 1-szym z 8-miu bajtów kodujacych litere c Ldi zh, high(Znak_c) Ldi zl, low(Znak_c)

Ustawienie adresu wpisu do CGRAM-u na 0x40 (adres 1-szego znaku w CGRAM-ie) Ldi yh, high(komenda) Ldi yl, low(komenda) Ldi r16, 0x40 St y, r16 Rcall czas

Petla wpisujaca 8 bajtów kodujacych znak (tu: litere c) Ldi licznik, 8 Wpisz: Ldi yh, high(dane) Ldi yl, low(dane) lpm

Technika mikroprocesorowa

49

St y, r0 Rcall czas Adiw zl, 1 Dec licznik Brne wpisz

12.2. Przyklad wyswietlania tekstu z polskimi znakami zapisanymi w pamieci CGRAM

W przykladzie zostaje przeanalizowany tekst o 15-stu znakach. Kolejne znaki sa przepisywane z kodu zródlowego programu do bufora „dane”, przy czym kody ASCII znaków polskich po rozpoznaniu sa zastepowane kodami znaków pobranymi z CGRAM-u. W wyniku procesu w buforze znajdzie sie 15 znaków gotowych do wyswietlenia na LCD. Tekst: .db „to jest tekst analizowany”

Poszukiwanie kodów ASCII znaków polskich w tekscie Ldi liczba_znakow, 15 szukaj: lpm mov r16, r0 cpi r16, $e6 breq to_znak_c cpi r16, $ea breq to_znak_e cpi r16, $8c breq to_znak_SS cpi r16, $8f breq to_znak_ZZ

Sprawdzany znak nie jest znakiem polskim Ldi yh, high(dane) Ldi yl, low(dane) St y, r16 Adiw zl, 1 Dec liczba_znakow Brne szukaj Rjmp dal1 to_znak_c:

Sprawdzany znak jest polskim znakiem „c”, który nalezy pobrac z CGRAM-u spod adresu 0x00

Ldi yh, high(dane) Ldi yl, low(dane) Ldi r16, 0x00

Technika mikroprocesorowa

50

St y, r16 Rjmp dal2 to_znak_e:

Sprawdzany znak jest polskim znakiem „e”, który nalezy pobrac z CGRAM-u spod adresu 0x08

Ldi yh, high(dane) Ldi yl, low(dane) Ldi r16, 0x08 St y, r16 Rjmp dal2 to_znak_S:

Sprawdzany znak jest polskim znakiem „S”, który nalezy pobrac z CGRAM-u spod adresu 0x10

Ldi yh, high(dane) Ldi yl, low(dane) Ldi r16, 0x10 St y, r16 Rjmp dal2 to_znak_ZZ:

Sprawdzany znak jest polskim znakiem „Z”, który nalezy pobrac z CGRAM-u spod adresu 0x18

Ldi yh, high(dane) Ldi yl, low(dane) Ldi r16, 0x18 St y, r16 Rjmp dal2 Dal2: Adiw zl, 1 Dec liczba_znakow Brne szukaj Dal1:

Wyswietlaj znaki na LCD pobierajac je z bufora „dane” Polecenia 23. Zdefiniuj wybrany znak polski inny niz podano w przykladach. Wpisz jego definicje do

CGRAM-u umiesc go w tekscie i wyswietl na LCD.

13. TIMER 1 16-sto bitowy

TIMER 1 liczy w trybie 16-bitowym. Zliczanie odbywa sie w 16-bitowym rejestrze TCNT1. Rejestr TCNT1 sklada sie z dwóch rejestrów 8-bitowych: starszego TCNT1H oraz mlodszego TCNT1L. W procesie zapisu oraz odczytu z rejestru TCNT1 jednoczesny dostep do jego czesci skladowych jest mozliwy przy wykorzystaniu rejestru tymczasowego TEMP.

Technika mikroprocesorowa

51

Rejestr zliczania TIMER-a 1 (czesc starsza – TCNT1H, czesc mlodsza TCNT1L)

Bit 15 14 13 12 11 10 9 8 Nazwa MSB Nazwa LSB

Odczyt/zapis

7 R/W

6 R/W

5 R/W

4 R/W

3 R/W

2 R/W

1 R/W

0 R/W

Wartosc poczatkowa

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

0 0 0 0 0 0 0 0

Wybór kroku TIMER-a 1 dokonywany jest bitami CS10, CS11 i CS12 w rejestrze TCCR1B. Krok timera moze byc równy czestotliwosci zegara kwarcowego podzielonego w prescalerze przez 1, 8, 64, 256, 1024. Alternatywnie TIMER 1 moze liczyc zbocza opadajace lub narastajace na linii T1 (linia 1 portu B).

TIMER 1 moze pracowac w jednym z trzech trybów:

• Zliczanie od wartosci poczatkowej zadanej w rejestrze TCNT1 do przepelnienia. W tym trybie przerwanie (jesli wlaczone) nastepuje po przepelnieniu sie rejestru liczacego.

• Zliczanie od wartosci poczatkowej zadanej w rejestrze TCNT1 do wartosci zadanej w rejestrze OCR1A lub OCR1B. W tym trybie przerwanie (jesli wlaczone) nastepuje po zrównaniu zawartosci rejestru liczacego z jednym z rejestrów OCR1A lub OCR1B.

• Zliczanie od wartosci poczatkowej zadanej w rejestrze TCNT1 do pojawienia sie zbocza na linii wejsciowej ICP. W chwili pojawienia sie zbocza na linii ICP aktualny stan rejestru liczacego TCNT1 zostaje zapamietany (przechwycony) w rejestrze ICR1. W tym trybie przerwanie (jesli wlaczone) nastepuje po przejsciu zbocza na linii wejsciowej ICP.

Wartosc do porównania zadaje sie w rejestrze 16-bitowym OCR1A, którego 8-mio bitowe czesci nosza nazwy: starsza OCR1A H i mlodsza OCR1AL lub w 16-bitowym rejestrze OCR1B, którego 8-mio bitowe czesci nosza nazwy: starsza OCR1BH i mlodsza OCR1BL. Jako przyklad przedstawiono czesci rejestru OCR1A. Rejestr porównania OCR1A (czesc starsza – OCR1AH, czesc mlodsza –OCR1AL)

Bit 15 14 13 12 11 10 9 8 Nazwa MSB Nazwa LSB

Odczyt/zapis

7 R/W

6 R/W

5 R/W

4 R/W

3 R/W

2 R/W

1 R/W

0 R/W

Wartosc poczatkowa

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

0 0 0 0 0 0 0 0 Wpis liczby 16-bitowej np. 20000 do rejestru 16-bitowego OCR1A realizuje sie zapisujac oddzielnie starsze i mlodsze 8 bitów tej liczby do odpowiednio starszej i mlodszej czesci rejestru OCR1A. Ldi r16, high(20000)

Technika mikroprocesorowa

52

Out OCR1AH, r16 Ldi r16, low(20000) Out OCR1AL, r16 Flagi statusowe sygnalizujace wystapienie jednego z trzech zdarzen dla TIMER-a 1 (przepelnienie, porównanie lub przechwyt) znajduja sie w rejestrze flagowym TIFR. Rejestr flagowy timerów – TIFR

Bit 7 6 5 4 3 2 1 0 Nazwa TOV1 OCF1A OCF1B - ICF1 - TOV0 -

Odczyt/zapis R/W R/W R/W R R/W R R/W R Wartosc poczatkowa 0 0 0 0 0 0 0 0 Bit 7 – TOV1: flaga przepelnienia rejestru liczacego TCNT1 TIMER-a 1 Przepelnienie 16-bitowego rejestru liczacego TCNT1 powoduje ustawienie flagi przepelnienia TOV1 w rejestrze TIFR. W nastepnym kroku rejestr TCNT1 zostaje wyzerowany, a TIMER 1 kontynuuje zliczanie. Flaga przepelnienia TIMER-a 1 moze zostac wyzerowana programowo przez wpisanie do jej lokacji logicznej1.

Przepelnienie TIMER-a 1 powoduje skok do adresu przerwania $006 pod warunkiem, ze przerwanie spowodowane przepelnieniem TIMER-a 1 zostalo wlaczone przez ustawienie bitu maski TOIE1 w rejestrze TIMSK (oraz bitu I globalnego wlaczenia przerwan w rejestrze SREG). Flaga przepelnienia TIMER-a 1 TOV1 w rejestrze TIFR zostaje wyzerowana sprzetowo w chwili skoku do procedury przerwania.

Bit 6 – OCF1A: flaga zrównania rejestru liczacego TCNT1 TIMER-a 1 z rejestrem OCR1A Zrównanie zawartosci rejestru liczacego TIMER-a 1 TCNT1 z zawartoscia rejestru OCR1A powoduje ustawienie flagi OCF1A w rejestrze TIFR. Flaga OCF1A moze zostac wyzerowana programowo przez wpisanie do jej lokacji logicznej1.

Zrównanie zawartosci rejestru liczacego TIMER-a 1 TCNT1 z zawartoscia rejestru OCR1A powoduje skok do adresu przerwania $004 pod warunkiem, ze przerwanie spowodowane powyzszym zrównaniem zostalo wlaczone przez ustawienie bitu maski OCIE1A w rejestrze TIMSK (oraz bitu I globalnego wlaczenia przerwan w rejestrze SREG). Flaga przepelnienia TIMER-a 1 OCF1A w rejestrze TIFR zostaje wyzerowana sprzetowo w chwili skoku do procedury przerwania

Bit 5 – OCF1B: flaga zrównania rejestru liczacego TCNT1 TIMER-a 1 z rejestrem OCR1B Zrównanie zawartosci rejestru liczacego TIMER-a 1 TCNT1 z zawartoscia rejestru OCR1B powoduje ustawienie flagi OCF1B w rejestrze TIFR. Flaga OCF1B moze zostac wyzerowana programowo przez wpisanie do jej lokacji logicznej1. Zrównanie zawartosci rejestru liczacego TIMER-a 1 TCNT1 z zawartoscia rejestru OCR1B powoduje skok do adresu przerwania $005 pod warunkiem, ze przerwanie spowodowane powyzszym zrównaniem zostalo wlaczone przez ustawienie bitu maski OCIE1B w rejestrze TIMSK (oraz bitu I globalnego wlaczenia przerwan w rejestrze SREG). Flaga przepelnienia TIMER-a 1 OCF1B w rejestrze TIFR zostaje wyzerowana sprzetowo w chwili skoku do procedury przerwania

Technika mikroprocesorowa

53

Bit 3 –ICF1: flaga przechwycenia zawartosci rejestru liczacego TCNT1 TIMER-a 1 Pojawienie sie zbocza na linii wejsciowej ICP powoduje przechwycenie zawartosci rejestru liczacego TCNT1 TIMER-a 1 i przepisanie jej do rejestru ICR1, a równoczesnie ustawienie flagi przechwycenia ICE1 w rejestrze TIFR. Flaga ICE1 moze zostac wyzerowana programowo przez wpisanie do jej lokacji logicznej1. Przechwycenie zawartosci rejestru liczacego TCNT1 TIMER-a 1 do rejestru ICR1 powoduje skok do adresu przerwania $003, o ile przerwanie spowodowane przechwyceniem zostalo wlaczone przez ustawienie bitu maski TICIE1 w rejestrze TIMSK (oraz bitu I globalnego wlaczenia przerwan w rejestrze SREG). Flaga przechwycenia TIMER-a 1 ICF1 w rejestrze TIFR zostaje wyzerowana sprzetowo w chwili skoku do procedury przerwania. Maski przerwan TIMER-a 1 znajduja sie w rejestrze masek TIMSK. Rejestr masek timerów – TIMSK

Bit 7 6 5 4 3 2 1 0 Nazwa TOIE1 OCIE1A OCIE1B - TICIE1 - TOIE0 -

Odczyt/zapis R/W R/W R/W R R/W R R/W R Wartosc poczatkowa 0 0 0 0 0 0 0 0 Bit 7 – TOIE1: maska przerwania wywolywanego przepelnieniem rejestru liczacego TCNT1 TIMER-a 1 Gdy bit TOIE1 jest ustawiony w stan logicznej 1 oraz bit I w rejestrze SREG jest ustawiony w stan logicznej 1 nastepuje wlaczenie przerwania wywolane przepelnieniem TIMER-a 1. Wówczas przepelnienie liczacego Timera i towarzyszace mu ustawienie flagi przepelnienia TOV0 w rejestrze flagowym Timerów TIFR powoduje wykonanie procedury przerwania od adresu $006. Bit 6 –OCIE1A: maska przerwania wywolywanego zrównaniem rejestru liczacego TCNT1 TIMER-a 1 z rejestrem OCR1A Gdy bit OCIE1A jest ustawiony w stan logicznej 1 oraz bit I w rejestrze SREG jest ustawiony w stan logicznej 1 nastepuje wlaczenie przerwania wywolane zrównaniem zawartosci rejestru zliczania TCNT1 z rejestrem OCR1A. Przerwanie to powoduje ustawienie flagi OCF1A w rejestrze flagowym Timerów i wykonanie procedury przerwania od adresu $004. Bit 5 – OCIE1B: maska przerwania wywolywanego zrównaniem rejestru liczacego TCNT1 TIMER-a 1 z rejestrem OCR1B Gdy bit OCIE1B jest ustawiony w stan logicznej 1 oraz bit I w rejestrze SREG jest ustawiony w stan logicznej 1 nastepuje wlaczenie przerwania wywolane zrównaniem zawartosci rejestru zliczania TCNT1 z rejestrem OCR1B. Przerwanie to powoduje ustawienie flagi OCF1B w rejestrze flagowym Timerów i wykonanie procedury przerwania od adresu $005. Bit 3 – TICIE1: maska przerwania wywolywanego przechwyceniem zawartosci rejestru liczacego TCNT1 TIMER-a 1 Gdy bit TICIE1 jest ustawiony w stan logicznej 1 oraz bit I w rejestrze SREG jest ustawiony w stan logicznej 1 nastepuje wlaczenie przerwania wywolane przechwyceniem zawartosci rejestru zliczania TCNT1. Przerwanie to powoduje ustawienie flagi ICF1 w rejestrze flagowym Timerów i wykonanie procedury przerwania od adresu $003.

Technika mikroprocesorowa

54

Sygnaly kontrolne trybów pracy TIMER-a 1 znajduja sie w rejestrach kontrolnych TCCR1A i TCCR1B. Rejestr kontrolny TIMER-a 1 – TCCR1A

Bit 7 6 5 4 3 2 1 0 Nazwa COM1A1 COM1A0 COM1B1 COM1B0 - - PWM11 PWM10

Odczyt/zapis R/W R/W R/W R/W R R R/W R/W Wartosc poczatkowa 0 0 0 0 0 0 0 0 Bity7, 6 –COM1A1, COM1A0: dotyczy trybu porównania A TIMER-a 1 Bity COM1A1 i COM1A0 determinuja rodzaj aktywnosci na linii wyjsciowej OC1A po wystapieniu zrównania zawartosci rejestrów TCNT1 i OCR1A. Linia OCR1A jest 5-ta linia portu D, przy czym 5-ty bit w rejestrze kierunkowym portu D musi byc ustawiony w stan logicznej 1, aby skonfigurowac linie jako wyjscie. Bity 5, 4 –COM1B1, COM1B0: dotyczy trybu porównania B TIMER-a 1 Bity COM1B1 i COM1B0 determinuja rodzaj aktywnosci na linii wyjsciowej OC1B po wystapieniu zrównania zawartosci rejestrów TCNT1 i OCR1B. Linia OCR1B jest 2-ga linia portu E, przy czym 2-gi bit w rejestrze kierunkowym portu E musi byc ustawiony w stan logicznej 1, aby skonfigurowac linie jako wyjscie. COM1X1 COM1X0 Rodzaj aktywnosci po zrównaniu TCNT1 i OCR1X

0 0 TIMER 1 odlaczony od linii OC1X

0 1 Linia OC1X na przemian ustawiana i zerowana

1 0 Linia OC1X zostaje wyzerowana

1 1 Linia OC1X zostaje ustawiona

Bity 1, 0 –PWM11, PWM10: konfiguracja modulatora szerokosci impulsów Bity PWM11 i PWM10 konfiguruja tryb PWM dla TIMER-a 1. PWM11 PWM10 Konfiguracja trybu PWM

0 0 Tryb PWM wylaczony

0 1 8-mio bitowy tryb PWM

1 0 9-cio bitowy tryb PWM

1 1 10-cio bitowy tryb PWM

Rejestr kontrolny TIMER-a 1 – TCCR1B

Bit 7 6 5 4 3 2 1 0 Nazwa ICNC1 ICES1 - - CTC1 CS12 CS11 CS10

Odczyt/zapis R/W R/W R R R R/W R/W R/W Wartosc poczatkowa 0 0 0 0 0 0 0 0

Technika mikroprocesorowa

55

Bity 2, 1, 0 –CS12, CS11, CS10: zródlo impulsów dla TIMER-a 1 CS12 CS11 CS10 Zródlo impulsów

0 0 0 Zatrzymanie TIMER-a 1

0 0 1 CK

0 1 0 CK/8

0 1 1 CK/64

1 0 0 CK/256

1 0 1 CK/1024

1 1 0 Zbocza opadajace na linii 1 portu B

1 1 1 Zbocza narastajace na linii 1 portu B

Bit 7 –ICNC1: wlaczenie funkcji redukcji szumów Ustawienie bitu ICNC1 w rejestrze TCCR1B powoduje wlaczenie funkcji redukcji szumów przy przechwyceniu danych do rejestru ICR1. Funkcja ta zapewnia czterokrotne próbkowanie linii ICP po przejsciu zbocza na tej linii. Wszystkie cztery próbki musza byc jednego znaku (logiczna 1, gdy bit ICES1 w rejestrze TCCR1B jest ustawiony w stan logicznej 1, a logiczne 0, gdy jest wyzerowany) aby zaszlo przechwycenie danych do rejestru ICR1.

Bit 6 –ICES1: wybór zbocza dla funkcji przechwytu Jesli bit ICES1 w rejestrze TCCR1B jest wyzerowany, to przechwycenie nastepuje na zboczu opadajacym na linii ICP. Jesli bit ICES1 w rejestrze TCCR1B jest ustawiony w stan logicznej 1, to przechwycenie nastepuje na zboczu narastajacym na linii ICP.

Bit 3 –CTC1: zerowanie rejestru TCNT1 Gdy bit CTC1 w rejestrze TCCR1B jest ustawiony w stan logicznej 1, to zrównanie zawartosci rejestru TCNT1 i OCR1A powoduje reset TIMER-a 1 (wyzerowanie rejestru TCNT1), po czym TIMER 1 kontynuuje zliczanie. Gdy bit CTC1 w rejestrze TCCR1B jest wyzerowany, to zrównanie zawartosci rejestru TCNT1 i OCR1A nie ma wplywu na zawartosc rejestru TCNT1, a TIMER 1 kontynuuje zliczanie.

13.1. Przyklad wykorzystania trybu przechwytu TIMER-a 1 do pomiaru dlugosci impulsów Port A skonfiguruj jako wyjsciowy i podlacz na jego liniach 8 diod. Wykorzystaj tryb przechwytu do pomiaru dlugosci impulsów ujemnych na linii 0 portu E zwanej linia ICP. Wybierz dla TIMER-a 1 prescaler o wartosci 1024. Przy czestotliwosci kwarcu 6 MHz TIMER 1 przepelni sie po czasie (216 *1024)/6 ≅ 11,2s. Dlugosc impulsów ujemnych na linii PORTE.0 nie powinna przekraczac 11,2s, poniewaz pomiar dlugosci impulsów jest realizowany modulo 11,2s. Zdejmij maske przerwania spowodowanego przechwytem TIMER-a 1.

Technika mikroprocesorowa

56

Na zboczu opadajacym impulsu wyzeruj rejestry liczace TCNT1H i TCNT1L TIMER-a 1, natomiast na zboczu narastajacym przechwytuj wartosc biezaca ICR1H i ICR1L i zachowaj ja w buforze. Wartosc przechwycona jest proporcjonalna do dlugosci impulsu ujemnego. Starszych 8 bitów tej wartosci podaj na diody podlaczone na porcie A. Linie 2 portu B podlacz z wyjsciem /ESP, na którym w zestawie EVB-503 jest podlaczony buczek (Buzzer). Linie skonfiguruj jako wyjscie i podaj na nia stan wysoki, który wylacza buczek. Stan niski (impuls ujemny) na linii ICP sygnalizuj buczeniem. Fragment programu glównego zwiazany z ustawieniami dla TIMER-a 1 przedstawia sie nastepujaco:

Ustawienie wskaznika adresowego x na poczatku bufora „bufor” Ldi xh, high(bufor) Ldi xl, low(bufor)

Ustawienie wskaznika adresowego y na „znacznik” Ldi yh, high(znacznik) Ldi yl, low(znacznik)

Wpisanie logicznej 1 do „znacznik-a”) Ldi r16, 1 st y, r16

Wybór prescalera o wartosci 1024 oraz zbocza opadajacego dla przechwytu Ldi r16, (1<<icnc1)| (1<<ices1)|( 1<<cs12) Out tccr1b, r16

Zdjecie maski przerwania wywolanego przechwytem Ldi r16, ( 1<<ticie1) Out timsk, r16

Globalne zezwolenie na przerwania sei

Skoki w miejscu konczace program glówny Koniec: Rjmp koniec Procedura przerwania spowodowanego przechwytem: TIMER 1_capt:

Sprawdzenie wartosci znacznika Ld r16, y Cpi r16, 0 Brne impuls

Stan wysoki na linii porte.0 _impuls:

Ustawienie znacznika Ldi r16, 1

Technika mikroprocesorowa

57

St y, 16

Wybór zbocza narastajacego dla przechwytu Ldi r16, (1<<icnc1)| (1<<ices1)|( 1<<cs12) Out tccr1b, r16

Przepisanie przechwyconych wartosci do bufora In r17, icr1l In r18, icr1h St x+, r18 St x+, r17

Podanie starszych 8-miu bitów wartosci przechwyconej na diody Out porta, r18

Wylaczenie buczka Sbi portb, 2

Powrót Reti

Stan niski na linii porte.0 (impuls ujemny) impuls:

Wyzerowanie znacznika Ldi r16, 0 St y, 16

Zatrzymanie TIMER-a 1 Ldi r16, 0 Out tccr1b, r16

Wyzerowanie rejestrów zliczajacych TIMER-a 1 Ldi r16, 0 Out tcnt1h, r16 Ldi r16, 0 Out tcnt1l, r16

Wybór zbocza narastajacego dla przechwytu Ldi r16, (1<<icnc1)| (1<<ices1)|( 1<<cs12) Out tccr1b, r16

Wlaczenie buczka Cbi portb, 2

Powrót Reti

Technika mikroprocesorowa

58

Srodowisko AVR Studio nie umozliwia pelnych symulacji trybu przechwytu TIMER-a 1 dla mikrokontrolera AT90S8515. Zaprogramuj mikrokontroler i sprawdz praktycznie dzialanie programu.

Polecenia 24. Gdy TIMER 1 z prescalerem 1024 zliczy 40000 impulsów w trybie porównania wyswietl

napis : ”zadanie wykonane” . 25. Uruchom TIMER 1 w trybie porównania A. Prescaler i wartosc koncowa ustal tak, aby do

kazdego zrównania mijala w przyblizeniu 1s. Wykorzystaj bit CTC1 do wyzerowania rejestru zliczania po kazdym zrównaniu. Do linii OC1A podlacz diode. Gas i zapalaj diode naprzemiennie po kazdym zrównaniu wykorzystujac funkcje „aktywnosci” linii OC1A.

26. Napisz program, w którym TIMER 1 liczy odcinki czasu dlugosci 1s, a liczba przepelnien TIMER-a 1 jest wyswietlana w czasie rzeczywistym na LCD (modulo 256).

14. Pamiec EEPROM Pamiec EEPROM jest nielotna, przechowuje dane po wylaczeniu napiecia zasilajacego. Wewnetrzna nieulotna pamiec EEPROM procesora AT90S8515 ma 512 bajtów adresowanych od 0 do 512. Rejestry EEARL oraz EEARH przechowuja adres zapisu/odczytu pamieci EEPROM. Adres wpisu nalezy umiescic w rejestrze EEAR (EEARH+EEARL), natomiast dana nalezy umiescic w rejestrze EEDR Dana zostanie zapisana pod wskazany adres. Zapisanie jednego bajtu w pamieci EEPROM trwa od 2.5 – 4ms (w zaleznosci od napiecia zasilania). W procesie odczytu dana spod adresu umieszczonego w rejestrze EEAR jest przepisywana do rejestru EEDR. Odczyt jednego bajtu trwa 4 cykle zegarowe.

Rejestr adresowy pamieci EEPROM - EEAR (czesc starsza –EEARH, czesc mlodsza EEARL)

Bit 15 14 13 12 11 10 9 8 Nazwa MSB Nazwa LSB

Odczyt/zapis

7 R

6 R

5 R

4 R

3 R

2 R

1 R

0 R/W

Wartosc poczatkowa

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

0 0 0 0 0 0 0 0 Rejestr danych pamieci EEPROM – EEDR

Bit 7 6 5 4 3 2 1 0 Nazwa MSB LSB

Odczyt/zapis R/W R/W R/W R/W R/W R/W R/W R/W Wartosc poczatkowa 0 0 0 0 0 0 0 0 Rejestr kontrolny pamieci EEPROM – EECR

Technika mikroprocesorowa

59

Bit 7 6 5 4 3 2 1 0 Nazwa - - - - - EEMWE EEW E EERE

Odczyt/zapis R R R R R R/W R/W R/W Wartosc poczatkowa 0 0 0 0 0 0 0 0 Bit 2 –EEMWE: zezwolenie na zapis pamieci EEPROM Bit EEMWE decyduje o tym, czy ustawienie bitu EEWE wywola proces zapisu pamieci EEPROM. Gdy EEMWE jest ustawiony w stan logicznej 1 ustawienie EEWE spowoduje zapis danej do pamieci EEPROM pod wskazany adres. Gdy EEMWE jest wyzerowany ustawienie EEWE nie da zadnego efektu. Po ustawieniu bitu EEMWE zostaje on sprzetowo wyzerowany po 4-ch cyklach zegarowych. Bit 1 –EEWE: strob zapisu pamieci EEPROM Bit EEWE jest strobem zapisu. Po wstawieniu adresu do rejestru EEAR, danych do rejestru EEDR oraz ustawieniu bitu EEMWE bit EEWE musi zostac ustawiony w stan logicznej 1, aby spowodowac zapis danej do EEPROMu. Procedure zapisu do EEPROMu opisano w punktach ponizej (punkty 2 i 3 mozna zamienic miejscami):

1. Czekaj na wyzerowanie bitu EEWE 2. Wpisz nowy adres do rejestrów EEARH i EEARL 3. Wpisz nowa dana do rejestru EEDR 4. Wpisz logiczna 1 do bitu EEMWE (w tym samym rozkazie wpisz logiczne 0 do

bitu EEWE). 5. W ciagu 4-ch cykli zegarowych wpisz logiczna 1 do bitu EEWE.

Po skonczeniu zapisu (2.5ms – 4ms) bit EEWE jest zerowany sprzetowo. Programowy odczyt bitu EEWE pozwala stwierdzic, czy zapis danej do EEPROMu jeszcze trwa. Kazde przerwanie, które pojawi sie miedzy punktami 4 i 5 spowoduje blad zapisu do EEPROMu, poniewaz skok do procedury tego przerwania zajmie wiecej niz 4 cykle zegarowe i w miedzyczasie wyzeruje sie bit EEMWE. Dlatego w trakcie wpisu do EEPROMu globalna maska przerwan musi byc zalozona (wyzerowany bit I w rejestrze SREG). Przyklad zapisu liczby 0x55 pod adres 0x0002: EEPROM_write: sbic EECR, EEWE rjmp EEPROM_write ldi r18, 0 ldi r17, 2 out EEARH, r18 out EEARL, r17 ldi r18, 0x55 out EEDR, r18 sbi EECR, EEMWE sbi EECR, EEWE

Technika mikroprocesorowa

60

Bit 0 –EERE: strob odczytu pamieci EEPROM Bit 0 jest strobem odczytu pamieci EEPROM. Po wstawieniu adresu do rejestru EEAR, danych do rejestru EEDR bit EERE musi zostac ustawiony w stan logicznej 1, aby spowodowac odczyt danej z pamieci EEPROM. Po odczytaniu danej i umieszczeniu jej w rejestrze EEDR bit EERE zostaje wyzerowany sprzetowo. Nie ma potrzeby odczytu stanu bitu EERE, poniewaz po ustawieniu tego bitu procesor zostaje wstrzymany na 4 cykle zegarowe, a dokladnie tyle trwa odczyt. Procedure odczytu komórki pamieci EEPROM opisano w punktach ponizej:

1. Czekaj na zakonczenie ostatniego procesu zapisu (wyzerowanie bitu EEWE) 2. Wpisz nowy adres odczytu do rejestrów EEARH i EEARL 3. Ustaw bit EERE – procesor zostaje wstrzymany na 4cykle zegarowe 4. Odczytaj dana z rejestru EEDR

Przyklad odczytu spod adresu 100: EEPROM_read: sbic EECR, EEWE rjmp EEPROM_read ldi r18, 0 ldi r17, 100 out EEARH, r18 out EEARL, r17 sbi EECR, EERE in r16, EEDR

Polecenia 27. Na liniach INT0 i INT1 podlacz 2 przyciski i z kazdym z nich oznacz kodem np. A i B.

Napisz program, który po resecie mikrokontrolera (np. wylaczeniu i ponownym wlaczeniu zasilania) wyswietli na LCD kod przycisku wcisnietego jako ostatni przed resetem. Korzystaj z przerwan zewnetrznych INT0 i INT1.

28. Utwórz proste MENU o dwóch poziomach i trzech klawiszach: ENT, ESC, → .Na 1-szym

poziomie wyswietl „koledzy”, na 2-gim poziomie „Maciek”, „Romek”, „Waldek”. Miedzy poziomami przechodz klawiszami ENT i ESC. Miedzy imionami przechodz klawiszem → . W roli klawiszy ENT, ESC i → zdefiniuj 3 przyciski na porcie D podlaczone na linie 0, 1, 2. Nie korzystaj z przerwan zewnetrznych INT0 i INT1. Do czytania stanu zwarcia na wybranej linii wykorzystaj rozkaz sbic lub sbis. Przyklad: Klawisz enter zdefiniowano na linii 0 portu D, a klawisz esc na linii 1 portu D Klawisz_enter: sbic portd, 0 rjmp enter_set

Technika mikroprocesorowa

61

rjmp enter_clear enter_set: ;rozkazy rjmp klawisz_esc enter_clear: ;rozkazy rjmp klawisz_esc klawisz_esc: sbic portd, 1 ;itd

15. Transmisja szeregowa UART Modul UART (Universal Asynchronous Receiver and Transmiter) obsluguje dupleksowa, asynchroniczna transmisje danych miedzy procesorem a urzadzeniem zewnetrznym. Dane sa nadawane (i odbierane) w formacie start-stopowym tzn., kazdy znak sklada sie z: 1 bitu startu: logiczne 0 8 lub 9 bitów danych 1 bitu stopu: logiczna 1. 9-ty bit danych moze zostac wykorzystany jako bit parzystosci lub jako dodatkowy bit stopu. Nadajnik UART sklada sie z 2-ch rejestrów: bufora nadawczego UDR oraz nadawczego rejestru przesuwnego. Dana przeznaczona do nadania zostaje wpisana do rejestru UDR i tam oczekuje na zakonczenie nadawania poprzedniego znaku przez rejestr przesuwny. Rejestr przesuwny nadaje w linie (z predkoscia ustalona przez rejestr UBRR) najpierw bit startu, nastepnie 8 bitów danych rozpoczynajac od LSB, opcjonalnie bit parzystosci i bit stopu. Gdy rejestr przesuwny pobierze dana z bufora UDR, opróznienie bufora UDR jest sygnalizowane ustawieniem flagi UDRE i kolejna dana moze zostac wpisana do rejestru UDR. Gdy nadawczy rejestr przesuwny oraz bufor UDR zostana calkowicie opróznione i kolejny znak nie zostanie wpisany do rejestru UDR zostaje ustawiona flaga TXC sygnalizujaca zakonczenie nadawania . Odbiornik UART sklada sie z odbiorczego rejestru przesuwnego i bufora odbiorczego UDR. Fizycznie istnieja dwa bufory UDR, oddzielnie dla nadawania i dla odbioru, chociaz wystepuja one pod ta sama nazwa. Odebranie znaku jest sygnalizowane ustawieniem flagi RXC. Jesli w odebranym znaku bit stopu nie jest logiczna 1, to dodatkowo jest ustawiany bit FE (bledu ramki). Jesli odebrany znak nie zostal odczytany z rejestru UDR przed pojawieniem sie kolejnego znaku w rejestrze przesuwnym, wówczas kolejny znak nie jest wprowadzany do rejestru UDR i jest tracony, a stan ten jest sygnalizowany ustawieniem flagi nadpisania OR. Rejestr danych transmisji UART –UDR

Bit 7 6 5 4 3 2 1 0

Technika mikroprocesorowa

62

Nazwa MSB LSB Odczyt/zapis R/W R/W R/W R/W R/W R/W R/W R/W

Wartosc poczatkowa 0 0 0 0 0 0 0 0

Rejestr UDR stanowia fizycznie 2 rejestry znajdujace sie pod tym samym adresem w przestrzeni I/O. Podczas zapisu wykorzystywany jest nadawczy rejestr UDR. Podczas odczytu wykorzystywany jest odbiorczy rejestr UDR. Rejestr statusowy UART –USR

Bit 7 6 5 4 3 2 1 0 Nazwa RXC TXC UDRE FE OR - - -

Odczyt/zapis R R/W R R R R R R Wartosc poczatkowa 0 0 0 0 0 0 0 0 Rejestr statusowy jest rejestrem „tylko do odczytu” podajacym dane o transmisji UART. Bit 7 –RXC: zakonczono odbiór znaku Bit RXC zostaje ustawiony w stan logicznej 1 po przeslaniu odebranego znaku z odbiorczego rejestru przesuwnego do rejestru UDR. Bit zostaje ustawiony w stan logicznej 1 nawet, jesli wystapily bledy synchronizacji ramki. Jesli maska RXCIE w rejestrze UCR zostala zdjeta (bit ustawiony w stan logicznej 1), to odbiór znaku wywola przerwanie, którego wektor zaczyna sie od adresu $009. Flaga RXC jest zerowana przez odczytanie rejestru UDR. Procedura przerwania musi odczytac rejestr UDR, w przeciwnym przypadku to samo przerwanie zostanie zgloszone ponownie. Bit 6 –TXC: zakonczono nadawanie znaku Flaga TXC zostaje ustawiona, gdy caly znak (lacznie z bitem stopu) zostal nadany w linie z rejestru przesuwnego i nie wpisano kolejnego bajtu do nadania do rejestru UDR. Jesli maska TXCIE w rejestrze UCR zostala zdjeta (bit ustawiony w stan logicznej 1), to zakonczenie nadawania znaku wywola przerwanie, którego wektor zaczyna sie od adresu $00b. Flaga TXC zostaje wyzerowana sprzetowo po skoku do procedury przerwania. Alternatywnie flaga TXC moze zostac wyzerowana programowo przez wpisanie do niej logicznej 1. Bit 5 –UDRE: pusty rejestr nadawczy Bit UDRE zostaje ustawiony w stan logicznej 1 sprzetowo, gdy znak wpisany do rejestru UDR zostal w calosci przepisany do nadawczego rejestru przesuwnego. Ustawienie bitu UDRE sygnalizuje, ze do rejestru UDR mozna wpisac nowy bajt do nadania. Jesli maska UDRIE w rejestrze UCR zostala zdjeta (bit ustawiony w stan logicznej 1), to pusty rejestr UDR wywola przerwanie, którego wektor zaczyna sie od adresu $00a. W procedurze tego przerwania trzeba wpisac nowy znak do nadania do rejestru UDR, w przeciwnym razie przerwanie zostanie zgloszone ponownie. Bit 4 –FE: blad synchronizacji ramki Bit FE zostaje ustawiony w stan logicznej 1 sprzetowo, gdy bit stopu odebranego znaku jest logicznym 0. Po odebraniu prawidlowego znaku bit FE zostaje wyzerowany. Bit 3 –OR: nadpisanie znaku Bit OR zostaje ustawiony w stan logicznej 1 sprzetowo, jesli odebrany znak nie zostal odczytany z rejestru UDR przed wprowadzeniem nowo odebranego znaku do rejestru

Technika mikroprocesorowa

63

przesuwnego. Bit OR zostaje wyzerowany sprzetowo po umieszczeniu nowo odebranego znaku w rejestrze UDR. Rejestr kontrolny UART –UCR

Bit 7 6 5 4 3 2 1 0 Nazwa RXCIE TXCIE UDRIE RXEN TXEN CHR9 RXB8 TXB8

Odczyt/zapis R/W R/W R/W R/W R/W R/W R W Wartosc poczatkowa 0 0 0 0 0 0 1 0 Bit 7 –RXCIE: maska przerwania zakonczenia odbioru znaku Gdy bit 7 jest logiczna 1, wówczas odebranie znaku i ustawienie bitu RXC w rejestrze USR spowoduje skok do adresu $009 (rozpoczynajacego procedure przerwania spowodowanego odebraniem znaku po laczu UART) pod warunkiem ustawienia bitu I w rejestrze statusowym. Bit 6 –TXCIE: maska przerwania zakonczenia nadawania znaku Gdy bit 6 jest logiczna 1, wówczas zakonczenie nadawania znaku i ustawienie bitu TXC w rejestrze USR spowoduje skok do adresu $00b (rozpoczynajacego procedure przerwania spowodowanego zakonczeniem nadawania znaku po laczu UART) pod warunkiem ustawienia bitu I w rejestrze statusowym. Bit 5 –UDRIE: maska przerwania pustego bufora nadawczego Gdy bit 5 jest logiczna 1, wówczas opróznienie bufora nadawczego i ustawienie bitu UDRE w rejestrze USR spowoduje skok do adresu $00a (rozpoczynajacego procedure przerwania spowodowanego opróznieniem bufora nadawczego) pod warunkiem ustawienia bitu I w rejestrze statusowym. Bit 4 –RXEN: wlaczenie odbiornika UART Ustawienie bitu 4 wlacza odbiornik UART. Gdy odbiornik jest wylaczony, nie mozna ustawic flag RXC, OR, FE. Jednak wylaczenie odbiornika nie spowoduje wyzerowania powyzszych flag. Bit 3 –TXEN: wlaczenie nadajnika UART Ustawienie bitu 3 wlacza nadajnik UART. Gdy UART zostanie wylaczony podczas nadawania znaku, wówczas faktyczne wylaczenie nastapi po nadaniu znaków znajdujacych sie w tym momencie w rejestrze przesuwnym (1 znak) oraz w buforze nadawczym UDR (1 znak). Bit 2 –CHR9: transmisja znaku 9-cio bitowego Gdy bit 2 jest ustawiony w stan logicznej 1 nadawany znak ma 9 bitów + bit startu i bity stopu. (9-ty bit jest odczytywany i wpisywany na pozycje odpowiednio RXB9 I TXB9 w rejestrze UCR. (-ty bit moze zostac uzyty jako dodatkowy bit stopu lub bit parzystosci. Bit 1 –RXB8: 9-ty bit znaku odebranego Gdy bit CHR9 jest ustawiony w stan logicznej 1, wówczas bit RXB8 jest 9-tym bitem w odebranym znaku. Bit 0 –TXB8: 9-ty bit znaku nadawanego

Technika mikroprocesorowa

64

Gdy bit CHR9 jest ustawiony w stan logicznej 1, wówczas bit TXB8 jest 9-tym bitem w znaku przygotowanym do nadania. Generator predkosci transmisji UART Generator predkosci transmisji jest dzielnikiem czestotliwosci, który ustala predkosci transmisji UART w bitach na sekunde na podstawie czestotliwosci zegara kwarcowego wg. nastepujacego wzoru:

)1(16 +=

UBRRf

BAUD CK

BAUD – predkosci w bodach (bit/s) fCK – czestotliwosc zegara kwarcowego UBRR – zawartosc rejestru ustalajacego predkosc (0-255) Najczesciej uzywane predkosci transmisji UART w bodach to: 12000, 2400, 4800, 9600, 19200, 28800, 38400, 57600, 76800, 115200. Rejestr predkosci transmisji UART –UBRR

Bit 7 6 5 4 3 2 1 0 Nazwa MSB - - - - - - LSB

Odczyt/zapis R/W R/W R/W R/W R/W R/W R/W R/W Wartosc poczatkowa 0 0 0 0 0 0 0 0 Dana wpisana do rejestru UBRR ustala predkosci transmisji po laczu UART. Polaczenie wyjsc mikrokontrolera i linii gniazda RS(1) wyprowadzonych na zlacze AUX2 plytki EVB-503

Linie gniazda RS(1) polaczone z liniami zlacza AUX2

Linie mikrokontrolera

RXD1– Receive line PORTD, 0

TXD1– Transmit line PORTD, 1

15.1. Transmisja UART- przyklady nadawania Nadawanie znaków po magistrali szeregowej UART mozna zrealizowac na kilka sposobów np. testujac flage zakonczenia nadawania znaku, z aktywnym przerwaniem sygnalizujacym zakonczenie nadawania znaku lub z aktywnym przerwaniem sygnalizujacym pusty bufor nadawczy. Kolejne przyklady ilustruja wykorzystanie tych metod.

Testowanie flagi zakonczenia nadawania znaku Testowanie flagi zakonczenia nadawania znaku odbywa sie w petli sprawdzajacej stan bitu txc w rejestrze usr Fragment kodu programu glównego:

Technika mikroprocesorowa

65

Ustalenie predkosci Ldi r16, 38 Out ubrr, r16

Wlaczenie nadajnika UART Ldi r16, (1<<txen) Out ucr, r16

Wpisanie znaku do rejestru danych (równoznaczne z rozpoczeciem nadawania znaku) Ldi r16, ‘a’ Out udr, r16

Testowanie flagi zakonczenia nadawania znaku Petla: Sbis usr, txc Rjmp petla Dalej:

Wyzerowanie flagi zakonczenia nadawania znaku Ldi r16, (1<<txc) Out usr, r16

Wpisanie kolejnego znaku do rejestru danych Ldi r16, ‘b’ Out udr, r16 Nadawanie w UART z aktywnym przerwaniem zakonczenia nadawania znaku W tej metodzie kolejne znaki sa wysylane w UART w procedurze przerwania z równoczesnym zliczaniem ich liczby. Fragment kodu programu glównego:

Ustawienie wskaznika do bufora danych ldi xh, high(bufor) ldi xl, low(bufor)

Wlaczenie nadajnika UART i zdjecie maski przerwania zakonczenia nadawania znaku Ldi r16, (1<<txcie) |(1<<txen) Out ucr, r16

Wlaczenie przerwan sei

Wpisanie znaku do rejestru danych (równoznaczne z rozpoczeciem nadawania znaku) Ld r16, x+ Out udr, r16

Skoki w miejscu Koniec: Rjmp koniec

Technika mikroprocesorowa

66

Fragment kodu procedury przerwania: Przerwanie:

Wpisanie kolejnych znaków do rejestru danych (równoznaczne z rozpoczeciem nadawania)

Ld r16, x+ Out udr, r16

Powrót reti Nadawanie w UART z aktywnymi przerwaniami: pustego bufora nadawczego i zakonczenia nadawania znaku W programie glównym nalezy zdjac maski obu wykorzystywanych przerwan. W przerwaniu sygnalizujacym pusty bufor nadawczy kolejny znak jest wpisywany do bufora nadawczego, z równoczesnym zliczaniem ich liczby. Po wpisaniu ostatniego znaku, przerwanie pustego bufora jest maskowane i nastepuje oczekiwanie na przerwanie sygnalizujace zakonczenie nadawania. Fragment kodu programu glównego:

Ustawienie wskaznika do bufora danych ldi xh, high(bufor) ldi xl, low(bufor)

Ustawienie wartosci poczatkowej licznika .def licznik = r20 ldi licznik, 10 Fragment kodu procedury przerwania pustego bufora nadawczego: Przerwanie:

Wpisanie kolejnych znaków do rejestru danych (równoznaczne z rozpoczeciem nadawania)

Ld r16, x+ Out udr, r16

Dekrementacja licznika Dec licznik Brne powrot

Zamaskowanie przerwania pustego bufora nadawczego, równoczesnie zdjecie maski przerwania zakonczenia nadawania znaku

Ldi r16, (1<<txcie),| (0<<udrie) |( (1<<txen) Out ucr, r16

Powrót Powrot: reti 15.2. Transmisja UART- przyklady odbioru

Technika mikroprocesorowa

67

Testowanie flagi zakonczenia odbioru znaku Testowanie flagi zakonczenia nadawania znaku odbywa sie w petli sprawdzajacej stan bitu rxc w rejestrze usr Fragment kodu programu glównego:

Ustalenie predkosci Ldi r16, 38 Out ubrr, r16

Wlaczenie nadajnika UART Ldi r16, (1<<rxen) Out ucr, r16

Testowanie flagi odbioru znaku Petla: Sbis usr, rxc Rjmp petla Dalej:

Odczyt odebranego znaku In r16, udr Odbiór po magistrali UART z aktywnym przerwaniem zakonczenia odbioru znaku W tej metodzie kolejne znaki sa odbierane z bufora interfejsu UART w procedurze przerwania. Fragment kodu programu glównego:

Ustawienie wskaznika do bufora danych ldi xh, high(bufor) ldi xl, low(bufor)

Wlaczenie nadajnika UART i zdjecie maski przerwania zakonczenia nadawania znaku Ldi r16, (1<<rxcie) |(1<<rxen) Out ucr, r16

Wlaczenie przerwan sei

Skoki w miejscu Koniec: Rjmp koniec Fragment kodu procedury przerwania: Przerwanie:

Odbiór znaku i wpisanie go do bufora In r16, udr St x+, r16

Technika mikroprocesorowa

68

Powrót reti Polecenia 29. Napisz program, który po nacisnieciu jednego z 6-ciu przycisków polaczonych z liniami

portu A wysyla w UART znak ASCII litery zwiazanej z tym przyciskiem np. przyciskowi polaczonemu z linia 0 portu A odpowiada litera A, polaczonemu z linia 0 portu B odpowiada litera B itd. Wyslany w UART znak jest odbierany i wyswietlany odbierany i wyswietlany pod programem terminalowym np. Hyper Terminal (Akcesoria Windows).

30. Napisz program, który przy naciskaniu poszczególnych klawiszy polaczonych z liniami portu A wysyla w UART tekst np. „klawisz A”, „klawisz B” odbierany i wyswietlany pod programem terminalowym np. Hyper Terminal (Akcesoria Windows).

31. Napisz program do odbioru transmisji szeregowej UART z wyswietlaniem odebranych znaków na LCD. Do wysylania znaków z klawiatury numerycznej komputera PC wykorzystaj program terminalowy np. Hyper Terminal (Akcesoria Windows). Program terminalowy Hyper Terminal przekodowuje znaki wysylane przez klawiature PC na znaki ASCII.

16. Szeregowy interfejs SPI Szeregowy interfejs SPI (Serial Peripherial Interface) sluzy do dwukierunkowej (full-duplex), synchronicznej transmisji danych pomiedzy mikrokontrolerem, a zewnetrznymi ukladami peryferyjnymi (np. przetwornik A/C i C/A, szeregowa pamiec zewnetrzna, zegar, potencjometr cyfrowy lub inny mikrokontroler). Interfejs SPI jest trójprzewodowy, sklada sie z dwóch linii synchronicznie przesylajacych dane w przeciwnych kierunkach oraz linii z sygnalem taktujacym synchronizujacym transfer danych. Transfer danych przez interfejs SPI odbywa sie w ukladzie master-slave. Jezeli w systemie znajduje sie wiecej niz 1 mikrokontroler, to tylko jeden z nich w danej chwili pelni role urzadzenia master. Sposób polaczenia ukladu nadrzednego (master) z ukladem podrzednym (slave) przedstawiono na rysunku.

Technika mikroprocesorowa

69

Rys.19. Transmisja danych po liniach magistrali SPI Interfejs SPI sklada sie z dwóch rejestrów przesuwnych polaczonych w licznik pierscieniowy i generatora sygnalu taktujacego. Generator sygnalu taktujacego znajduje sie zawsze w ukladzie nadrzednym (master). Linia MISO jest wejsciem danych dla urzadzenia master, a wyjsciem dla slave, natomiast linia MOSI jest wyjsciem dla urzadzenia master, a wejsciem dla slave. Linia SCK jest wejsciem taktujacym dla ukladu slave oraz wyjsciem dla master. Sygnal taktujacy jest zawsze generowany przez uklad nadrzedny (master) bez wzgledu na to czy dane sa przez niego nadawane czy tez odbierane. Sygnal taktujacy jest nadawany jedynie podczas transmisji. Transmisje na liniach magistrali SPI sa zawsze dwukierunkowe. Nadawaniu danych na linii MOSI przez uklad master towarzyszy zawsze nadawanie danych na linii MISO przez uklad slave. Nie wszystkie nadawane dane niosa informacje, najczesciej w jednym kierunku sa nadawane dane niosace informacje, podczas gdy w drugim sa nadawane dane puste.

Rys.20. System skladajacy sie 1 urzadzenia Master i kilku urzadzen Slave na magistrali SPI Uklad nadrzedny (master) wybiera poszczególne uklady podrzedne (slave) przez jedna z równoleglych linii portu dolaczonych do wyprowadzen SS ukladów podrzednych. Urzadzenie slave zostanie wybrane, gdy na jego wejscie SS zostanie podany okreslony stan (istnieja

Technika mikroprocesorowa

70

urzadzenia wybierane stanem niskim oraz stanem wysokim). W czasie transmisji, w celu unikniecia kolizji, tylko jeden uklad podrzedny moze byc aktywny na liniach interfejsu.

16.1. Tryby pracy interfejsu SPI Polaryzacja i faza sygnalu taktujacego ukladu master musi byc dostosowana do sposobu pracy ukladu slave. Polaryzacja sygnalu taktujacego jest okreslana przez wartosc logiczna tego sygnalu w stanie spoczynkowym. Gdy: − CPOL=0 w stanie spoczynku linia taktujaca jest w stanie niskim, − CPOL=1 w stanie spoczynku linia taktujaca jest w stanie wysokim.

Rys.21. Przebiegi czasowe interfejsu SPI dla sygnalu zegarowego o CPHA=0

Faza sygnalu taktujacego definiuje zaleznosc pomiedzy zboczami sygnalu taktujacego , a momentami odbioru (próbkowania ) danych wejsciowych i nadawania (przesuwania w rejestrze) danych wyjsciowych. Gdy:

− CPHA=0 pierwsze zbocze sygnalu taktujacego próbkuje dane wejsciowe, drugie zbocze przesuwa dane w rejestrze (dane sa próbkowane, a nastepnie przesuwane i wysylane)

− CPHA=1 pierwsze zbocze sygnalu taktujacego przesuwa dane w rejestrze – wyprowadza je z rejestru, drugie zbocze próbkuje dane wejsciowe (dane sa przesuwane i wysylane, a nastepnie próbkowane i wpisywane do rejestru).

Technika mikroprocesorowa

71

Rys.22. Przebiegi czasowe interfejsu SPI dla sygnalu zegarowego o CPHA=1 Wartosci bitów CPOL i CPHA decyduja o wyborze jednego z 4-ch trybów pracy interfejsu SPI, oznaczonych jako 0, 1, 2 lub3. Wybór trybu pracy interfejsu SPI

Zbocze narastajace Zbocze opadajace Tryb pracy SPI CPOL = 0, CPHA = 0 Odbiór (narastajace) Nadawanie (opadajace) 0 CPOL = 0, CPHA = 1 Nadawanie

(narastajace) Odbiór (opadajace) 1

CPOL = 1, CPHA = 0 Odbiór (opadajace) Nadawanie (narastajace) 2 CPOL = 1, CPHA = 1 Nadawanie (opadajace) Odbiór (narastajace) 3

Tryb pracy interfejsu SPI nalezy dostosowac do wymagan urzadzenia zewnetrznego podlaczonego do linii magistrali przez dokonanie odpowiednich wpisów rejestrze kontrolnym SPCR.

16.2. Sterowanie interfejsem SPI Z interfejsem SPI skojarzone sa trzy rejestry mikrokontrolera, które zapewniaja dostep do wszystkich funkcji interfejsu: − Rejestr kontrolny SPCR sluzy do konfiguracji interfejsu i sterowania jego praca − Rejestr statusu SPSR zawiera flagi sygnalizujace stan interfejsu. − Rejestr danych SPDR sluzy do wpisywania bajtu danych do wyslania oraz do odczytu

odebranego bajtu danych. Rejestr kontrolny interfejsu SPI - SPCR

Bit 7 6 5 4 3 2 1 0 Nazwa SPIE SPE DODR MSTR CPOL CPHA SPR1 SPR0

Odczyt/zapis R/W R/W R/W R/W R/W R/W R/W R/W Wartosc poczatkowa 0 0 0 0 0 0 0 0 Bit 7 – SPIE: maska przerwania interfejsu SPI

Technika mikroprocesorowa

72

Gdy bit 7 jest logiczna 1, wówczas zakonczenie transmisji znaku po magistrali SPI i ustawienie bitu SPIF w rejestrze SPSR spowoduje skok do procedury obslugi przerwania rozpoczynajacego sie od adresu $008 pod warunkiem ustawienia bitu I w rejestrze statusowym. Bit 6 – SPE: wlaczenie interfejsu Ustawienie bitu 6 umozliwia transmisje po magistrali SPI. Bit 5 – DODR: kolejnosc przesylu danych Bit 5 decyduje o kolejnosci przesylania danych, gdy bit 5 zostanie ustawiony w stan logicznej 1 (logiczna 1) dane beda przesylane od bitu najmlodszego do najstarszego, gdy bit 5 zostanie wyzerowany dane beda przesylane od bitu najstarszego do najmlodszego. Bit 4 – MSTR: wybór trybu master/slave Ustawienie bitu 4 powoduje przejscie urzadzenia do pracy w trybie nadrzednym master (wyzerowanie bitu spowoduje przejscie do pracy w trybie podrzednym slave). Bit ten jest zerowany poziomem niskim na linii SS.

Bit 3 – CPOL: wybór polaryzacji sygnalu taktujacego Bit 3 umozliwia wybór polaryzacji sygnalu taktujacego. Gdy na pozycji 3 zostanie wpisana logiczna 1 sygnal taktujacy w stanie spoczynku bedzie mial poziom wysoki, zas gdy 0 sygnal taktujacy w stanie spoczynku bedzie mial poziom niski. Bit 2 – CPHA: wybór fazy próbkowania Bit 2 dokonuje wyboru fazy próbkowania. Kiedy CPHA = 0 wówczas pierwsze zbocze sygnalu taktujacego próbkuje dane wejsciowe, a drugie zbocze przesuwa je w rejestrze i nadaje (dane sa próbkowane, a nastepnie przesuwane i wysylane). W przypadku gdy bit ten zostanie ustawiony w stan logicznej 1, wówczas pierwsze zbocze sygnalu taktujacego przesuwa dane w rejestrze i wysyla, a drugie zbocze próbkuje dane wejsciowe (dane sa przesuwane i wysylane a nastepnie próbkowane i wpisywane do rejestru). Bit 1 – SPR1, bit 0 – SPR0: wybór czestotliwosci taktujacej Bity 1 i 0 okreslaja czestotliwosc sygnalu taktujacego interfejsu pracujacego w trybie master. Wartosci bitów 1 i 0 nie maja wplywu na prace urzadzenia skonfigurowanego w trybie slave. Wybór czestotliwosci taktujacej SCK

SPR1 SPR0 SCK

0 0 fOSC/4

0 1 fOSC/16

1 0 fOSC/64

1 1 fOSC/128

Technika mikroprocesorowa

73

Rejestr statusowy interfejsu SPI - SPSR

Bit 7 6 5 4 3 2 1 0 Nazwa SPIF WCOL - - - - - -

Odczyt/zapis R R R R R R R R Wartosc poczatkowa 0 0 0 0 0 0 0 0 Bit 7 – SPIF: flaga sygnalizujaca zakonczenie transferu danej Bit 7 informuje o zakonczeniu przesylania danych. Gdy transfer jest kompletny (nastapi przepisanie rejestru szeregowego do bufora) flaga ta zostaje ustawiona i nastepuje skok do adresu $008 rozpoczynajacego procedure przerwania (jesli maska SPIE w rejestrze SPCR zostala ustawiona). Flaga SPIF jest zerowana sprzetowo po wyjsciu z obslugi przerwania, jak równiez po odczycie danych z rejestru SPDR. Do rejestru SPDR mozna wprowadzic kolejny bajt danych wylacznie w przypadku, gdy flaga SPIF jest wyzerowana. Bit 6 – WCOL: flaga sygnalizujaca kolizje podczas transferu danej Bit 6 kolizji zostaje ustawiony w stan logicznej 1, gdy zawartosc rejestru danych zostanie zmieniona podczas transmisji. Rejestr danych interfejsu SPI - SPDR

Bit 7 6 5 4 3 2 1 0 Nazwa MSB - - - - - - LSB

Odczyt/zapis R/W R/W R/W R/W R/W R/W R/W R/W Wartosc poczatkowa X X X X X X X X X - niezdefiniowana

17. Zegar czasu rzeczywistego DS1305 na magistrali SPI

Zegar czasu rzeczywistego DS1305 pelni role zegara i kalendarza podajacego czas oraz date w systemie BCD na liniach magistrali SPI. Uklad zlicza sekundy, minuty, godziny, dni, miesiace (uwzgledniajac rózna liczbe dni w miesiacu) oraz lata (uwzgledniajac lata przestepne). Zegar czasu rzeczywistego DS1305 moze pracowac w trybie 12-sto lub 24-ro godzinnym. Zegar czasu rzeczywistego DS1305 jest wyposazony w uklad ladowania baterii kontrolowany programowo. Bateria ladowalna moze zostac wykorzystana jako rezerwowe zródlo energii dla zegara. Dodatkowo zegar czasu rzeczywistego DS1305 posiada 96 bajtów pamieci RAM ogólnego przeznaczenia. Zegar czasu rzeczywistego DS1305 moze generowac dwa niezalezne alarmy. Stan alarmowy jest sygnalizowany stanem niskim na liniach odpowiednio: INT0 oraz INT1. Linie te moga zostac polaczone z wejsciami przerwan zewnetrznych mikrokontrolera. W ukladzie ewaluacyjnym EVB-503 linie zegara czasu rzeczywistego sa wyprowadzone na zlacze AUX3. Nalezy dokonac polaczen wg tabeli. Polaczenie linii zegara DS1305 i linii mikrokontrolera wyprowadzonych na zlacze AUX3 plytki EVB-503

Technika mikroprocesorowa

74

Linie zegara DS1305 Linie zlacza AUX3 (wyprowadzenia mikrokontrolera)

Linie mikrokontrolera

CE – linia wyboru (Chip Enable) ES (SS)– Chip Select (Slave Select) Np. PORTB, 4

SDI – wejscie danych (Serial Data Input)

SI (MOSI)– Master Output Slave Input

PORTB, 5

SDO – wyjscie danych (Serial Data Output)

SO (MISO) – Master Input Slave Output

PORTB, 6

SCLK – linia taktujaca (Serial Clock) SCK – Serial Clock PORTB, 7

INT0 – linia przerwania (Interrupt 0) /IR (INT0) – Interrupt 0 PORTD, 2

17.1. Rejestry zegara czasu rzeczywistego DS1305 Rejestry zegara DS1305 sa zapisywane i odczytywane z róznych lokacji w formacie BCD. Rejestr sekund Rejestr sekund (1-szy wiersz tabeli) odczytuje sie pod adresem 00h, a zapisuje pod adresem 80h. Bity 3, 2, 1, 0 przechowuja jednostki sekund. Bity 6, 5, i 4 przechowuja dziesiatki sekund. Bit 7 jest zawsze równy zero (60 zapisuje sie na 3-ch bitach). Np. 59 w zapisie BCD: starszy pólbajt = 5 (0101) mlodszy pólbajt = 9 (1001)

Rejestry zegara czasu rzeczywistego DS1305

Technika mikroprocesorowa

75

Adres szesnastkowy

Odczyt Zapis

Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Zakres

(BCD)

00H 80H 0 dziesiatki sekund sekundy 00-59

01H 81H 0 dziesiatki minut minuty 00-59

P 12

A

01-12 + P/A

02H 82H 0

24 10

dziesiatki

godzin

godziny

00-23

03H 83H 0 0 0 0 dni tygodnia 1-7

04H 84H 0 0 dziesiatki dni miesiaca dni miesiaca 1-31

05H 85H 0 0 dziesiatki miesiecy

miesiace 01-12

06H 86H dziesiatki lat lata 00-99

ALARM 0

07H 87H M 10 sekund alarmu sekundy alarmu 00-59

08H 88H M 10 minut alarmu minuty alarmu 00-59

P 12

A

01-12+P/A 09H 89H M

24 10

10

godziny godzina alarmu

00-23

0AH 8AH M 0 0 0 dzien alarmu 01-07

ALARM 1

0BH 8BH M 10 sekund alarmu sekundy alarmu 00-59

0CH 8CH M 10 minut alarmu minuty alarmu 00-59

P 0DH 8DH M 12

A

10

godziny

godzina alarmu 01-12+P/A

Technika mikroprocesorowa

76

24 10 00-23

0EH 8EH M 0 0 0 dzien alarmu 01-07

0FH 8FH Rejestr kontrolny -

10H 90H Rejestr statusowy -

11H 91H Rejestr ukladu ladujacego baterie -

12-1FH

92-9FH Zarezerwowane -

20-7FH

A0-FFH

96 bajtów pamieci RAM 00-FF

W zegarze DS1305 mozna zaprogramowac dwa alarmy ALARM0 i ALARM1 przez wybór dnia tygodnia oraz czasu (godzina, minuta, sekunda) dla kazdego z alarmów oddzielnie. Wyboru dnia i czasu ALARM-u 0 dokonuje sie w rejestrach 87H do 8AH, natomiast wyboru dnia i czasu ALARM-u 1 dokonuje sie w rejestrach 8BH do 8EH. Bit 7 kazdego z rejestrów alarmu jest bitem maski. Gdy 7-me bity (bity masek) we wszystkich rejestrach alarmu zostana wyzerowane, alarm bedzie generowany raz w tygodniu. Gdy bit maski rejestru dnia alarmu zostanie ustawiony w stan logicznej 1, alarm bedzie generowany codziennie. Gdy dodatkowo bit maski rejestru godziny alarmu zostanie ustawiony w stan logicznej 1, alarm bedzie generowany co godzine. Gdy dodatkowo bit maski rejestru minuty alarmu zostanie ustawiony w stan logicznej 1, alarm bedzie generowany co minute. Gdy dodatkowo bit maski rejestru sekundy alarmu zostanie ustawiony w stan logicznej 1, alarm bedzie generowany co sekunde.

Bity masek w rejestrach alarmów

Bity masek w rejestrach alarmów (7-me bity)

sekundy minuty godziny dni

1 1 1 1 Alarm co sekunde

0 1 1 1 Alarm co minute

0 0 1 1 Alarm co godzine

0 0 0 1 Alarm codziennie

0 0 0 0 Alarm co tydzien

Technika mikroprocesorowa

77

Rejestry specjalnego przeznaczenia Rejestr kontrolny (czytany pod adresem 0FH, zapisywany pod adresem 8FH).

Bit 7 6 5 4 3 2 1 0 Nazwa EOSC WP 0 0 0 INTCN AIE1 AIE0

Odczyt/zapis R/W R/W R/W R/W R/W R/W R/W R/W Wartosc poczatkowa 0 n/a 0 0 0 0 0 0

Bit 7 –EOSC: wlaczenie/wylaczenie oscylatora Wyzerowanie bitu EOSC rozpoczyna prace oscylatora. Ustawienie bitu EOSC zatrzymuje prace oscylatora i DS1305 wchodzi w tryb pracy energooszczednej. Bit 6 – WP: zabezpieczenie przed nieuprawnionym zapisem Przed kazda operacja zapisu do rejestru zegara lub RAM-u bit WP musi zostac wyzerowany. Ustawiony w stan logicznej 1 bit WP zapobiega operacji zapisania do rejestrów, w tym równiez na pozycje 1, 2 i 7 rejestru kontrolnego. Po resecie stan bitu WP jest nieustalony, dlatego przed operacja zapisu bit WP musi zostac wyzerowany. Bit 2 – INTCN: bit kontrolny przerwania Bit INTCN kontroluje zaleznosc miedzy alarmem, a stanem niskim na linii przerwania. Gdy bit INTCN jest ustawiony w stan logicznej 1, zrównanie rejestrów czasu i alarmu 0 zeruje linie INT0 (pod warunkiem uaktywnienia alarmu 0), a zrównanie rejestrów czasu i alarmu 1 zeruje linie INT1 (pod warunkiem uaktywnienia alarmu 1). Kiedy bit INTCN jest wyzerowany, zrównanie rejestrów czasu i alarmu 0 lub alarmu 1 zeruje linie INT0 (pod warunkiem uaktywnienia alarmów), podczas gdy linia INT1 nie pelni zadnej funkcji. Bit 1 – AIE1: wlaczenie przerwania alarmu 1 Gdy bit AIE1 jest ustawiony w stan logicznej 1, ustawienie flagi zadania przerwania 1 (IRQF1) w rejestrze statusowym wywoluje stan niski na linii INT1 (gdy INTCN=1) lub na linii INT0 (gdy INTCN=0). Gdy bit AIE1 jest wyzerowany, ustawienie flagi zadania przerwania 1 (IRQF1) w rejestrze statusowym nie wywoluje zmiany na zadnej linii.

Bit 0 – AIE0: wlaczenie przerwania alarmu 0 Gdy bit AIE0 jest ustawiony w stan logicznej 1 ustawienie flagi zadania przerwania 0 (IRQF0) w rejestrze statusowym wywoluje stan niski na linii INT0. Gdy bit AIE0 jest wyzerowany ustawienie flagi zadania przerwania 0 (IRQF0) w rejestrze statusowym nie wywoluje zadnej zmiany na linii INT0. Rejestr statusowy (czytany pod adresem 10H)

Bit 7 6 5 4 3 2 1 0 Nazwa 0 0 0 0 0 0 IRQF1 IRQF0

Odczyt/zapis R R R R R R R R Wartosc poczatkowa 0 0 0 0 0 0 0 0

Technika mikroprocesorowa

78

Bit 1 – IRQF1: flaga zadania przerwania 1 Flaga IRQF1 zostanie ustawiona sprzetowo, gdy nastapi zrównanie rejestrów czasu i alarmu1. Spowoduje to wyzerowanie linii INT1 pod warunkiem, ze bit maski AIE1 jest ustawiony w stan logicznej 1. Wyzerowanie flagi IRQF1 nastepuje, gdy którykolwiek z rejestrów Alarmu 1 zostanie odczytany lub zapisany. Bit 0 – IRQF0: flaga zadania przerwania 0 Flaga IRQF0 zostanie ustawiona sprzetowo, gdy nastapi zrównanie rejestrów czasu i alarmu 0. Spowoduje to wyzerowanie linii INT0 pod warunkiem, ze bit maski AIE0 jest ustawiony w stan logicznej 1. Wyzerowanie flagi IRQF0 nastepuje, gdy którykolwiek z rejestrów Alarmu 0 zostanie odczytany lub zapisany.

17.2. Transfer danych po magistrali SPI Uklad DS1305 rozpoznaje polaryzacje zegara przez próbkowanie linii SCLK w stanie wysokim CE. Na skutek tego kazda polaryzacja zegara SCLK jest akceptowana przez uklad DS1305. Wybór ukladu DS1305 nastepuje stanem wysokim na linii CE. Czestotliwosc taktujaca nie powinna przekraczac wartosci 2MHz, przy napieciu zasilania 5V. Zbocze impulsu CE powinno wyprzedzac 1-sze zbocze taktujace o co najmniej 2µs. Impulsy na magistrali SPI (np. impuls taktujacy) nie moga byc krótsze niz 0.5µs. Dane sa przesylane przez linie SDO podczas operacji odczytu i poprzez linie SDI podczas operacji zapisu. W trakcie transferu bajt adresowy jest nadawany jako pierwszy. Najstarszy bit (7-my bit) bajtu adresowego determinuje rodzaj operacji. Jesli bit 7 jest logiczna 1 , to nastapi operacja zapisu jednego lub kilku bajtów. Jesli bit 7 jest logicznym 0 , to nastapi operacja odczytu jednego lub kilku bajtów.

Rys.23. Zapis pojedynczego slowa po magistrali SPI

Technika mikroprocesorowa

79

Rys.24. Odczyt pojedynczego slowa po magistrali SPI W przypadku transferu pojedynczego slowa (bajtu) po dokonaniu zapisu lub odczytu linia CE ponownie jest ustawiana w stan niski. W przypadku transferu wielu bajtów, w trybie seryjnym, po podaniu adresu moze nastapic zapis lub odczyt wielu bajtów danych. Kazdy z cykli zapisu lub odczytu powoduje automatyczna inkrementacje adresu rejestru RTC (Real Time Lock) lub RAM-u. Inkrementacja jest kontynuowana dopóki trwa transfer. Podczas transferu do RTC adres powraca do wartosci 00h po wzroscie do 1Fh (podczas odczytu) i powraca do wartosci 80h po wzroscie do 9Fh (podczas zapisu). Podczas transferu do RAM-u adres powraca do wartosci 20h po wzroscie do 7Fh (podczas odczytu ) i powraca do wartosci A0h po wzroscie do FFh (podczas zapisu).

Rys.25. Transfer danych w trybie seryjnym po magistrali SPI

17.3. Przyklad konfiguracji magistrali SPI i nadawania bajtów Linie magistrali SPI (MOSI – portb, 5, MISO portb, 6, SCLK – portb, 7) oraz linie wyboru CE – portb.4 nalezy skonfigurowac jako wyjscia. Od momentu uaktywnienia interfejs SPI przejmuje kontrole nad liniami MOSI, MISO, SCLK. Linia CE musi byc w dalszym ciagu obslugiwana programowo.

Konfiguracja portu B (wyjscia)

Technika mikroprocesorowa

80

Ldi r16, 0xff Out ddrb, r16 Out portb, r16 Konfiguracja interfejsu SPI mikrokontrolera AT90S8515. Konfiguracja zegara czasu rzeczywistego DS1305 przez dokonanie wpisu do rejestru kontrolnego zegara. Przerwanie SPI nie zostalo uaktywnione.

Konfiguracja magistrali: wlaczenie interfejsu SPI w trybie master, ustalenie trybu 1 transmisji danych po magistrali, wybór predkosci transmisji danych fOSC/16

Ldi r16, (1<<spe)| (1<<mstr)| (1<<cpha)| (1<<spr0) Out spcr, r16 Konfiguracja zegara czasu rzeczywistego DS1305 polega na dokonaniu wpisu do rejestru kontrolnego zegara.

Wybór urzadzenia zewnetrznego (stanem wysokim na linii CE) Sbi portb, 4

Przygotowanie adresu rejestru kontrolnego zegara DS1305. Ldi r16, 0x8f

Rozpoczecie transmisji adresu rejestru zegara DS1305 Out spdr, r16

Oczekiwanie na zakonczenie transmisji i ustawienie flagi SPIF petlax: sbis spsr, spif rjmp petlax dalej:

Przygotowanie danej dla rejestru kontrolnego zegara DS1305. Dokonanie wpisu do rejestru kontrolnego spowoduje:

− wlaczenie oscylatora zegara DS1305, − zdjecie zabezpieczenia przed nie uprawnionym zapisem.

Ldi r16, 0

Rozpoczecie transmisji danej przeznaczonej dla rejestru kontrolnego zegara DS1305 Out spdr, r16

Oczekiwanie na zakonczenie transmisji i ustawienie flagi SPIF petlay: sbis spsr, spif rjmp petlay

Wyzerowanie linii wyboru Cbi portb, 4

Technika mikroprocesorowa

81

17.4. Przyklad odczytu rejestru sekund zegara DS1305 po magistrali SPI Odczyt rejestru sekund. Zakladamy, ze interfejs SPI mikrokontrolera AT90S8515 zostal wlasciwie skonfigurowany. Oscylator zegara DS1305 zostal uruchomiony, a zabezpieczenie przed zapisem zdjete. Przerwanie SPI nie zostalo uaktywnione.

Od poprzedniego cyklu transmisji (zakonczonego wyzerowaniem linii wyboru) musi minac co najmniej 0.5µs

Nop Nop Nop Nop

Wybór urzadzenia zewnetrznego (stanem wysokim na linii CE) Sbi portb, 4

Adres rejestru sekund dla odczytu : 00h Ldi r16, 0

Rozpoczecie transmisji adresu rejestru zegara DS1305 Out spdr, r16

Oczekiwanie na zakonczenie transmisji i ustawienie flagi SPIF petlax: sbis spsr, spif rjmp petlax dalej:

Przygotowanie danej „pustej” (wartosc danej bez znaczenia) Ldi r16, 0

Rozpoczecie transmisji danej „pustej” Out spdr, r16

Oczekiwanie na zakonczenie transmisji i ustawienie flagi SPIF petlay: sbis spsr, spif rjmp petlay

Wszystkie transmisje po magistrali SPI sa dwukierunkowe. Nadaniu danej „pustej” towarzyszy odbiór danej z rejestru sekund zegara. Odebrana dana zostaje przepisana do rejestru r16

In r16, spdr

Wyzerowanie linii wyboru Cbi portb, 4

Technika mikroprocesorowa

82

17.4. Przyklad zapisu danych do pamieci RAM zegara DS1305 z wykorzystaniem przerwania SPI Zapis 10-ciu bajtów danych do pamieci RAM zegara DS1305. Bajty danych sa pobierane z bufora zalozonego w pamieci RAM mikrokontrolera. Zakladamy, ze oscylator zegara DS1305 zostal uruchomiony, a zabezpieczenie przed zapisem zdjete.

Ustawienie wskaznika x na pierwszym bajcie bufora Ldi xh, high(bufor) Ldi xl, low(bufor)

Ustawienie licznika (w procedurze przerwania licznik jest najpierw dekrementowany, a potem bajt wysylany, dlatego dla wyslania 10-ciu bajtów trzeba ustawic wartosc poczatkowa licznika na 11)

Ldi licznik, 11

Konfiguracja magistrali: wlaczenie interfejsu SPI w trybie master, zdjecie maski przerwania SPI, ustalenie trybu 1 transmisji danych po magistrali, wybór predkosci transmisji danych fOSC/16

Ldi r16, (1<<spie)| (1<<spe)| (1<<mstr)| (1<<cpha)| (1<<spr0) Out spcr, r16

Wlaczenie przerwan Sei

Wybór urzadzenia zewnetrznego (stanem wysokim na linii CE) Sbi portb, 4

Adres poczatkowy pamieci RAM zegara DS1305 Ldi r16, 0xa0

Rozpoczecie transmisji adresu pamieci RAM zegara DS1305 Out spdr, r16

Skoki w miejscu Koniec: Rjmp koniec Fragment procedury przerwania SPI (adres $0008): Przerwanie_SPI:

Dekrementacja licznika, sprawdzenie, czy to ostatni bajt danych. Dec licznik Brne nie_ostatni Ostatni:

Wyzerowanie linii wyboru Cbi portb, 4

Technika mikroprocesorowa

83

Wylaczenie przerwan SPI

Ldi r16, (1<<spe)| (1<<mstr)| (1<<cpha)| (1<<spr0) Out spcr, r16 Reti Nie_ostatni:

Pobranie kolejnego bajtu danych z bufora Ld r16, x+

Transfer kolejnego bajtu danych po magistrali SPI z wpisaniem do kolejnej lokacji RAM-u zegara DS1305

Out spdr, r16 Reti Polecenia 32. Odczytuj w petli rejestry: sekund i minut i wyswietlaj wartosci na wyswietlaczu LCD w

postaci np. 35 : 20. W tym celu: • Odczytuj w petli zawartosc rejestrów sekund i minut zegara DS1305 w dwóch

oddzielnych sesjach komunikacyjnych po magistrali SPI. Kazda sesja komunikacyjna zaczyna sie ustawieniem linii wyboru w stan logicznej 1 a konczy sie wyzerowaniem linii wyboru. Miedzy sesjami nalezy zostawic przerwe min 0.5us (kilka rozkazów nop),

• Rejestry zegara przechowuja dane w formacie BCD np. rejestr minut przechowuje na górnym pólbajcie dziesiatki minut, a na dolnym pólbajcie jednostki minut. Przed podaniem na wyswietlacz LCD format danych nalezy przeksztalcic z BCD na ASCII. W tym celu nalezy:

o Wykorzystac iloczyn logiczny andi do wyzerowania najpierw dolnego pólbajtu, a nastepnie górnego pólbajtu,

o Wykorzystac rozkaz swap do zamiany pólbajtów (w ten sposób uzyskac binarny zapis dziesiatek i jednostek minut w dwóch oddzielnych rejestrach)

o Wykorzystac sume logiczna ori lub add do zamiany wartosci binarnych na ASCII (róznica miedzy wartoscia binarna, a ASCII cyfr wynosi 48).

33. Wyzeruj rejestry: sekund i minut zegara DS1305. Uaktywnij przerwanie ALARM 0 tak, aby alarm zachodzil co sekunde. W procedurze przerwania odczytuj rejestry: sekund i minut i wyswietlaj wartosci na LCD w postaci np. 35 : 20.

34. Ustaw wartosci poczatkowe daty i czasu w rejestrach zegara czasu rzeczywistego DS1305. Odczytuj w petli (lub pod przerwaniem) rejestry zegara i wyswietlaj date i czas na wyswietlaczu LCD np. w postaci:

01 grudnia 2007 14 : 45 : 05

35. Ustaw wartosci poczatkowe rejestrów czasu rzeczywistego oraz rejestrów alarmu 0.

Uaktywnij Alarm 0. Stan alarmowy sygnalizuj wlaczeniem Buzzera na czas okolo 1s. (W zestawie EVB-503 znajduje sie Buzzer znajduje sie na linii /ESP, która nalezy polaczyc z wybrana linia mikrokontrolera; wyjsciowy stan wysoki wlacza buczek, a niski wylacza buczek).

37. Ustaw wartosci poczatkowe daty i czasu programujac zegar czasu rzeczywistego DS1305 po laczu szeregowym UART z programu terminalowego np. Hyper Terminal. Wszystkie

Technika mikroprocesorowa

84

potrzebne zegarowi DS1305 ustawienia poczatkowe przeslij w jednym pakiecie w ustalonym formacie np. rok/miesiac/dzien/godzina/minuta ↵ (07/11/15/08/30↵ ) W tym celu: • Skonfiguruj interface UART w mikrokontrolerze (ustal predkosc, format znaku

np.8n1, wlacz odbiornik, • Wlacz przerwanie odbiorcze UART lub przygotuj petle testujaca flage odbiorcza, • Zalóz bufor w pamieci RAM, do którego beda przyjmowane znaki odbierane po

magistrali szeregowej, • Po rozpoznaniu charakterystycznego znaku konczacego pakiet konfiguracyjny np. ↵

rozpocznij odczyt bufora. Dokonaj przeksztalcenia dwóch kolejnych znaków ASCII przeksztalc na jeden znak w zapisie BCD, akceptowanym przez zegar DS1305:

o Od znaku w zapisie ASCII odejmij 48, aby uzyskac zapis binarny o „dziesiatki” przerzuc rozkazem swap na górny pólbajt o Polacz „dziesiatki” i „jednostki” rozkazem sumy logicznej ori o Zaprogramuj odpowiedni rejestr

36. Wykonaj prosty sekundnik. Zaprogramuj czas odliczany przez sekundnik za posrednictwem 3-ch przycisków, polaczonych z liniami wejsciowymi mikrokontrolera, oznaczonych: ENTER, → , ← . Po resecie mikrokontroler wyswietla

sekund: ← 0 →

Klawisze → , ← umozliwiaja zmiane liczby minut od 0 do 60. Wybór musi zostac zatwierdzony klawiszem ENTER. Po zatwierdzeniu wyborów program zeruje rejestr sekund zegara DS1305 i rozpoczyna odliczanie równoczesnie wyswietlajac na LCD liczbe sekund od wartosci poczatkowej do 0. Po zliczaniu zaprogramowanego czasu wlacz Buzzer na 1 sekunde.

18. Magistrala I2C Magistrala szeregowa I2C umozliwia dwukierunkowa, simpleksowa, synchroniczna transmisje danych miedzy mikrokontrolerem, a zewnetrznymi ukladami peryferyjnymi. Magistrala I2C sklada sie z dwóch linii: Linia SCL przesylane sa impulsy zegarowe synchronizujace transmisje, a linia SDA transmituje sie dane w dwóch kierunkach. Wszystkie urzadzenia dolaczone do magistrali posiadaja indywidualny adres. Adres ten sklada sie z 2-ch czesci:

− 4-ro bitowe pole adresowe identyfikujace typ urzadzenia − pole adresowe o zmiennej dlugosci pozwalajace rozróznic miedzy soba kilka urzadzen

tego samego typu podlaczonych do magistrali (liczba urzadzen tego samego typu, które mozna podlaczyc do magistrali jest ograniczona dlugoscia powyzszego pola adresowego).

Technika mikroprocesorowa

85

Rys.26. Przykladowa konfiguracja magistrali I2C

Urzadzenia podlaczone do magistrali moga byc skonfigurowane jako MASTER (urzadzenie nadrzedne, mikrokontroler) lub SLAVE (urzadzenie podrzedne). W danej sesji lacznosci tylko jeden mikrokontroler podlaczony do magistrali moze byc skonfigurowany jako MASTER, chociaz kazde z urzadzen moze pracowac zarówno jako nadajnik jak i odbiornik. Mikrokontroler MASTER generuje przebieg zegarowy SCL taktujacy transmisje oraz inicjuje lacznosc z wybranym urzadzeniem SLAVE podajac programowo jego adres. Wybrany SLAVE potwierdza odbiór bajtu adresowego, pozostale urzadzenia SLAVE pozostawiaja linie SDA w stanie wysokiej impedancji.

Rys.28. Polaczenie urzadzen z magistrala I2C

Uklady podlaczone do linii SCL i SDA magistrali I2C musza byc wyposazone w wyjscia z otwartym drenem podciagniete do zródla napiecia zasilajacego przez rezystor. Liczba urzadzen SLAVE, jaka moze byc dolaczona do jednego urzadzenia MASTER jest ograniczona (od strony sprzetowej) pojemnoscia tych urzadzen i nie moze przekroczyc wypadkowej wartosci 400pF. Stabilnosc i zmiana danych W stanie bezczynnym „idle” obie linie SCL i SDA znajduja sie w stanie logicznym wysokim. Przyjeto zalozenie, ze stan linii SDA moze ulegac zmianom jedynie przy niskim stanie sygnalu zegarowego, stan linii SDA musi byc stabilny przy wysokim stanie linii SCL. Naruszenie tej zasady w dwóch wyjatkowych sytuacjach pozwala na okreslenie poczatku i konca transmisji.

Technika mikroprocesorowa

86

Sekwencja startu i stopu Zmiana stanu na linii SDA z wysokiego na niski podczas wysokiego stanu SCL oznacza sekwencje startu, zas zmiana w kierunku przeciwnym – sekwencje stopu. Obie te sekwencje generuje urzadzenie MASTER.

Rys.29. Sekwencja startu i stopu Przeslanie slowa adresowego Sesja polaczeniowa inicjowana jest przez urzadzenie typu MASTER, przez wymuszenie stanu niskiego na linii SDA i wygenerowanie w ten sposób sekwencji startu. Nastepnie MASTER przesyla linia SDA, w takt impulsów zegarowych na linii SCL, osiem bitów slowa adresowego do urzadzenia SLAVE. Ósmy bit wybiera rodzaj operacji: logiczne 0 dla zapisu danych do urzadzenia peryferyjnego, logiczna 1 dla odczytu danych. Zaadresowane urzadzenie SLAVE wymusza stan niski na zwolnionej przez MASTER linii SDA w trakcie dziewiatego impulsu zegarowego, co oznacza potwierdzenie odebrania slowa adresowego. Sesja transmisji danych Dalsza transmisja danych przebiega podobnie. Urzadzenie nadajace przesyla osiem bitów danych do urzadzenia odbierajacego synchronicznie z 8-ma impulsami zegarowymi na linii SCL, a w czasie 9-tego impulsu SCL oczekuje na potwierdzenie w postaci logicznego 0. Sekwencja stopu konczy sesje transmisji danych.

Technika mikroprocesorowa

87

Rys.30. Sekwencja potwierdzenia odbioru znaku

19. Pamiec EEPROM AT24CXX na magistrali I2C Rodzina elektrycznie kasowanych i zapisywanych pamieci EEPROM AT24C01/02/04/08/16 jest zorganizowana w 128/256/512/1024/2048 slów 8-bitowych. Konfiguracja wyprowadzen pamieci EEPROM AT24C01/02/04/08/16

Funkcje wyprowadzen pamieci EEPROM AT24C01/02/04/08/16

Linia

wyprowadzenia

Funkcja

linii

A0-A2 Wejscia adresowe

SCL Wejscie zegarowe

SDA Linia danych

WP Zabezpieczenie przed

nieuprawnionym zapisem

SCL (serial clock) – wejscie zegara taktujacego transmisje danych. Maksymalna czestotliwosc zegara taktujacego nie moze przekroczyc 400kHz.

Technika mikroprocesorowa

88

SDA (serial data) – dwukierunkowa linia transmisji danych (linia jest typu „otwarty kolektor” i moze byc laczona z dowolna liczba innych linii tego samego typu). Linie adresowe (A0, A1, A2) – wejsciowe linie adresowe podlaczane do masy lub zasilania, konfiguruja sprzetowy adres pamieci na magistrali. Liczba linii adresowych determinuje liczbe urzadzen jednakowego typu (np. pamieci EEPROM), które moga zostac podlaczone do magistrali I2C mikrokontrolera. Pamieci AT24C01 i AT24C02 wykorzystuja linie A2, A1 i A0 - mozna podlaczyc 8 pamieci tego typu. Pamiec AT24C04 wykorzystuje linie A2 i A1 (A0 nie jest podlaczona) - mozna podlaczyc 4 pamieci tego typu. Pamiec AT24C08 wykorzystuje linie A2 (A1 i A0 nie sa podlaczone) - mozna podlaczyc 2 pamieci tego typu. Pamiec AT24C16 nie wykorzystuje linii adresowych A2, A1 i A0 – mozna podlaczyc tylko 1-na pamiec tego typu. WP (write protect) – zabezpieczenie przed zapisem – gdy linia WP jest w stanie wysokim, nie mozna przeprowadzic operacji zapisu ani odczytu pamieci, gdy linia WP jest w stanie niskim, operacje zapisu i odczytu sa dozwolone. Typy pamieci AT24CXX AT24C01 – 16 stron slów 8-mio bitowych, slowo adresowe ma dlugosc 7-miu bitów. AT24C02 – 32 stron slów 8-mio bitowych, slowo adresowe ma dlugosc 8-miu bitów. AT24C04 – 32 stron slów 16-sto bitowych, slowo adresowe ma dlugosc 9-miu bitów. AT24C08 – 64 stron slów 16-sto bitowych, slowo adresowe ma dlugosc 10-ciu bitów. AT24C16 – 128 stron slów 16-sto bitowych, slowo adresowe ma dlugosc 11-miu bitów.

19.1. Transmisja danych z pamiecia EEPROM AT24CXX po magistrali I2C W pamieci AT24CXX mozna zapisywac lub odczytywac pojedyncze slowa danych lub strony danych zgodne z zasadami stronicowania danego typu pamieci. Zapis slowa danych Wszystkie transmisje po magistrali I2C rozpoczynaja sie od sekwencji startu, po której nadawany jest adres urzadzenia. Adres urzadzenia sklada sie z:

− 4-bitowej sekwencji 1010, bedacej adresem wyrózniajacym pamieci EEPROM (niezaleznie od pojemnosci) podlaczone na magistrali I2C,

− 3 bitów adresu sprzetowego A2, A1, A0 i/lub najstarszych bitów adresu strony pamieci. Bity adresu sprzetowego musza miec ustawienie zgodne ze sposobem podlaczenia linii wyjsciowych A2, A1, A0 pamieci EEPROM (do zera lub zasilania). W szczególnosci: o W pamieciach o pojemnosci 1k i 2k adres sprzetowy sklada sie z bitów A2, A1, A0 o W pamieci o pojemnosci 4k adres sprzetowy sklada sie z bitów A2, A1, linia A0 nie

jest podlaczona, a odpowiadajacy jej bit jest najstarszym bitem adresu strony pamieci.

o W pamieci o pojemnosci 8k adres sprzetowy sklada sie z bitu A2. Linie A1 i A0 nie sa podlaczone, a odpowiadajace im bity sa wykorzystane jako najstarsze bity adresu strony pamieci.

Technika mikroprocesorowa

89

o W pamieci o pojemnosci 16k nie ma adresu sprzetowego. Linie A2, A1 i A0 nie sa podlaczone, a odpowiadajace im bity sa wykorzystane jako najstarsze bity adresu strony pamieci.

− 1 bit o wartosci logicznego 0 wybiera operacje zapisu danych.

Rys.31. Adresowanie pamieci serii AT24CXX Pod warunkiem stwierdzenia zgodnosci adresu pamiec EEPROM potwierdza ustawiajac linie SDA w stan logicznego 0. Jesli adres nie jest zgodny pamiec EEPROM wraca w stan „czuwania”. W kolejnym (2-gim) slowie adresowym mikrokontroler wysyla adres komórki pamieci EEPROM, do której ma byc zapisana dana. Pamiec EEPROM ponownie potwierdza ustawiajac linie SDA w stan logicznego 0. Nastepnie mikrokontroler wysyla 8-mio bitowa dana przeznaczona do zapisania w pamieci EEPROM. Pamiec EEPROM ponownie potwierdza ustawiajac linie SDA w stan logicznego 0. Mikrokontroler nadaje sekwencje stopu , która konczy transmisje. W tym momencie rozpoczyna sie wewnetrzny cykl zapisu pamieci EEPROM, który trwa okolo 10ms, w tym czasie wejscia pamieci sa nieaktywne. Sprawdzenia, czy proces zapisu dobiegl konca mozna dokonac wysylajac sekwencje startu i adres urzadzenia. EEPROM odpowie bitem logicznego 0 po zakonczeniu procesu zapisu.

Rys.32. Zapis slowa danych po magistrali I2C Zapis strony danych W pamieciach EEPROM o pojemnosci 1k, 2k strona liczy 8 slów, natomiast w pamieciach EEPROM o pojemnosci 4k, 8k, 16k strona liczy 16 slów. Poczatek transmisji jest taki sam, jak w przypadku zapisu jednego baju, ale po zapisaniu 1-go bajtu danych mikrokontroler moze jeszcze wyslac nie wiecej niz 7 kolejnych bajtów danych

Technika mikroprocesorowa

90

w przypadku pamieci EEPROM 1k/2k lub nie wiecej niz 15 bajtów danych w przypadku pamieci EEPROM 4k/8k/16k. Kazdy bajt danych jest potwierdzany przez EEPROM bitem potwierdzenia (logiczne 0). Mikrokontroler musi zakonczyc transmisje wysylajac sekwencje stopu. W trakcie zapisu strony inkrementacji sprzetowej podlegaja:

− 3 najmlodsze bity adresu danych w pamieciach EEPROM o pojemnosci 1k i 2k − 4 najmlodsze bity adresu danych w pamieciach EEPROM o pojemnosci

4k/8k/16k. Gdy inkrementowany w ten sposób adres strony dojdzie do konca strony, wówczas kolejny bajt danych zostanie zapisany na poczatku tej samej strony.

Rys.33. Zapis strony danych po magistrali I2C Odczyt slowa danych z podaniem adresu odczytu Odczyt slowa danych musi byc poprzedzony:

− sekwencja startu, − zapisem adresu urzadzenia (ósmy bit adresu jest logicznym 0, co oznacza operacje

zapisu) − zapisem adresu danej.

Po otrzymaniu potwierdzenia od pamieci EEPROM mikrokontroler generuje: − kolejna sekwencje startu − ponownie podaje adres urzadzenia, tym razem jednak ósmy bit jest logiczna 1

(wybór operacji odczytu). Pamiec EEPROM potwierdza odbiór adresu urzadzenia, po czym nastepuje odbiór slowa danych od pamieci EEPROM. Mikrokontroler nie potwierdza odbioru slowa danych, lecz generuje sekwencje stopu. Odczyt slowa danych z podaniem adresu odczytu

Technika mikroprocesorowa

91

Odczyt slowa danych spod ustalonego adresu Jesli adres komórki pamieci zostal ustawiony w stan logicznej 1 w toku poprzedniej lacznosci, to w kolejno realizowanym odczycie mozna pominac proces wyboru adresu komórki pamieci. W takim przypadku odczyt rozpoczyna sie sekwencja startu, nastepnie przeslaniem adresu urzadzenia z ostatnim bitem ustawiony w stan logicznej 1m (logiczna 1), po czym nastepuje odbiór slowa danych. Odbiór danej nie jest potwierdzany przez mikrokontroler, który zamiast potwierdzenia generuje sekwencje stopu. Odczyt slowa danych spod ustalonego adresu

Odczyt dowolnej liczby slów danych Poczatek transmisji jest taki sam, jak w przypadku odczytu jednego slowa danych. Po otrzymaniu slowa danych od pamieci mikrokontroler potwierdza logicznym 0. Dopóki mikrokontroler potwierdza odbiór, pamiec EEPROM wysyla kolejne slowa inkrementujac sprzetowo adres pobierania danych. Po osiagnieciu adresu ostatniej komórki pamieci adres zeruje sie i kolejny odczyt nastepuje spod adresu zerowego pamieci EEPROM. Zakonczenie odczytu nastepuje, gdy mikrokontroler nie potwierdzi odbioru kolejnego slowa, lecz wygeneruje sekwencje stopu. Odczyt dowolnej liczby slów danych

Technika mikroprocesorowa

92

19.2. Wybrane procedury transmisji danych (start, stop, zapis, odczyt slowa danych) Mikrokontroler AT90S8515 (zamiennik ATMega8515) wykorzystany w ukladzie ewaluacyjnym EVB-503 nie posiada interfejsu TWI (odpowiednik interfejsu I2C opracowany w firmie ATMEL). Magistrala I2C musi byc obslugiwana programowo, co narzuca koniecznosc programowego generowania sygnalu zegarowego SCL i szeregowego zapisu/odczytu bitów na linii SDA w zalozonym rezimie czasowym. Opracowane przyklady sa dostosowane do tego wymagania.

Linie magistrali I2C laczymy z wybranymi dowolnie liniami mikrokontrolera (wybrano linie 2 i 3 portu B)

.equ SDA = 2

.equ SCL = 3 Sekwencja startu

Sekwencja startu, zakladam, ze przed wykonaniem procedury linie SDA i SCL sa w stanie logicznym „high”, opóznienie czasowe przyjeto z nadmiarem

Sekwencja_startu: sbi portb, SDA sbi portb, scl rcall delay_10nop Cbi portb, SDA Rcall delay_10nop Cbi portb, SCL Rcall delay_10nop ret

Sekwencja stopu

Sekwencja stopu, zakladam, ze przed wykonaniem procedury linie SDA i SCL sa w stanie logicznym „low”, opóznienie czasowe przyjeto z nadmiarem

Sekwencja_stopu: cbi portb, SDA rcall delay_10nop Sbi portb, SCL Rcall delay_10nop Sbi portb, SDA Rcall delay_10nop Ret

Technika mikroprocesorowa

93

Impuls dodatni

Impuls dodatni, opóznienie czasowe przyjeto z nadmiarem Impuls_SCL:

Rcall Delay_10nop Sbi portb, SCL Rcall delay_10nop Cbi portb, SCL Rcall delay_10nop Ret

Procedura nadania jednego slowa po magistrali I2C z odbiorem potwierdzenia

Procedura nadawania 1-go bajtu po magistrali I2C z odbiorem potwierdzenia. Przed wykonaniem procedury linia SCL jest w stanie logicznym „low”. Przed wykonaniem procedury rejestr licznik_bitow musi zawierac wartosc 8, a rejestr I2C_data musi zawierac slowo do wyslania po magistrali.

Wyslij_slowo: Rotacja slowa przez bit przeniesienia C, bit C zostanie nadany w linie SDA

Rol I2C_data Brcc sda_low

Bit C o wartosci logicznej 1 zostaje nadany w linie SDA

Sda_high: Sbi portb, SDA Rcall impuls_SCL Rjmp licz1

Bit C o wartosci logicznej 1 zostaje nadany w linie SDA

Sda_low: cbi portb, SDA Rcall impuls_SCL Rjmp licz1

Licz1:

Dekrementacja licznika bitów Dec licznik_bitow Brne wyslij_slowo

Podwieszamy linie SDA przed spodziewanym potwierdzeniem

Sbi portb, SDA Rcall delay_10nop

9-ty impuls SCL Sbi portb, SCL Rcall delay_10nop

Odczyt linii SDA w celu rozpoznania potwierdzenia (zwarcie linii przez urzadzenie na

magistrali) Sbis pinb, SDA Rjmp potwierdzone

Technika mikroprocesorowa

94

Rjmp Nie_potwierdzone Potwierdzone:

Clc Cbi portb, SCL Rcall delay_10nop Ret

Brak potwierdzenia jest sygnalizowany programowym ustawieniem bitu C i moze

zostac wykorzystany do zatrzymania lub powtórzenia cyklu lacznosci Nie_potwierdzone:

Sec Cbi portb, SCL Rcall delay_10nop Ret

Procedura odbioru jednego slowa po magistrali I2C

Procedura odbioru 1-go bajtu po magistrali I2C z potwierdzeniem. Przed wykonaniem procedury linia SCL jest w stanie logicznym „low” . Przed wykonaniem procedury rejestr licznik_bitow musi zawierac wartosc 8.

odbierz_slowo:

sbi portb, SDA odd:

Wygenerowanie impulsu na linii SCL Sbi portb, SCL Rcall delay_10nop

Odczyt stanu linii SDA Sbic pinb, SDA Rjmp bit_high Rjmp bit_low

Bit_high:

Ustawienie bitu C Sec Wprowadzenie ustawionego bitu C do rejestru I2C_data metoda rotacji Rol I2C_data Rjmp aa1

Bit_low:

Wyzerowanie bitu C Clc Wprowadzenie wyzerowanego bitu C do rejestru I2C_data metoda rotacji Rol I2C_data Rjmp aa1

Aa1:

Rcall delay_5us

Technika mikroprocesorowa

95

Wyzerowanie impulsu SCL Cbi portb, SCL Dec licznik_bitow Brne odd Ret

Procedura potwierdzenia odbioru slowa po magistrali I2C

Potwierdzamy odbiór slów od pamieci EEPROM logicznym 0 w trakcie 9-go impulsu SCL. Przed wykonaniem procedury linia SCL jest w stanie logicznym „low”

Potwierdzenie:

Cbi portb, SDA Rcall delay_10nop Sbi portb, SCL Rcall delay_10nop Cbi portb, SCL Ret

Ostatnie odebrane slowo nie jest potwierdzane tzn., ze w czasie 9-tego impulsu SCL

linia SDA pozostaje w stanie wysokim. Zamiast potwierdzenia odbioru slowa mikrokontroler generuje sekwencje stopu.

Brak_potwierdzenia:

Sbi portb, SDA Rcall delay_10nop Sbi portb, SCL Rcall delay_10nop Cbi portb, SCL Ret

19.3. Przyklad zapisu slowa danych w pamieci AT24C04 Przygotowanie adresu urzadzenia tj. pamieci AT24C04.

− Zakladamy, ze linie adresu sprzetowego A2 i A1 sa polaczone z masa. − Zakladamy, ze dana zostanie wpisana do komórki o adresie 9-bitowym

101010101, którego najstarszy bit (logiczna 1) zostanie umieszczony na pozycji P0 slowa adresowego.

− Na pozycji R/W wstawiamy logiczne 0 jako wybór operacji zapisu

Adres urzadzenia: 10100010 Adres komórki pamieci: 01010101

.def adres_urzadzenia = r20

.def adres_pamieci = r21

.def licznik_bitow = r22 Ldi adres_urzadzenia, 0b10100010

Technika mikroprocesorowa

96

Ldi adres_pamieci, 0b01010101 Rcall sekwencja_startu

Przeslanie adresu urzadzenia Ldi licznik_bitow, 8 Mov I2C_data, adres_urzadzenia Rcall wyslij_slowo

Przeslanie adresu komórki pamieci. Ldi licznik_bitow, 8 Mov I2C_data, adres_pamieci Rcall wyslij_slowo

Przeslanie danej. Ldi licznik_bitow, 8 Ldi I2C_data, 0x66 Rcall wyslij_slowo Rcall sekwencja_stopu

19.4. Przyklad odczytu danych z pamieci AT24C02 Przygotowanie adresu urzadzenia tj. pamieci AT24C02.

− Zakladamy, ze linie adresu sprzetowego A2, A1, A0 sa polaczone z masa. − Zakladamy, ze zostanie odczytanych kolejnych 5 stron liczac od strony 15-stej,

czyli od adresu w pamieci EEPROM 8*15=120 (120 = 0b0111000)

Adres urzadzenia: 10100000 Adres komórki pamieci: 01111000

.def adres_urzadzenia = r20

.def adres_pamieci = r21

.def licznik_bitow = r22

.def licznik_slow = r23 Ldi adres_urzadzenia, 0b10100000 Ldi adres_pamieci, 0b01111000 Rcall sekwencja_startu

Przeslanie adresu urzadzenia Ldi licznik_bitow, 8 Mov I2C_data, adres_urzadzenia Rcall wyslij_slowo

Technika mikroprocesorowa

97

Przeslanie adresu komórki pamieci.

Ldi licznik_bitow, 8 Mov I2C_data, adres_pamieci Rcall wyslij_slowo

Ponowne przeslanie sekwencji startu Rcall sekwencja_startu

Ponowne przeslanie adresu urzadzenia, tym razem z 8-mym bitem o wartosci logicznej 1, która wybiera operacje odczytu

Ldi licznik_bitow, 8 Mov I2C_data, adres_urzadzenia Ori I2C_data, 0b00000001 Rcall wyslij_slowo

Odczyt 40-ciu bajtów z pamieci EEPROM (39 bajtów zostaje potwierdzonych, 40-sty bajt nie jest potwierdzany)

Ldi licznik_slow, 40 ldi xh, high(bufor) ldi xl, low(bufor) petla: Ldi licznik_bitow, 8 Rcall odbierz_slowo ST x+, I2C_data Dec licznik_slow Brne kolejne Rjmp ostatnie Kolejne: Rcall potwierdzenie Rjmp petla Ostatnie: Rcall brak_potwierdzenia Rcall sekwencja_stopu Polecenia Sprawdz, jaka jest pojemnosc pamieci EEPROM serii AT24CXX dolaczonej do wykorzystywanego przez Ciebie zestawu EVB-503. Wszystkie linie adresu sprzetowego pamieci EEPROM (linie A2, A1, A0) sa dolaczone do masy. 38. Napisz program, który zapisuje w zewnetrznej pamieci EEPROM (na stronie 5-tej

pamieci) tekst w postaci znaków ASCII o dlugosci okolo 20 znaków i zaprogramuj nim mikrokontroler.

39. Napisz program odczytujacy z zewnetrznej pamieci EEPROM powyzszy tekst z wyswietlaniem na LCD i zaprogramuj nim mikrokontroler. Sprawdz, czy program jest

Technika mikroprocesorowa

98

prawidlowo wykonywany po kolejnych operacjach RESET-u mikrokontrolera (lub po kolejnym wylaczaniu i wlaczaniu zasilania).

20. Magistrala 1-wire Magistrala 1-wire sklada sie z pojedynczej linii. Na magistrali 1-wire jedno urzadzenie MASTER nadzoruje prace jednego lub wielu urzadzen SLAVE. Urzadzenie MASTER oraz wszystkie SLAVE sa podlaczone do magistrali wyjsciem tranzystora „otwarty dren” lub bramka trójstanowa. Takie podlaczenie umozliwia „zwolnienie” linii przez kazde z urzadzen po zakonczeniu transmisji. Magistrala 1-wire wymaga zewnetrznego rezystora podciagajacego do zasilania o wartosci okolo 5kΩ. Stanem bezczynnym magistrali jest stan wysoki. Uklad DS18B20 jest zawsze urzadzeniem typu SLAVE. Wszystkie komendy i dane sa nadawane do DS18B20 po magistrali poczawszy od najmlodszego bitu.

Impuls resetu i obecnosci Sekwencja inicjalizacji Komunikacja po magistrali 1-wire rozpoczyna sie od sekwencji inicjalizacji, która sklada sie z impulsu resetu nadawanego przez urzadzenie MASTER (mikrokontroler) potwierdzanego impulsem obecnosci przez urzadzenie SLAVE (termometr DS18B20). W czasie impulsu resetu MASTER zwiera magistrale do masy na czas co najmniej 480 µs. Po tym czasie MASTER zwalnia magistrale, która wskutek podciagniecia rezystorem 5k przechodzi w stan wysoki. DS18B20 dokonuje detekcji zbocza narastajacego, czeka 15 – 60 µs, po czym nadaje impuls obecnosci zwierajac magistrale do masy na czas 60 – 240 µs. Ramka nadawcza Nadawanie stanów logicznych 0 i 1 przez urzadzenie MASTER odbywa sie w ramkach czasowych. Kazda ramka czasowa trwa co najmniej 60 µs, z odstepem miedzy ramkami co najmniej 1µs. Ramki obu stanów logicznych rozpoczynaja sie od zbocza opadajacego. Nadanie stanu logicznej 1 polega na zwarciu magistrali do zera przez urzadzenie MASTER na czas 15 µs, a nastepnie zwolnieniu magistrali. Po zwolnieniu rezystor podciagajacy 5k przywróci magistrali stan logicznej 1.

Technika mikroprocesorowa

99

Nadanie stanu logicznego 0 polega na zwarciu magistrali do zera przez urzadzenie MASTER i podtrzymanie tego stanu przez czas co najmniej 60 µs. DS18B20 próbkuje magistrale w czasie od 15 do 60 µs liczac od zbocza opadajacego rozpoczynajacego stan logiczny. Jesli odczytany stan jest wysoki DS18B20 rozpoznaje logiczna 1, jesli odczytany stan jest niski DS18B20 rozpoznaje logiczne0. Ramka odbiorcza Urzadzenie SLAVE moze transmitowac dane po magistrali tylko w ramkach odbiorczych zainicjowanych przez urzadzenie MASTER. MASTER powinien wygenerowac ramke odbiorcza po nadaniu rozkazu Konwersji temperatury (44h) lub innych rozkazów obslugiwanych przez termometr DS18B20.

Stany logiczne na magistrali w trybie TX urzadzenia MASTER Kazda ramka czasowa trwa co najmniej 60 µs, z odstepem miedzy ramkami co najmniej 1µs. Ramki obu stanów logicznych rozpoczynaja sie od stanu niskiego wygenerowanego przez urzadzenie MASTER i trwajacego co najmniej 1 µs. Po tym czasie MASTER zwalnia magistrale, a DS18B20 rozpoczyna transmisje logicznej 1 pozostawiajac magistrale w stanie wysokim lub logicznego 0 zwierajac ja do masy. Stan logiczny transmitowany przez DS18B20 jest utrzymywany na magistrali przez 15 µs, po czym urzadzenie SLAVE zwalnia magistrale, która wraca na stan wysoki za sprawa rezystora podciagajacego 5k. MASTER musi sprawdzic stan magistrali przed uplywem 15 µs od rozpoczecia ramki odbiorczej.

Technika mikroprocesorowa

100

Stany logiczne magistrali w trybie RX urzadzenia MASTER

21. Termometr cyfrowy DS18B20 Uklad DS18B20 zawiera czujnik temperatury i przetwornik A/C o rozdzielczosci 12-sto bitowej, co odpowiada pomiarowi temperatury z krokiem 0.0005°C. Pomiar temperatury i konwersja analogowo-cyfrowa rozpoczyna sie na rozkaz 44h wydany przez urzadzenie MASTER (mikrokontroler) i trwa okolo 750ms. Wynik pomiaru jest zapamietywany w 2-bajtowym rejestrze. Jesli bezposrednio po wdaniu rozkazu 44h MASTER bedzie generowal ramki odbiorcze, to DS18B20 bedzie odpowiadal logicznym 0 dopóki trwa konwersja, a po jej zakonczeniu odpowie logiczna 1 (opcja ta jest dostepna pod warunkiem zapewnienia zewnetrznego zasilania). Pomiar temperatury jest kalibrowany w stopniach Celsjusza i zapamietywany w postaci liczby 16-sto bitowej ze znakiem w kodzie uzupelnienia do dwóch. Bit S umieszczony na starszym bajcie jest znakiem liczby: 0 oznacza liczbe dodatnia, 1 liczbe ujemna. Rejestr temperatury (LS byte)

Bit 7 6 5 4 3 2 1 0 Nazwa 23 22 21 20 2-1 2-2 2-3 2-4

Rejestr temperatury (MS byte)

Bit 15 14 13 12 11 10 9 8 Nazwa S S S S S 26 25 24

Format zapisu temperatury TEMPERATURA FORMAT ZAPISU (BINARNY) FORMAT ZAPISU (HEX)

+125.0°C 0000 0111 1101 0000 07D0h

+85.0°C 0000 0101 0101 0000 0550h

+25.0625°C 0000 0001 1001 0001 0191h

Technika mikroprocesorowa

101

+10.125°C 0000 0000 0010 1010 002Ah

+0.5°C 0000 0000 0000 1000 0008h

– 0°C 0000 0000 0000 0000 0000h

–0.5°C 1111 1111 1111 1000 FFF8h

–10.125°C 1111 1111 0101 1110 FF5Eh

–25.0625°C 1111 1110 0110 1111 FE6Fh

–55.0°C 1111 1100 1001 0000 FC90h

Zasilanie ukladu DS18B20 Uklad DS18B20 moze byc zasilany z zewnetrznego zródla podlaczonego do pinu VDD lub bezposrednio z linii 1-wire. W trybie zasilania przez magistrale 1-wire moc jest dostarczana do ukladu w stanie wysokim magistrali. W tym samym czasie jest ladowany kondensator, który sluzy jako zródlo energii w stanie niskim magistrali. W trybie zasilania przez magistrale 1-wire linia VDD musi byc zwarta do masy. Kod urzadzenia Kazde urzadzenie na magistrali 1-wire posiada unikalny 64-bitowy zapisany w pamieci stalej ROM. Kod urzadzenia sklada sie z 8-mio bitowego kodu rodziny urzadzen (10h dla rodziny DS18B20) zajmujacego najmlodsze 8 bitów, 48-bitowego unikalnego numeru seryjnego urzadzenia oraz 8-mio bitowego kodu CRC obliczonego z poprzedzajacych 56 bitów. Pamiec urzadzenia DS18B20 Pamiec ukladu DS18B20 sklada sie z 8-miu rejestrów, temperatura jest zapisywana na dwóch pierwszych rejestrach: 0-wy rejestr zawiera mlodszy bajt pomiaru temperatury, 1-szy rejestr zawiera starszy bajt pomiaru temperatury. Podczas transmisji na magistrali dane sa nadawane poczawszy od najmlodszego bitu 0-wego slowa (bajtu). Przykladowa sesja komunikacyjna po magistrali w celu pomiaru temperatury

TRYB URZADZENIA

MASTER

DANE

(NAMLODSZY BIT JAKO 1-SZY)

KOMENTARZ

TX Impuls resetu Master generuje impuls resetu

RX Impuls obecnosci DS18B20 odpowiada impulsem obecnosci

TX CCh Master wydaje rozkaz pominiecia odczytu pamieci ROM

TX 44h Master wydaje rozkaz pomiaru temperatury

Technika mikroprocesorowa

102

TX Podciagniecie linii Master utrzymuje magistrale w stanie wysokim w czasie pomiaru

TX Impuls resetu Master generuje impuls resetu

RX Impuls obecnosci DS18B20 odpowiada impulsem obecnosci

TX CCh Master wydaje rozkaz pominiecia odczytu pamieci ROM

TX BEh Master wydaje rozkaz odczytu pamieci RAM urzadzenia

RX Odczyt 2-ch bajtów Master odczytuje wynik pomiaru temperatury

Procedury czasowe magistrali 1-wire W komunikacji po magistrali 1-wire precyzyjne odliczanie czasów trwania impulsów jest elementem niezbednym dla nawiazania lacznosci miedzy urzadzeniem master i urzadzeniem slave. Ponizsze procedury czasowe zoptymalizowano dla potrzeb komunikacji po magistrali 1-wire.

Procedura odliczajaca czas 480µs stop_min_480us: push r24 push r25 ldi r24, 4 czek2: ldi r25, 255 czek1: dec r25 brne czek1 dec r24 brne czek2 pop r25 pop r24 ret

Procedura odliczajaca czas 65µs stop_65us: push r25 ldi r25, 127 czek3: dec r25 brne czek3 pop r25 ret

Procedura odliczajaca czas 415µs stop_415us: push r24 push r25

Technika mikroprocesorowa

103

ldi r24, 4 czek5: ldi r25, 206 czek4: dec r25 brne czek4 dec r24 brne czek5 pop r25 pop r24 ret

Procedura odliczajaca czas 11µs stop_11us: push r25 ldi r25,19 czek6: dec r25 brne czek6 pop r25 ret

Procedura odliczajaca czas 80µs stop_80us: push r25 ldi r25, 158 czek7: dec r25 brne czek7 pop r25 ret

Procedura odliczajaca czas 60µs stop_60us: push r25 ldi r25, 117 czek8: dec r25 brne czek8 pop r25 ret

Procedura odliczajaca czas 1s stop_1s: ldi r25, 40 czek11: ldi r24, 200 czek10: ldi r23, 250 czek9: dec r23 brne czek9 dec r24 brne czek10 dec r25 brne czek11 ret

Technika mikroprocesorowa

104

Definicje rejestrów i linii w programie obslugi ukladu DS18B20 .equ 1wire = 2 .equ dioda =3 .equ wyjscie_1wire = portb .equ kierunek_1wire = ddrb .equ wejscie_1wire = pinb .def licznik_bitow = r18 .def 1wire_data = r19 Procedura inicjalizacji Procedura inicjalizacji generuje impuls reset, nastepnie sprawdza impuls obecnosci urzadzenia DS18B20 na magistrali

Konfiguracja diody sygnalizacyjnej Sbi kierunek_1wire, 3 Sbi wyjscie_1wire, 3

inicjalizacja_1wire:

Generacja impulsu resetu sbi kierunek_1wire, 1wire cbi wyjscie_1wire, 1wire rcall stop_min_480us cbi kierunek_1wire, 1wire sbi wyjscie_1wire, 1wire rcall stop_65us

Odczyt impulsu obecnosci od urzadzenia na magistrali 1-wire sbic wejscie_1wire, 1wire rjmp brak_odpowiedzi rcall stop_415us sbis wejscie_1wire, _1wire rjmp brak_odpowiedzi clc rjmp koniec_inicjalizacji

Nieobecnosc urzadzenia jest sygnalizowana ustawieniem bitu c i zapaleniem diody sygnalizacyjnej

brak_odpowiedzi: sec koniec_inicjalizacji: ret Procedura zapisu slowa Procedura zapisu slowa (bajtu) na magistrali 1-wire - bajt do zapisania jest przekazywany przez rejestr 1wire_data

Technika mikroprocesorowa

105

1wire_zapisz_bajt: ldi licznik_bitow, 8 sbi kierunek_1wire, 1wire nastepny_bit: ror 1wire_data brcc 1wire_low1 1wire_high1: cbi wyjscie_1wire, 1wire rcall stop_11us sbi wyjscie_1wire, 1wire rcall stop_60us rjmp licz_bity 1wire_low1: cbi wyjscie_1wire, 1wire rcall stop_80us sbi wyjscie_1wire, 1wire licz_bity: rcall stop_60us dec licznik_bitow brne nastepny_bit ret Procedura odczytu slowa Procedura odczytu slowa (bajtu) po magistrali 1-wire – odczytany bajt znajduje sie w rejestrze 1wire_data 1wire_odczytaj_bajt: ldi licznik_bitow, 8 nastepny2:

Generacja zbocza opadajacego sbi kierunek_1wire, 1wire cbi wyjscie_1wire, 1wire nop nop nop nop

Zwolnienie linii w celu odbioru stanu od urzadzenia na magistrali cbi kierunek_1wire, 1wire sbi wyjscie_1wire, 1wire rcall stop_11us

Odczyt stanu na magistrali sbic wejscie_1wire, 1wire rjmp 1wire_high2

Technika mikroprocesorowa

106

Odczytano stan logicznego 0

1wire_low2: clc

rjmp wsun1

Odczytano stan logicznego 0 1wire_high2: sec wsun1:

Odczytany stan logiczny zostaje „wsuniety” na najstarsza pozycje slowa 1wire_data ror 1wire_data

rcall stop_60us dec licznik_bitow brne nastepny2 ret Odczyt temperatury z dokladnoscia do 0.5°C Wynik pomiaru temperatury o rozdzielczosci 12-sto bitowej zajmuje 1-szy i 2-gi rejestr pamieci urzadzenia DS18B20. Po przepisaniu dwóch bajtów do podrecznego bufora nalezy je wspólnie obrócic tak, aby bity 26, 25, 24, 23, 22, 21, 20, 2-1 znalazly sie w jednym rejestrze.

Odczyt 2-ch bajtów z pamieci DS18B20 z zapisem do bufora w mikrokontrolerze ldi r16, 2 ldi zh, high(bufor) ldi zl, low(bufor) kolejna: rcall 1wire_odczytaj_bajt st z+, 1wire_data dec r16 brne kolejna

Wskaznik na poczatek bufora, odczyt dwóch bajtów

ldi zh, high(bufor) ldi zl, low(bufor) ld r16 ,z+ ld r17, z+

Zgodny obrót dwóch odczytanych bajtów, az do uzyskania danej o rozdzielczosci 0.5°C

ror r17 ror r16 ror r17 ror r16 ror r17 ror r16

Technika mikroprocesorowa

107

Polecenia 40. Napisz program, który dokonuje konwersji (odczytu) temperatury, a odczytana wartosc

temperatury o rozdzielczosci 0.5°C wyswietla na diodach. 41. Napisz program, który dokonuje konwersji (odczytu) temperatury, a odczytana wartosc

temperatury o rozdzielczosci 0.5°C wyswietla na LCD.

22. Lista wybranych rozkazów

22.1. Rozkazy obslugujace stos PUSH Umieszcza zawartosc rejestru na stosie Umieszcza zawartosc rejestru Rd na stosie. Po operacji wskaznik stosu jest dekrementowany o 1.

Kod rozkazu: PUSH Rd gdzie 0 = d = 31

Cykle zegarowe: 1 Przyklad Push r16 POP Zdejmuje dana ze stosu i umieszcza w rejestrze Zdejmuje dana ze stosu i umieszcza w rejestrze Rd. Po operacji wskaznik stosu jest inkrementowany o 1.

Kod rozkazu: POP Rd gdzie 0 = d = 31

Cykle zegarowe: 1 Przyklad Push r17 zachowaj rejestr r17 na stosie In r16, sreg skopiuj rejestr statusowy sreg do rejestru r16 Push r16 zachowaj rejestr r16 na stosie („de facto” na stosie przechowywany jest

w tym momencie rejestr statusowy sreg) Pop r16 „zdejmij”r16 ze stosu Out sreg, r16 skopiuj r16 do rejestru statusowego sreg Pop r17 „zdejmij” r17 ze stosu

22.2. Rozkazy skoków *************************************************************************** RJMP Skok bezwarunkowy Licznik programu skacze do miejsca w kodzie programu okreslonego przez podanie etykiety k: PC ← PC + k + 1

Kod rozkazu: RJMP k

Cykle zegarowe: 1 ***************************************************************************

Technika mikroprocesorowa

108

BREQ Skok warunkowy (wykonywany pod warunkiem, ze równe) Testuje flage Z i skacze do wskazanej etykiety k, jesli flaga Z jest ustawiona. Jesli Rd=Rr (Z=1) , to PC ← PC + k + 1, Jesli Rd≠Rr (Z=0) , to PC ← PC + 1.

Kod rozkazu: BREQ k gdzie -64 = k = 63

Cykle zegarowe: 1, jesli warunek nie jest spelniony, 2, jesli warunek jest spelniony Przyklad cpi r19,3 Porównaj r19 z liczba 3 breq etykieta Skocz, jesli r19 = 3 ... etykieta: Etykieta skoku nop (nic nie rób) *************************************************************************** BRNE Skok warunkowy (wykonywany pod warunkiem, ze nie równe) Testuje flage Z i skacze do wskazanej etykiety k, jesli flaga Z jest wyzerowana. Jesli Rd≠Rr (Z=0) , to PC ← PC + k + 1, Jesli Rd=Rr (Z=1) , to PC ← PC + 1.

Kod rozkazu: BRNE k gdzie -64 = k = 63

Cykle zegarowe: 1, jesli warunek nie jest spelniony, 2, jesli warunek jest spelniony Przyklad Clr r27 wyzeruj r27 loop: inc r27 inkrementuj r27 cpi r27,5 porównaj r27 z liczba 5 brne loop Skocz do etykiety loop, jesli r27<>5 rjmp out_of_loop W przeciwnym razie skocz do etykiety out_of_loop …… Out_of_loop: etykieta docelowa nop rozkaz pusty (nie rób niczego) *************************************************************************** SBIC Przeskocz jeden rozkaz, jesli wskazany bit w rejestrze przestrzeni I/O jest

wyzerowany Rozkaz dziala na 32 mlodszych rejestrach przestrzeni I/O.

Kod rozkazu: SBIC A, b gdzie A – nazwa rejestru, , 0 = b = 7

Cykle zegarowe: 1, gdy warunek nie jest spelniony ( nie przeskakujemy rozkazu) 2, gdy warunek jest spelniony (przeskakujemy rozkaz) Przyklad Sbic portb, 4 Przeskocz jeden rozkaz, jesli bit 4 w rejestrze portb jest wyzerowany rjmp ety1 rjmp ety2 *************************************************************************** SBIS Przeskocz jeden rozkaz, jesli wskazany bit w rejestrze przestrzeni I/O jest

ustawiony w stan logicznej 1 Rozkaz dziala na 32 mlodszych rejestrach przestrzeni I/O.

Technika mikroprocesorowa

109

Kod rozkazu: SBIS A, b gdzie A – nazwa rejestru, , 0 = b = 7

Cykle zegarowe: 1, gdy warunek nie jest spelniony ( nie przeskakujemy rozkazu) 2, gdy warunek jest spelniony (przeskakujemy rozkaz) Przyklad Sbis portb, 4 Przeskocz jeden rozkaz, jesli bit 4 w rejestrze portb jest ustawiony w stan logicznej 1 rjmp ety1 rjmp ety2 *************************************************************************** SBRC Przeskocz jeden rozkaz, jesli wskazany bit w rejestrze roboczym jest

wyzerowany Rozkaz dziala na 32 mlodszych rejestrach roboczych.

Kod rozkazu: SBRC A, b gdzie A – nazwa rejestru, , 0 = b = 7

Cykle zegarowe: 1, gdy warunek nie jest spelniony ( nie przeskakujemy rozkazu) 2, gdy warunek jest spelniony (przeskakujemy rozkaz) Przyklad Sbrc r16, 4 Przeskocz jeden rozkaz, jesli bit 4 w rejestrze 16 jest wyzerowany rjmp ety1 rjmp ety2 *************************************************************************** SBRS Przeskocz jeden rozkaz, jesli wskazany bit w rejestrze roboczym jest

ustawiony w stan logicznej 1 Rozkaz dziala na 32 mlodszych rejestrach roboczych.

Kod rozkazu: SBRS A, b gdzie A – nazwa rejestru, , 0 = b = 7

Cykle zegarowe: 1, gdy warunek nie jest spelniony ( nie przeskakujemy rozkazu) 2, gdy warunek jest spelniony (przeskakujemy rozkaz) Przyklad Sbrs r16, 4 Przeskocz jeden rozkaz, jesli bit 4 w rejestrze 16 jest ustawiony w stan logicznej 1 rjmp ety1 rjmp ety2 *************************************************************************** RCALL Wywolanie podprogramu Wywolanie podprogramu zaczynajacego sie od etykiety k. Rozkaz powoduje sprzetowe odlozenie na stos adresu powrotu. Adres ten jest podejmowany po napotkaniu przez program rozkazu RET.

Kod rozkazu: RCALL k

Przyklad ….. Rcall podprogram Koniec: Rjmp koniec koniec programu glównego, skoki w miejscu

Technika mikroprocesorowa

110

Podprogram: Nop Nop … ret ***************************************************************************

22.3. Rozkazy dzialajace na rejestrach roboczych *************************************************************************** LDI Ladowanie stalej do rejestru Laduje 8-bitowa stala bezposrednio do rejestru o numerze od 16 do 31

Kod rozkazu: LDI Rd, K gdzie 16 = d = 31, 0 = K = 255

Cykle zegarowe: 1 Przyklad Stala zapisana dziesietnie Ldi r16, 20 Ta sama stala zapisana szesnastkowo Ldi r16, 0x14 lub ldi r16, $14 Ta sama stala zapisana binarnie Ldi r16, 0b00010100 *************************************************************************** DEC Dekrementacja zawartosci rejestru Odejmuje 1 od zawartosci rejestru. Operacje sa wykonywane modulo 28 , zatem 0-1=255 ($00-$01=$FF)

Kod rozkazu: DEC Rd gdzie 0 = d = 31

Cykle zegarowe: 1 Przyklad Dec r16 dekrementacja r16 (zmniejszenie zawartosci o 1) *************************************************************************** INC Inkrementacja zawartosci rejestru Dodaje 1 do zawartosci rejestru. Operacje sa wykonywane modulo 28, zatem 255+1=0 ($FF+$01=$00)

Kod rozkazu: INC Rd gdzie 0 = d = 31

Cykle zegarowe: 1 Przyklad Inc r16 inkrementacja rejestru r16 (zwiekszenie zawartosci o 1) *************************************************************************** CPI Porównanie zawartosci rejestru ze stala Porównuje zawartosc rejestru Rd ze stala K. Ustawia flage C, jesli wartosc bezwzgledna stalej K jest wieksza niz wartosc bezwzgledna liczby w rejestrze Rd, zeruje flage C w innych przypadkach. Ustawia flage Z, jesli zawartosc rejestru Rd jest równa stalej K, zeruje flage Z w innych przypadkach.

Technika mikroprocesorowa

111

Kod rozkazu: CPI Rd, K gdzie 16 = d = 31, 0 = K = 255

Cykle zegarowe: 1 Przyklad Cpi r16, 0 porównaj zawartosc r16 z zerem *************************************************************************** CP Porównanie zawartosci dwóch rejestrów Porównuje zawartosc rejestru Rd z zawartoscia rejestru Rr. Ustawia flage C, jesli wartosc bezwzgledna liczby w rejestrze Rr jest wieksza niz wartosc bezwzgledna liczby w rejestrze Rd, zeruje flage C w innych przypadkach. Ustawia flage Z, jesli zawartosc rejestru Rd jest równa zawartosci rejestru Rr, zeruje flage Z w innych przypadkach.

Kod rozkazu: CPI Rd, Rr gdzie 16 = d = 31, 16 = r = 31

Cykle zegarowe: 1 Przyklad Cp r16, r17 porównaj zawartosc r16 z r17 *************************************************************************** ANDI Iloczyn logiczny Wykonuje iloczyn logiczny miedzy zawartoscia rejestru Rd a stala K. Wynik umieszcza w rejestrze Rd.

Kod rozkazu: ANDI Rd, K gdzie 16 = d = 31, 0 = K = 255

Cykle zegarowe: 1 Przyklad andi r17, $0F wyzeruj starszy pólbajt rejestru r17 andi r18, 0x10 wyizoluj 4-ty bit w rejestrze r18 andi r19, $AA wyzeruj nieparzyste bity w rejestrze r19 *************************************************************************** ORI Suma logiczna Wykonuje sume logiczna miedzy zawartoscia rejestru Rd a stala K. Wynik umieszcza w rejestrze Rd.

Kod rozkazu: ORI Rd, K gdzie 16 = d = 31, 0 = K = 255

Cykle zegarowe: 1 Przyklad ori r16,$F0 ustaw w stan logicznej 1 bity górnego pólbajtu rejestru r16 ori r17,1 ustaw w stan logicznej 1 bit 0 w rejestrze r17 *************************************************************************** ROL Rotacja w lewo przez bit przeniesienia C

Przesuwa wszystkie bity w rejestrze Rd o jedna pozycje w lewo. Flaga C jest ladowana do bitu 0. Bit 7 jest ladowany do flagi C.

Kod rozkazu: ROL Rd gdzie 0 = d = 31

Technika mikroprocesorowa

112

Cykle zegarowe: 1 *************************************************************************** ROR Rotacja w prawo przez bit przeniesienia C

Przesuwa wszystkie bity w rejestrze Rd o jedna pozycje w prawo. Flaga C jest ladowana do bitu 7. Bit 0 jest ladowany do flagi C.

Kod rozkazu: ROL Rd gdzie 0 = d = 31

Cykle zegarowe: 1 *************************************************************************** LSL Rotacja w lewo z uzupelnieniem zerami

Przesuwa wszystkie bity w rejestrze Rd o jedna pozycje w lewo. Bit 0 zostaje wyzerowany. Bit 7 jest ladowany do flagi C. W wyniku operacji nastepuje wymnozenie zawartosci rejestru przez 2.

Kod rozkazu: LSL Rd gdzie 0 = d = 31

Cykle zegarowe: 1 *************************************************************************** LSR Rotacja w prawo z uzupelnieniem zerami

Przesuwa wszystkie bity w rejestrze Rd o jedna pozycje w prawo. Bit 7 zostaje wyzerowany. Bit 0 jest ladowany do flagi C. W wyniku operacji nastepuje podzielenie zawartosci rejestru przez 2.

Kod rozkazu: LSR Rd gdzie 0 = d = 31

Cykle zegarowe: 1 *************************************************************************** SWAP Zamiana pólbajtu górnego z dolnym

Kod rozkazu: SWAP Rd gdzie 0 = d = 31

Cykle zegarowe: 1 Przyklad ldi r16, 0xf0 laduje stala do rejestru Swap r16 zamienia pólbajty, po zamianie w rejestrze znajduje sie liczba 0x0f *************************************************************************** COM Negacja binarna

Kod rozkazu: COM Rd gdzie 0 = d = 31

Cykle zegarowe: 1

Technika mikroprocesorowa

113

Przyklad ldi r16, 0b10101010 laduje stala do rejestru com r16 neguje bity, po operacji w rejestrze znajduje sie liczba 0b01010101 *************************************************************************** MOV Kopiowanie rejestru Rr do rejestru Rd Kopiuje rejestr Rr do rejestru Rd. Po operacji rejestr Rr pozostaje nie zmieniony, podczas gdy rejestr Rd jest ladowany kopia rejestru Rr.

Kod rozkazu: MOV Rd, Rr gdzie 0 = d = 31 0 = r = 31

Cykle zegarowe: 1 Przyklad mov r16, r0 kopiuje rejestr r0 do rejestru r16 *************************************************************************** ADD Sumowanie dwóch rejestrów bez bitu przeniesienia C Sumuje zawartosc dwóch rejestrów nie dodajac bitu przeniesienia C. Sume umieszcza w rejestrze Rd.

Kod rozkazu: ADD Rd, Rr gdzie 0 = d = 31 0 = r = 31

Cykle zegarowe: 1 Przyklad add r16, r0 sumuje rejestry r0 i r16, wynik umieszcza w r16 SUB Odejmowanie dwóch rejestrów bez bitu przeniesienia C Odejmuje zawartosc dwóch rejestrów bez bitu przeniesienia C. Róznice umieszcza w rejestrze Rd.

Kod rozkazu: SUB Rd, Rr gdzie 0 = d = 31 0 = r = 31

Cykle zegarowe: 1 Przyklad sub r16, r0 odejmuje rejestry r0 i r16, wynik umieszcza w r16 ***************************************************************************

22.4. Rozkazy dzialajace na rejestrach przestrzeni Input/Output *************************************************************************** IN Wczytanie zawartosc rejestru I/O do rejestru roboczego Laduje dana z przestrzeni I/O do rejestru Rd. Dziala na 64 mlodszych rejestrach obszaru I/O (np. na rejestrach obslugujacych porty)

Kod rozkazu: IN Rd, A gdzie 0 = d = 31, A – nazwa rejestru przestrzeni I/O

Cykle zegarowe: 1 Przyklad in r25, portb stan rejestru portb skopiuj do rejestru r25 cpi r25,4 porównaj odczytana wartosc ze stala breq exit skocz, jesli w rejestrze r25 znajduje sie liczba 4 ….. Exit: etykieta docelowa skoku

Technika mikroprocesorowa

114

nop nic nie rób *************************************************************************** OUT Wczytuje zawartosc rejestru roboczego do rejestru I/O Laduje dana z rejestru Rd do przestrzeni I/O. Dziala na 64 mlodszych rejestrach obszaru I/O (np. na rejestrach obslugujacych porty)

Kod rozkazu: OUT A, Rr gdzie 0 = r = 31, A – nazwa rejestru przestrzeni I/O

Cykle zegarowe: 1 *************************************************************************** CBI Zeruje bit w rejestrze I/O Zeruje wskazany bit w rejestrze I/O. Dziala na 32 mlodszych rejestrach obszaru I/O (np. na rejestrach obslugujacych porty)

Kod rozkazu: CBI A,b gdzie A – nazwa rejestru przestrzeni I/O, 0 = b = 7

Cykle zegarowe: 2 Przyklad Cbi portb, 4 zeruje 4-ta linie wyjsciowa na porcie B *************************************************************************** SBI Ustawia bit w rejestrze I/O Ustawia wskazany bit w rejestrze I/O. Dziala na 32 mlodszych rejestrach obszaru I/O (np. na rejestrach obslugujacych porty)

Kod rozkazu: SBI A,b gdzie A – nazwa rejestru przestrzeni I/O, 0 = b = 7

Cykle zegarowe: 2 Przyklad Sbi portb, 4 ustawia 4-ta linie wyjsciowa na porcie B *************************************************************************** SBIC. SBIS Omówione w dziale „Rozkazy skoków” ***************************************************************************

22.5. Rozkazy dzialajace na bitach *************************************************************************** CLC Zerowanie bitu przeniesienia C Zerowanie bitu przeniesienia w rejestrze statusowym SREG.

Kod rozkazu: CLC

Cykle zegarowe: 1 *************************************************************************** SEC Ustawienie bitu przeniesienia C Ustawienie bitu przeniesienia w rejestrze statusowym SREG.

Kod rozkazu: SEC

Cykle zegarowe: 1 *************************************************************************** CLI Zerowanie bitu zezwolenia na przerwania I Zerowanie bitu I w rejestrze statusowym SREG.

Kod rozkazu: CLI

Technika mikroprocesorowa

115

Cykle zegarowe: 1 *************************************************************************** SEI Ustawienie bitu zezwolenia na przerwania I Ustawienie bitu I w rejestrze statusowym SREG.

Kod rozkazu: SEI

Cykle zegarowe: 1 *************************************************************************** 22.6. Bezposrednie adresowanie pamieci RAM *************************************************************************** STS Zapis wartosc pod adres podany bezposrednio

Kod rozkazu: STS k, Rr 0 ≤ r ≤ 31, 0 ≤ k ≤ 65535 Cykle zegarowe: 2

Przyklad ldi r2, 0xAA zapisz liczbe 0xaa do rejestru 2 sts $0060, r2 przepisz zawartosc rejestru 2 do RAM-u pod adres $0060 *************************************************************************** LDS Odczyt wartosci spod adresu podanego bezposrednio

Kod rozkazu: LDS Rr, k 0 ≤ r ≤ 31, 0 ≤ k ≤ 65535 Cykle zegarowe: 2

Przyklad lds r3, $0600 przepisz zawartosc komórki RAM-u o adresie $0600 do rejestru 3.

***************************************************************************

22.7. Posrednie adresowanie pamieci RAM

*************************************************************************** Adresowanie posrednie odbywa sie z udzialem rejestrów X, Y, Z. Rejestr X sklada sie z rejestrów r27 (starszy bajt rejestru X) i r26 (mlodszy bajt rejestru X). Rejestr Y sklada sie z rejestrów r29 (starszy bajt rejestru Y) i r28 (mlodszy bajt rejestru Y). Rejestr Z sklada sie z rejestrów r31 (starszy bajt rejestru Z) i r30 (mlodszy bajt rejestru Z). ST Adresowanie posrednie z wykorzystaniem rejestru X – zapis do pamieci Przed wykonaniem operacji liczba przeznaczona do zapisu powinna znajdowac sie w rejestrze roboczym (kazdy oprócz r26, r27), a adres wpisu w rejestrze X.

ST X, Rr przepisuje rejestr Rr pod adres znajdujacy sie w rejestrze X. ST X+, Rr przepisuje rejestr Rr pod adres znajdujacy sie w rejestrze X, po

operacji zawartosc rejestru X jest zwiekszana o 1 (post- inkrementacja) ST –X, Rr przed operacja zawartosc rejestru X jest zmniejszana o 1 (pre-dekrementacja),

po czym rejestr Rr jest przepisywany pod adres znajdujacy sie w rejestrze X. Cykle zegarowe: 2 Przyklad

Technika mikroprocesorowa

116

clr r27 przygotowanie adresu wpisu w rejestrach r27 ($00) i r26 ($60) ldi r26, $60 lacznie nazywanych rejestrem X ldi r16, 0x01 przygotowanie liczby do wpisania w rejestrze r16 ($01) st X+, r16 zapisanie liczby pod adresem $0060 *************************************************************************** LD Adresowanie posrednie z wykorzystaniem rejestru X – odczyt z pamieci Przed wykonaniem operacji adres odczytu powinien znajdowac sie w rejestrze X.

LD Rr, X przepisuje zawartosc komórki pamieci, której adres znajduje sie w rejestrze X

do rejestru Rr LD Rr, X+ przepisuje zawartosc komórki pamieci, której adres znajduje sie w rejestrze X

do rejestru Rr, po operacji zawartosc rejestru X jest zwiekszana o 1 (post-inkrementacja)

LD Rr, – X przed operacja zawartosc rejestru X jest zmniejszana o 1 (pre-dekrementacja), po czym zawartosc komórki pamieci, której adres znajduje sie w rejestrze X jest przepisywana do rejestru Rr

Cykle zegarowe: 2 Przyklad ldi r27, 0x01 przygotowanie adresu odczytu w rejestrach r27 ($00) i r26 ($60) ldi r26, 0x60 lacznie nazywanych rejestrem X ld r16, X+ odczyt spod adresu $0160 i wpis odczytanej liczby do rejestru r16 *************************************************************************** ST (STD) Adresowanie posrednie z wykorzystaniem rejestru Y – wpis do

pamieci Przed wykonaniem operacji liczba przeznaczona do zapisu powinna znajdowac sie w rejestrze roboczym (kazdy oprócz r28, r29), a adres wpisu w rejestrze Y. ST Y, Rr przepisuje rejestr Rr pod adres znajdujacy sie w rejestrze Y. ST Y+, Rr przepisuje rejestr Rr pod adres znajdujacy sie w rejestrze Y, po

operacji rejestr Y jest zwiekszana o 1 (post- inkrementacja) ST –Y, Rr przed operacja zawartosc rejestru Y jest zmniejszana o 1 (pre-dekrementacja),

po czym rejestr Rr jest przepisywany pod adres znajdujacy sie w rejestrze Y. STD Y+q, Rr przepisuje rejestr Rr pod adres znajdujacy sie w rejestrze Y, z offsetem q, w

wyniku operacji zawartosc Y nie ulega zmianie. Cykle zegarowe: 2 Przyklad clr r29 przygotowanie adresu wpisu w rejestrach r29 ($00) i r28 ($60) ldi r28, $60 lacznie nazywanych rejestrem Y ldi r16, 0x01 przygotowanie liczby do wpisu w rejestrze r16 ($001) std Y+2, r16 wpisanie liczby pod adres $0062, przy czym po operacji Y nadal

wskazuje na adres $0060 *************************************************************************** LD (LDD) Adresowanie posrednie z wykorzystaniem rejestru Y – odczyt z pamieci Przed wykonaniem operacji adres odczytu powinien znajdowac sie w rejestrze Y.

Technika mikroprocesorowa

117

LD Rr, Y przepisuje zawartosc komórki pamieci, której adres znajduje sie w rejestrze Y

do rejestru Rr LD Rr, Y+ przepisuje zawartosc komórki pamieci, której adres znajduje sie w rejestrze Y

do rejestru Rr, po operacji zawartosc rejestru Y jest zwiekszana o 1 (post-inkrementacja)

LD Rr, – Y przed operacja zawartosc rejestru Y jest zmniejszana o 1 (pre-dekrementacja), po czym zawartosc komórki pamieci, której adres znajduje sie w rejestrze Y jest przepisywana do rejestru Rr

LDD Rr, Y+q przepisuje zawartosc komórki o adresie znajdujacym sie w rejestrze Y, z offsetem q, do rejestru Rr, w wyniku operacji zawartosc Y nie ulega zmianie

Cykle zegarowe: 2 Przyklad ldi r29, 0x01 przygotowanie adresu odczytu w rejestrach r29 ($00) i r28 ($60) ldi r28, 0x60 lacznie nazywanych rejestrem X ld r16, Y+3 odczyt spod adresu $0163 i wpis odczytanej liczby do rejestru r16, przy czym po operacji Y nadal wskazuje na adres $0060 *************************************************************************** ST (STD) Adresowanie posrednie z wykorzystaniem rejestru Z – wpis do

pamieci Przed wykonaniem operacji liczba przeznaczona do zapisu powinna znajdowac sie w rejestrze roboczym (kazdy oprócz r30, r31), a adres wpisu w rejestrze Z. ST Z, Rr przepisuje rejestr Rr pod adres znajdujacy sie w rejestrze Z. ST Z+, Rr przepisuje rejestr Rr pod adres znajdujacy sie w rejestrze Z, po

operacji rejestr Z jest zwiekszana o 1 (post- inkrementacja) ST –Z, Rr przed operacja zawartosc rejestru Z jest zmniejszana o 1 (pre-dekrementacja),

po czym rejestr Rr jest przepisywany pod adres znajdujacy sie w rejestrze Z. STD Z+q, Rr przepisuje rejestr Rr pod adres znajdujacy sie w rejestrze Z, z offsetem q, w

wyniku operacji zawartosc Z nie ulega zmianie. Cykle zegarowe: 2 Przyklad clr r31 przygotowanie adresu wpisu w rejestrach r31 ($00) i r30 ($60) ldi r30, $60 lacznie nazywanych rejestrem Z ldi r16, 0x01 przygotowanie liczby do wpisu w rejestrze r16 ($001) std Z+2, r16 wpisanie liczby pod adres $0062, przy czym po operacji wskaznik Z

nadal wskazuje na adres $0060 *************************************************************************** LD (LDD) Adresowanie posrednie z wykorzystaniem rejestru Z – odczyt z pamieci Przed wykonaniem operacji adres odczytu powinien znajdowac sie w rejestrze Z.

LD Rr, Z przepisuje zawartosc komórki pamieci, której adres znajduje sie w rejestrze Z

do rejestru Rr LD Rr, Z+ przepisuje zawartosc komórki pamieci, której adres znajduje sie w rejestrze Z

Technika mikroprocesorowa

118

do rejestru Rr, po operacji zawartosc rejestru Z jest zwiekszana o 1 (post-inkrementacja)

LD Rr, – Z przed operacja zawartosc rejestru Z jest zmniejszana o 1 (pre-dekrementacja), po czym zawartosc komórki pamieci, której adres znajduje sie w rejestrze Z jest przepisywana do rejestru Rr

LDD Rr, Z+q przepisuje zawartosc komórki o adresie znajdujacym sie w rejestrze Z, z offsetem q, do rejestru Rr, w wyniku operacji zawartosc Z nie ulega zmianie

Cykle zegarowe: 2 Przyklad ldi r31, 0x01 przygotowanie adresu odczytu w rejestrach r31 ($00) i r30 ($60) ldi r30, 0x60 lacznie nazywanych rejestrem Z ld r16, Z+3 odczyt spod adresu $0163 i wpis odczytanej liczby do rejestru r16, przy czym po operacji Z nadal wskazuje na adres $0060 ***************************************************************************