Imię i nazwisko .......................................................... nr indeksu .............................................
Strona 1 z 3
1. (2pkt) Omów adresowanie bezpośrednie i pośrednie. Podaj przykłady rozkazów
zapisujących do pamięci SRAM bezpośrednio: ....... LDS ......... i pośrednio: ....... LD ..........
Adresowanie bezpośrednie – adres komórki pamięci, z której będzie odczyt lub do której
będzie zapis, jest zapisany bezpośrednio w rozkazie jako stała liczba. Adres jest więc znany
już na etapie tworzenia kodu.
Adresowanie pośrednie – adres jest odczytywany z zadanej komórki pamięci lub z
określonego rejestru. Faktyczny adres jest więc znany dopiero na etapie wykonywania kodu.
2. (2pkt) Stos w mikrokontrolerze AVR. Organizacja i zastosowanie. Rozkazy, których
efektem jest zapis lub odczyt stosu. Inicjalizacja stosu.
Organizacja:
w pamięci SRAM
adres wskaźnika można ustawić dowolnie programowo – przeważnie inicjalizuje się
go na koniec pamięci SRAM
wskaźnik jest postdekrementowany przy odkładaniu wartości na stos i
preinkrementowany przy jej pobieraniu
rejestr wskaźnika stosu: SPL
Zastosowanie:
przechowywanie adresów powrotu z podprogramu (asembler) lub z funkcji (języki
wyższego poziomu – np. język C)
przechowywanie wartości zmiennych lokalnych (język C)
Rozkazy:
CALL – wywołanie podprogramu – adres powrotu odłożony na stos; wskaźnik stosu -1
RET – powrót z podprogramu – wskaźnik stosu +1; adres powrotu brany se stosu;
POP – wskaźnik stosu +1; pobranie wartości ze stosu do rejestru
PUSH – odłożenie wartości z rejestru na stos; wskaźnik stosu -1
Inicjalizacja stosu:
LDI r16, high(RAMEND) ; RAMEND – ostatni adres SRAM
OUT SPH, r16
LDI r16, low(RAMEND)
OUT SPL, r16
Imię i nazwisko .......................................................... nr indeksu .............................................
Strona 2 z 3
3. (2pkt) Omów system przerwań mikrokontrolera AVR. Wymień rejestry, flagic i rozkazy
związane z przerwaniami.
Przerwanie jest generowanym sprzętowo sygnałem dla procesora, powodującym (o ile
przerwanie jest aktywne) zawieszenie wykonywania głównego programu, skok do
procedury obsługującej przerwanie i po jej zakończeniu powrót do głównego
programu.
Peryferia generujące przerwania mają w AVR-ach przydzielone stałe wektory
przerwań, tj. adresy pamięci kodu pod które następuje skok po wygenerowaniu
przerwania.
Przerwania w AVR nie są domyślnie zagnieżdżane – wywołanie przerwania powoduje
automatyczne wyzerowanie globalnej flagi przerwań – inne przerwania są
zablokowane na czas obsługi przerwania aktywnego (jednak programowo można tę
flagę odblokować w trakcie obsługi przerwania).
W rejestrze SREG znajduje się bit I – globalna flaga odblokowania przerwań
GIMSK – rejestr ogólnego maskowania przerwań
Każdy z peryferiów generujących przerwanie ma swoją własną flagę (lub ich zestaw
jeśli generuje kilka różnych przerwań – np. timery) odblokowującą dane przerwanie
(w rejestrach maskujących – Mask Register) oraz flagi informujące o wystąpieniu
przerwania, które można sprawdzać programowo (w rejestrach z flagami przerwań –
Interrupt Flag Register).
RETI – rozkaz powrotu z procedury obsługi przerwania – zdjęcie ze stosu adres
powrotu i załadowanie go do licznika programu PC; odblokowanie globalnej flagi
przerwań
4. (2pkt). Zapisz numer indeksu (młodsze 4 cyfry np. 168341) w kodzie
binarnym
heksadecymalnym
BCD
liczbę ujemną w
kodzie U2
Sposób przeliczania jest opisany np. tutaj:
http://blue_rider_hp.republika.pl/articles/tekst/liczby.html
Imię i nazwisko .......................................................... nr indeksu .............................................
Strona 3 z 3
5. (1pkt) Sposób (algorytm) zamiany liczby w kodzie szesnastkowym na kod ASCII
N – liczba wejściowa, X – pierwsza cyfra w ASCII, Y – druga cyfra w ASCII
1. A = N / 16
2. Jeśli A > 10, to X = A – 10 + 'a', w przeciwnym wypadku X = A + '0'
3. A = N & 0x0F
4. Jeśli A > 10, to Y = A – 10 + 'a', w przeciwnym wypadku Y = A + '0'
6. (3pkt) Ustaw rejestry TCCR0 i OCR0 licznika T0 tak aby na wyjściu OC0 generowany był
sygnał o wypełnieniu 1/8 - numery indeksu parzyste , 7/8 - numery indeksu nieparzyste.
FOC0
WGM00
COM01
COM00
WGM01
CS02
CS01
CS00
0
1
1
0 / 1 *
1
0
0
1
OCR0=............ 32 ...................
* COM00 = 0 dla wypełnienia 1/8, = 1 dla wypełnienia 7/8
Jaka jest częstotliwość tego sygnału w przypadku taktowania mikroprocesora rezonatorem
kwarcowym f
clk
=1,024MHz
f
OC0
= ...... f
clk
/ 256 = 4kHz
(Nie jestem pewien tych wartości. Robienie tego na kartce bez możliwości odpalenia,
sprawdzenia i poprawki jest niestety zwyczajnym idiotyzmem.)
7. (2pkt). Multipleksowany wyświetlacz 7 – segmentowy. Schemat, sposób sterowania
Nie umiem tego zrobić, ale tutaj dość dobrze to jest chyba opisane:
http://www.easy-soft.net.pl/artykuly/jezyk-c/jezyk-c-dla-
mikrokontrolerow-8051-multipleksowanie-wyswietlaczy-led