Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

Autor artykułu: mgr Jerzy Wałaszek
Konsultacje: Wojciech Grodowski, mgr inż. Janusz Wałaszek

©2024 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Instrukcje AVR

L

obrazek

Educational and Non-Profit Use of Copyrighted Material:

If you use Microchip copyrighted material solely for educational (non-profit) purposes falling under the “fair use” exception of the U.S. Copyright Act of 1976 then you do not need Microchip’s written permission. For example, Microchip’s permission is not required when using copyrighted material in: (1) an academic report, thesis, or dissertation; (2) classroom handouts or textbook; or (3) a presentation or article that is solely educational in nature (e.g., technical article published in a magazine).

https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines

SPIS TREŚCI
Podrozdziały

obrazek

LDLoad Indirect from Data Space to Register using Index X – Ładowanie pośrednie danych z użyciem indeksu X

Opis

Instrukcja ładuje pośrednio bajt z przestrzeni danych do rejestru. Dla mikrokontrolerów z pamięcią SRAM (ang. Static Random Access Memory – statyczna pamięć RAM) przestrzeń danych składa się z zestawu rejestrów, pamięci we/wy i wewnętrznej pamięci SRAM (oraz zewnętrznej pamięci SRAM, jeśli da się ją podłączyć do mikrokontrolera). Dla mikrokontrolerów bez pamięci SRAM przestrzeń danych składa się tylko z zestawu rejestrów. Pamięć EEPROM (ang. electrically erasable programmable read-only memory – elektrycznie kasowalna pamięć PROM) posiada osobną przestrzeń adresową.

Komórka z danymi jest wskazywana przez rejestr wskaźnikowy X (16 bitów) w zestawie rejestrów. Dostęp do pamięci ograniczony jest do bieżącego segmentu danych o rozmiarze 64 KB. Aby uzyskać dostęp do innego segmentu danych w mikrokontrolerach posiadających przestrzeń danych o rozmiarze większym od 64 KB, należy zmienić zawartość rejestru RAMPX w obszarze we/wy.

Rejestr wskaźnikowy X może albo pozostać niezmieniony przez operację, albo może poddany postinkrementacji (zwiększeniu o 1 po operacji) lub predekrementacji (zmniejszeniu o 1 przed operacją). Te cechy nadają się szczególnie do dostępu do ciągów, tablic i używania rejestru X w charakterze wskaźnika stosu.. Zwróć uwagę, że w mikrokontrolerach posiadających nie więcej niż 256 bajtów przestrzeni danych modyfikacji ulega tylko młodszy bajt wskaźnika X. W takich urządzeniach starszy bajt wskaźnika nie jest używany przez tę instrukcję i może zostać wykorzystany do innych celów. Rejestr RAMPX w obszarze we/wy jest modyfikowany w mikrokontrolerach z przestrzenią danych większą niż 64KB lub pamięcią programu większą niż 64KB, a zwiększenie/zmniejszenie o 1 odnosi się do całego 24-bitowego adresu na takich urządzeniach.

Nie wszystkie warianty tej instrukcji dostępne są we wszystkich mikrokontrolerach. Sprawdź listę instrukcji konkretnego modelu.

Wynik tych kombinacji argumentów jest niezdefiniowany:

LD r26, X+
LD r27, X+
LD r26, -X
LD r27, -X
 

Działanie

               

Komentarz

(i)
(ii)
(iii)
Rd ← (X)
Rd ← (X)      X ← X + 1
X ← X - 1     Rd ← (X)
X: niezmieniany
X: postinkrementacja
X: predekrementacja
 

Składnia

 

Argumenty

 

Licznik rozkazów

(i)
(ii)
(iii)
LD Rd, X
LD Rd, X+
LD Rd, -X
  0 ≤ d ≤ 31
0 ≤ d ≤ 31
0 ≤ d ≤ 31
  PC ← PC + 1
PC ← PC + 1
PC ← PC + 1

16-bitowy kod instrukcji

(i)
1001
000d
dddd
1100
(ii)
1001
000d
dddd
1101
(iii)
1001
000d
dddd
1110

Zmiany znaczników w rejestrze stanu (SREG)

   I     T     H     S     V     N     Z     C  

Przykładowy kod:

clr r27     ; Zeruj starszy bajt rejestru X
ldi r26,0x60 ; Ustaw młodszy bajt X na 0x60
ld r0,X+    ; Załaduj do r0 dane spod adresu 0x60(X postinkrementowany) 
ld r1,X     ; Załaduj do r1 dane spod adresu 0x61
ldi r26,0x63 ; Ustaw młodszy bajt X na 0x63
ld r2,X     ; Załaduj do r2 dane spod adresu 0x63
ld r3,–X    ; Załaduj do r3 dane spod adresu 0x62(X predekrementowany) 

Liczba słów: 1 (2 bajty)

Cykle: 2


Na początek:  podrozdziału   strony 

LD(LDD) – Load Indirect from Data Space to Register using Index Y – Ładowanie pośrednie danych z użyciem indeksu Y

Opis

Instrukcja ładuje pośrednio bajt z przestrzeni danych do rejestru. Dla mikrokontrolerów z pamięcią SRAM (ang. Static Random Access Memory – statyczna pamięć RAM) przestrzeń danych składa się z zestawu rejestrów, pamięci we/wy i wewnętrznej pamięci SRAM (oraz zewnętrznej pamięci SRAM, jeśli da się ją podłączyć do mikrokontrolera). Dla mikrokontrolerów bez pamięci SRAM przestrzeń danych składa się tylko z zestawu rejestrów. Pamięć EEPROM (ang. electrically erasable programmable read-only memory – elektrycznie kasowalna pamięć PROM) posiada osobną przestrzeń adresową.

Komórka z danymi jest wskazywana przez rejestr wskaźnikowy Y (16 bitów) w zestawie rejestrów. Dostęp do pamięci ograniczony jest do bieżącego segmentu danych o rozmiarze 64 KB. Aby uzyskać dostęp do innego segmentu danych w mikrokontrolerach posiadających przestrzeń danych o rozmiarze większym od 64 KB, należy zmienić zawartość rejestru RAMPY w obszarze we/wy.

Rejestr wskaźnikowy Y może albo pozostać niezmieniony przez operację, albo może poddany postinkrementacji (zwiększeniu o 1 po operacji) lub predekrementacji (zmniejszeniu o 1 przed operacją). Te cechy nadają się szczególnie do dostępu do ciągów, tablic i używania rejestru Y w charakterze wskaźnika stosu.. Zwróć uwagę, że w mikrokontrolerach posiadających nie więcej niż 256 bajtów przestrzeni danych modyfikacji ulega tylko młodszy bajt wskaźnika Y. W takich urządzeniach starszy bajt wskaźnika nie jest używany przez tę instrukcję i może zostać wykorzystany do innych celów. Rejestr RAMPY w obszarze we/wy jest modyfikowany w mikrokontrolerach z przestrzenią danych większą niż 64KB lub pamięcią programu większą niż 64KB, a zwiększenie/zmniejszenie o 1 odnosi się do całego 24-bitowego adresu na takich urządzeniach.

Nie wszystkie warianty tej instrukcji dostępne są we wszystkich mikrokontrolerach. Sprawdź listę instrukcji konkretnego modelu.

Wynik tych kombinacji argumentów jest niezdefiniowany:

LD r28, Y+
LD r29, Y+
LD r28, -Y
LD r29, -Y
 

Działanie

               

Komentarz

(i)
(ii)
(iii)
(iiii)
Rd ← (Y)
Rd ← (Y)      Y ← Y + 1
Y ← Y - 1     Rd ← (Y)
Rd ← (Y+q)
Y: niezmieniany
Y: postinkrementacja
Y: predekrementacja
Y: niezmieniany, q: przesunięcie
 

Składnia

 

Argumenty

 

Licznik rozkazów

(i)
(ii)
(iii)
(iiii)
LD Rd, Y
LD Rd, Y+
LD Rd, -Y
LDD Rd, Y+q
  0 ≤ d ≤ 31
0 ≤ d ≤ 31
0 ≤ d ≤ 31
0 ≤ d ≤ 31, 0 ≤ q ≤ 63
  PC ← PC + 1
PC ← PC + 1
PC ← PC + 1
PC ← PC + 1

16-bitowy kod instrukcji

(i)
1000
000d
dddd
1000
(ii)
1001
000d
dddd
1001
(iii)
1001
000d
dddd
1010
(iiii)
10q0
qq0d
dddd
1qqq

Zmiany znaczników w rejestrze stanu (SREG)

   I     T     H     S     V     N     Z     C  

Przykładowy kod:

clr r29     ; Zeruj starszy bajt Y
ldi r28,0x60 ; Ustaw młodszy bajt Y na 0x60
ld r0,Y+    ; Załaduj do r0 dane spod adresu 0x60 (Y postinkrementowany) 
ld r1,Y     ; Załaduj do r1 dane spod adresu 0x61
ldi r28,0x63 ; Ustaw młodszy bajt Y na 0x63
ld r2,Y     ; Załaduj do r2 dane spod adresu 0x63
ld r3,-Y    ; Załaduj do r3 dane spod adresu 0x62 (Y predekrementowany) 
ldd r4,Y+2  ; Załaduj do r4 dane spod adresu 0x64

Liczba słów: 1 (2 bajty)

Cykle: 2


Na początek:  podrozdziału   strony 

LD(LDD) – Load Indirect from Data Space to Register using Index Z – Ładowanie pośrednie danych z użyciem indeksu Z

Opis

Instrukcja ładuje pośrednio bajt z przestrzeni danych z przesunięciem lub bez przesunięcia do rejestru. Dla mikrokontrolerów z pamięcią SRAM (ang. Static Random Access Memory – statyczna pamięć RAM) przestrzeń danych składa się z zestawu rejestrów, pamięci we/wy i wewnętrznej pamięci SRAM (oraz zewnętrznej pamięci SRAM, jeśli da się ją podłączyć do mikrokontrolera). Dla mikrokontrolerów bez pamięci SRAM przestrzeń danych składa się tylko z zestawu rejestrów. Pamięć EEPROM (ang. electrically erasable programmable read-only memory – elektrycznie kasowalna pamięć PROM) posiada osobną przestrzeń adresową.

Komórka z danymi jest wskazywana przez rejestr wskaźnikowy Z (16 bitów) w zestawie rejestrów. Dostęp do pamięci ograniczony jest do bieżącego segmentu danych o rozmiarze 64 KB. Aby uzyskać dostęp do innego segmentu danych w mikrokontrolerach posiadających przestrzeń danych o rozmiarze większym od 64 KB, należy zmienić zawartość rejestru RAMPZ w obszarze we/wy.

Rejestr wskaźnikowy Z może albo pozostać niezmieniony przez operację, albo może poddany postinkrementacji (zwiększeniu o 1 po operacji) lub predekrementacji (zmniejszeniu o 1 przed operacją). Te cechy nadają się szczególnie do dostępu do ciągów, tablic i używania rejestru Z w charakterze wskaźnika stosu.. Zwróć uwagę, że w mikrokontrolerach posiadających nie więcej niż 256 bajtów przestrzeni danych modyfikacji ulega tylko młodszy bajt wskaźnika Z. W takich urządzeniach starszy bajt wskaźnika nie jest używany przez tę instrukcję i może zostać wykorzystany do innych celów. Rejestr RAMPZ w obszarze we/wy jest modyfikowany w mikrokontrolerach z przestrzenią danych większą niż 64KB lub pamięcią programu większą niż 64KB, a zwiększenie/zmniejszenie o 1 odnosi się do całego 24-bitowego adresu na takich urządzeniach.

Nie wszystkie warianty tej instrukcji dostępne są we wszystkich mikrokontrolerach. Sprawdź listę instrukcji konkretnego modelu.

Informację o użyciu rejestru Z do adresowania tablic ze stałymi w pamięci programu znajdziesz w opisie instrukcji LPM i ELPM.

Wynik tych kombinacji argumentów jest niezdefiniowany:

LD r30, Z+
LD r31, Z+
LD r30, -Z
LD r31, -Z
 

Działanie

               

Komentarz

(i)
(ii)
(iii)
(iiii)
Rd ← (Z)
Rd ← (Z)      Z ← Z + 1
Z ← Z - 1     Rd ← (Z)
Rd ← (Z+q)
Z: niezmieniany
Z: postinkrementacja
Z: predekrementacja
Z: niezmieniany, q: przesunięcie
 

Składnia

 

Argumenty

 

Licznik rozkazów

(i)
(ii)
(iii)
(iiii)
LD Rd, Z
LD Rd, Z+
LD Rd, -Z
LDD Rd, Z+q
  0 ≤ d ≤ 31
0 ≤ d ≤ 31
0 ≤ d ≤ 31
0 ≤ d ≤ 31, 0 ≤ q ≤ 63
  PC ← PC + 1
PC ← PC + 1
PC ← PC + 1
PC ← PC + 1

16-bitowy kod instrukcji

(i)
1000
000d
dddd
0000
(ii)
1001
000d
dddd
0001
(iii)
1001
000d
dddd
0010
(iiii)
10q0
qq0d
dddd
0qqq

Zmiany znaczników w rejestrze stanu (SREG)

   I     T     H     S     V     N     Z     C  

Przykładowy kod:

clr r31     ; Zeruj starszy bajt Z
ldi r30,0x60 ; Ustaw młodszy bajt Z na 0x60
ld r0,Z+    ; Załaduj do r0 dane spod adresu 0x60 (z postinkrementowany) 
ld r1,Z     ; Załaduj do r1 dane spod adresu 0x61
ldi r30,0x63 ; Ustaw młodszy bajt Z na 0x63
ld r2,Z     ; Załaduj do r2 dane spod adresu 0x63
ld r3,-Z    ; Załaduj do r3 dane spod adresu 0x62 (Z predekrementowany) 
ldd r4,Z+2  ; Załaduj do r4 dane spod adresu 0x64

Liczba słów: 1 (2 bajty)

Cykle: 2


Na początek:  podrozdziału   strony 

LDILoad Immediate – Ładowanie stałej

Opis

Ładuje 8-bitową stałą bezpośrednio do rejestru od r16 do r31.

Działanie

                 
Rd ← K  

Składnia

 

Argumenty

 

Licznik rozkazów

LDI Rd,K   16 ≤ d ≤ 31, 0 ≤ K ≤ 255   PC ← PC + 1

16-bitowy kod instrukcji

1110
KKKK
dddd
KKKK

Zmiany znaczników w rejestrze stanu (SREG)

   I     T     H     S     V     N     Z     C  

Przykładowy kod:

clr r31     ; Zeruj starszy bajt Z
ldi r30,0xF0 ; Ustaw młodszy bajt na 0xF0
lpm         ; Załaduj stałą z pamięci programu
            ; wskazaną przez Z

Liczba słów: 1 (2 bajty)

Cykle: 1


Na początek:  podrozdziału   strony 

LDSLoad Direct from Data Space – Ładowanie bezpośrednie z przestrzeni danych

Opis

Instrukcja ładuje jeden bajt z przestrzeni danych do rejestru. Dla mikrokontrolerów z pamięcią SRAM (ang. Static Random Access Memory – statyczna pamięć RAM) przestrzeń danych składa się z zestawu rejestrów, pamięci we/wy i wewnętrznej pamięci SRAM (oraz zewnętrznej pamięci SRAM, jeśli da się ją podłączyć do mikrokontrolera). Dla mikrokontrolerów bez pamięci SRAM przestrzeń danych składa się tylko z zestawu rejestrów. Pamięć EEPROM (ang. electrically erasable programmable read-only memory – elektrycznie kasowalna pamięć PROM) posiada osobną przestrzeń adresową.

Musi być dostarczony 16-bitowy adres. Dostęp do pamięci jest ograniczony do bieżącego segmentu danych o rozmiarze 64KB. Instrukcja LDS wykorzystuje rejestr RAMPD w obszarze we/wy, zatem dostęp do innych partii pamięci wymaga zmiany zawartości tego rejestru.

Ta instrukcja nie jest dostępna dla wszystkich mikrokontrolerów. Sprawdź listę instrukcji konkretnego modelu.

Działanie

                 
Rd ← (k)  

Składnia

 

Argumenty

 

Licznik rozkazów

LDS Rd,k   0 ≤ d ≤ 31, 0 ≤ k ≤ 65535   PC ← PC + 2

32-bitowy kod instrukcji

1001
000d
dddd
0000
kkkk
kkkk
kkkk
kkkk

Zmiany znaczników w rejestrze stanu (SREG)

   I     T     H     S     V     N     Z     C  

Przykładowy kod:

lds r2,0xFF00 ; Ładuj r2 zawartością dane spod adresu 0xFF00
add r2,r1    ; dodaj r1 do r2
sts 0xFF00,r2 ; Zapisz z powrotem wynik

Liczba słów: 2 (4 bajty)

Cykle: 2


Na początek:  podrozdziału   strony 

LPMLoad Program Memory – Ładowanie z pamięci programu

Opis

Ładuje jeden bajt wskazywany przez rejestr Z do rejestru docelowego Rd. Instrukcja ta daje możliwość w 100% efektywnej inicjalizacji stałych lub pobierania stałych danych. Pamięć programu zorganizowana jest w 16-bitowe słowa, natomiast wskaźnik Z zawiera adres bajtów. Stąd najmniej znaczący bit wskaźnika Z wybiera albo młodszy bajt (ZLSB = 0), albo starszy bajt (ZLSB = 1) adresowanej danej. Instrukcja ta może zaadresować pierwsze 64KB (32K słów) pamięci programu. Wskaźnik Z może albo pozostać niezmieniony przez operację, albo może zostać zwiększony. Zwiększenie nie dotyczy rejestru RAMPZ.

Mikrokontrolery z możliwością samoprogramowania mogą wykorzystywać instrukcję LPM do odczytu wartości bitów bezpiecznikowych (ang. fuse bits) oraz bitów blokujących (ang. lock bits). Dokładny opis znajdziesz w instrukcji dla twojego mikrokontrolera.

Nie wszystkie warianty instrukcji LPM są dostępne dla wszystkich mikrokontrolerów. Sprawdź listę instrukcji swojego egzemplarza. Instrukcja LPM nie jest w ogóle zaimplementowana w mikrokontrolerze AT90S1200.
Wynik poniższych kombinacji jest niezdefiniowany:

LPM r30, Z+
LPM r31, Z+
 

Działanie

               

Komentarz

(i)
(ii)
(iii)
R0 ← (Z)
R0 ← (Z)
R0 ← (Z)      Z ← Z + 1
  Z: niezmieniany, R0 jest domyślnym rejestrem docelowym
Z:  niezmieniany
Z: zwiększany o 1 po pobraniu danej
 

Składnia

 

Argumenty

 

Licznik rozkazów

(i)
(ii)
(iii)
LPM
LPM Rd, Z
LPM Rd, Z+
  żaden, domyślnie R0
0 ≤ d ≤ 31
0 ≤ d ≤ 31
  PC ← PC + 1
PC ← PC + 1
PC ← PC + 1

16-bitowy kod instrukcji

(i)
1001
0101
1100
1000
(ii)
1001
000d
dddd
0100
(iii)
1001
000d
dddd
0101

Zmiany znaczników w rejestrze stanu (SREG)

   I     T     H     S     V     N     Z     C  

Przykładowy kod:

         ldi ZH, high(Table_1<<1) ; Inicjuj wskaźnik Z
         ldi ZL, low(Table_1<<1)
         lpm r16, Z               ; Załaduj stałą z pamięci programu
                                  ; wskazywaną przez rejestr Z (r31:r30) 
         ...
Table_1:
         .dw 0x5876               ; 0x76 jest adresowane, gdy ZLSB = 0
                                  ; 0x58 jest adresowane, gdy ZLSB = 1
         ...

Liczba słów: 1 (2 bajty)

Cykle: 3


Na początek:  podrozdziału   strony 

LSLLogical Shift Left – Logiczne przesunięcie w lewo

Opis

Przesuwa bity w Rd o jedną pozycję w lewo. Bit 0 jest zerowany. Bit 7 jest ładowany do znacznika C w SREG. Operacja ta może być potraktowana jako pomnożenie przez 2 liczb bez znaku i ze znakiem.

Działanie

                 
obrazek

Składnia

 

Argumenty

 

Licznik rozkazów

LSL Rd   0 ≤ d ≤ 31   PC ← PC + 1

16-bitowy kod instrukcji

0000
11dd
dddd
dddd

Zobacz na instrukcję ADD Rd,Rd.

Zmiany znaczników w rejestrze stanu (SREG)

   I     T     H     S     V     N     Z     C  
X X X X X X
H: Rd3
S: N obrazek V
Dla testów liczb ze znakiem w kodzie U2
V: N obrazek C
Dla N i C po wykonaniu przesunięcia
N: R7
Ustawiany, jeśli najstarszy bit wyniku jest ustawiony; w przeciwnym razie zerowany
Z: R7R6R5R4R3R2R1R0
Ustawiany, jeśli wynik wynosi 0x00; w przeciwnym razie zerowany
C: Rd7
Ustawiany, jeśli przed przesunięciem najstarszy bit Rd był ustawiony; w przeciwnym razie zerowany

Wynik R (ang. Result) po operacji jest równy Rd.

Przykładowy kod:

add r0,r4 ; Dodaj r4 do r0
lsl r0    ; Pomnóż r0 przez 2

Liczba słów: 1 (2 bajty)

Cykle: 1


Na początek:  podrozdziału   strony 

LSRLogical Shift Right – Logiczne przesunięcie w prawo

Opis

Przesuwa bity w Rd o jedną pozycję w prawo. Bit 7 jest zerowany. Bit 0 jest ładowany do znacznika C w SREG. Operacja ta może być potraktowana jako podzielenie przez 2 liczby bez znaku. Znacznik C może być użyty do zaokrąglenia wyniku.

Działanie

                 
obrazek

Składnia

 

Argumenty

 

Licznik rozkazów

LSR Rd   0 ≤ d ≤ 31   PC ← PC + 1

16-bitowy kod instrukcji

1001
010d
dddd
0110

Zmiany znaczników w rejestrze stanu (SREG)

   I     T     H     S     V     N     Z     C  
X X 0 X X
S: N obrazek V
Dla testów liczb ze znakiem w kodzie U2
V: N obrazek C
Dla N i C po wykonaniu przesunięcia
N: 0
Zerowany
Z: R7R6R5R4R3R2R1R0
Ustawiany, jeśli wynik wynosi 0x00; w przeciwnym razie zerowany
C: Rd0
Ustawiany, jeśli przed przesunięciem najmłodszy bit Rd był ustawiony; w przeciwnym razie zerowany

Wynik R (ang. Result) po operacji jest równy Rd.

Przykładowy kod:

add r0,r4 ; Dodaj r4 do r0
lsr r0    ; Podziel r0 przez 2

Liczba słów: 1 (2 bajty)

Cykle: 1


Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2024 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.