Download ppt - Rodzina AVR wykład 2

Transcript
Page 1: Rodzina AVR wykład 2

Rodzina AVRwykład 2

Page 2: Rodzina AVR wykład 2

AVR 2/27

Lista rozkazów AVR

Przykłady programowania

Page 3: Rodzina AVR wykład 2

Lista rozkazów ATtiny2313/mega8515 3/27

1. Rozkazy arytmetyczne

ADD rd,rs ; rd:=rd+rs rd=R0..R31 ZCNVH

ADC rd,rs ; rd:=rd+rs+C rs=R0..R31 ZCNVH

ADIW rdd,k ; (rdd+1,rdd):= (rdd+1,rdd)+k ZCNVS; rdd=R24,R26,R28,R30 k=0..63

SUB rd,rs ; rd:=rd-rs rd=R0..R31 ZCNVH

SBC rd,rs ; rd:=rd-rs-C rs=R0..R31 ZCNVH

SUBI rd’,n ; rd’:=rd’-n rd’=R16..R31 ZCNVH

SBCI rd’,n ; rd’:=rd’-n-C n=0..255 | -128..127 ZCNVH

SBIW rdd,k ; (rdd+1,rdd):= (rdd+1,rdd)-k ZCNVS; rdd=R24,R26,R28,R30 k=0..63

Page 4: Rodzina AVR wykład 2

Lista rozkazów ATtiny2313/mega8515 4/27

CP rd,rs ; ustawienie flag Z,N,V,C,H,S jak przy rd-rs

CPC rd,rs ; ustawienie flag N,V,C,H,S jak przy rd-rs-C

; gdy rd-rs-C0 flaga Z pozostaje bez zmian

CPI rd’,n ; ustawienie flag Z,N,V,C,H,S jak przy rd'-n

;rd’=R16..R31 n=0..255 | -128..127

CPSE rd,rs ; jeżeli rd=rs to pomiń następny rozkaz

INC rd ; rd:=rd+1 ZNV

DEC rd ; rd:=rd-1 ZNV

NEG rd ; rd:=-rd ZCNVH

Page 5: Rodzina AVR wykład 2

Lista rozkazów ATtiny2313/mega8515 5/27

MUL rd,rs ; R1R0:= rd · rs mnożenie liczb bez znaku ZC

MULS rd’,rs’ ; R1R0:= rd’ · rs’ mnożenie liczb ze znakiem ZC

; rd’ , rs’ = R16..R31

MULSU rd”,rs” ; R1R0:= rd” · rs” mnożenie liczby ze znakiem

; przez liczbę bez znaku, rd”, rs” = R16..R23 ZC

; Z=1 sygnalizuje R1R0=0

; C=R1R015=R17

Page 6: Rodzina AVR wykład 2

Lista rozkazów ATtiny2313/mega8515 6/27

FMUL rd”,rs” ; CYR1R0:= SHL(rd” · rs”) mnożenie liczb bez znaku

; rd”, rs” = R16..R23 ZC

; rd” , rs” – liczby stałopozycyjne w formacie 1C.7U

; po mnożeniu 16b iloczyn jest przesuwany o bit w lewo

; Z=1 sygnalizuje iloczyn=0

FMULS rd”,rs” ; CYR1R0:= SHL(rd” · rs”) mnożenie liczb ze znakiem

; UWAGA: (-1) ·(-1) daje (-1) ZC

FMULSU rd”,rs” ; CYR1R0:= SHL(rd” · rs”) mnożenie liczby ze znakiem

; przez liczbę bez znaku ZC

Page 7: Rodzina AVR wykład 2

Lista rozkazów ATtiny2313/mega8515 7/27

2. Rozkazy logiczne

AND rd,rs ; rd:=rd rs rd=R0..R31 ZNV

ANDI rd’,n ; rd’:=rd’ n rd’=R16..R31, ZNV

n=0..255 | -128..127

OR rd,rs ; rd:=rd rs rd=R0..R31 ZNV

ORI rd’,n ; rd’:=rd’ n rd’=R16..R31 ZNV

n=0..255 | -128..127

EOR rd,rs ; rd:=rd rs rd=R0..R31 ZNV

Page 8: Rodzina AVR wykład 2

Lista rozkazów ATtiny2313/mega8515 8/27

CBR rd’,n ; rd’:=rd’ (~n) ZNV

SBR rd’,n ; rd’:=rd’ n n=0..255 | -128..127 ZNV

; ( ORI rd’,n)

CLR rd ; rd:=0 rd=R0..R31 Z,N,V,S:=0

SER rd’ ; rd’:=255 rd’=R16..R31

; ( LDI rd’,255)

COM rd ; rd7..0:= ~rd7..0 rd=R0..R31 ZNCV

TST rd ; rd rd V:=0; ZNS

; ( AND rd, rd)

Page 9: Rodzina AVR wykład 2

Lista rozkazów ATtiny2313/mega8515 9/27

3. Rozkazy obrotów i przesunięć

SWAP rd ;rd: rd=R0..R31

ASR rd ; ZNCV

LSL rd ; ZNCV

LSR rd ; ZNCV

ROL rd ; ZNCV

ROR rd ; ZNCV

C 7 rd 0

C 7 rd 0 0

C 7 rd 0

C 7 rd 00

C 7 rd 0

7 6 5 4 3 2 1 0

Page 10: Rodzina AVR wykład 2

Lista rozkazów ATtiny2313/mega8515 10/27

4. Rozkazy operacji bitowych

CLC ; C:=0 SEC ; C:=1

CLH ; H:=0 SEH ; H:=1

CLN ; N:=0 SEN ; N:=1

CLS ; S:=0 SES ; S:=1

CLT ; T:=0 SET ; T:=1

CLV ; V:=0 SEV ; V:=1

CLZ ; Z:=0 SEZ ; Z:=1

BCLR b ; SREGb:=0 b=0..7 ( CLC,CLH ... CLZ,CLI)

BSET b ; SREGb:=1 b=0..7 ( SEC,SEH ... SEZ,SEI)

BST rd,b ; T:= rdb rd=R0..R31, b=0..7

BLD rd,b ; rdb:=T

Page 11: Rodzina AVR wykład 2

Lista rozkazów ATtiny2313/mega8515 11/27

5. Rozkazy przesłań (nie zmieniają flag)

MOV rd,rs ; rd:=rs rd,rs=R0..R31

MOVW rd,rs ; rd+1:rd:=rs+1:rs rd,rs=R0..R30

LD rd,X ; rd:=RAM[X] rd=R0..R31

LD rd,X+ ; rd:=RAM[X]

; X:=X+1

LD rd,-X ; X:=X-1

; rd:=RAM[X]

LD rd,Y ; rd:=RAM[Y]

LD rd,Y+ ; rd:=RAM[Y]

; Y:=Y+1

LD rd,-Y ; Y:=Y-1

; rd:=RAM[Y]

LDD rd,Y+d ; rd:=RAM[Y+d] d=0..63

Page 12: Rodzina AVR wykład 2

Lista rozkazów ATtiny2313/mega8515 12/27

LD rd,Z ; rd:=RAM[Z]

LD rd,Z+ ; rd:=RAM[Z]

; Z:=Z+1

LD rd,-Z ; Z:=Z-1

; rd:=RAM[Z]

LDD rd,Z+d ; rd:=RAM[Z+d] d=0..63

LDI rd’,n ; rd’:=n rd’=R16..R31 n=0..255

LDS rd’,adr ; rd’:=RAM[adr]

LPM ; R0:=ROM[Z]

LPM rd,Z ; rd :=ROM[Z]

LPM rd,Z+ ; rd :=ROM[Z] , Z:=Z+1

Page 13: Rodzina AVR wykład 2

Lista rozkazów ATtiny2313/mega8515 13/27

ST X,rd ; RAM[X]:=rd rd=R0..R31

ST X+,rd ; RAM[X]:=rd

; X:=X+1

ST -X, rd ; X:=X-1

; RAM[X]:=rd

ST Y,rd ; RAM[Y]:=rd

ST Y+,rd ; RAM[Y]:=rd

; Y:=Y+1

ST -Y,rd ; Y:=Y-1

; RAM[Y]:=rd

STD Y+d,rd ; RAM[Y+d]:=rd d=0..63

Page 14: Rodzina AVR wykład 2

Lista rozkazów ATtiny2313/mega8515 14/27

ST Z,rd ; RAM[Z]:=rd

ST Z+,rd ; RAM[Z]:=rd

; Z:=Z+1

ST -Z,rd ; Z:=Z-1

; RAM[Z]:=rd

STD Z+d,rd ; RAM[Z+d]:=rd d=0..63

STS adr,rd ; RAM[adr]:=rd

SPM ; ROM[Z]:=R1:R0

POP rd ; SP:=SP+1

; rd:=RAM[SP]

PUSH rd ; RAM[SP]:=rd

; SP:=SP-1

Page 15: Rodzina AVR wykład 2

Lista rozkazów ATtiny2313/mega8515 15/27

6. Rozkazy skoków (nie zmieniają flag)

RJMP adr’ ; PC:=PC+1+adr’ adr’=-2048..2047

IJMP ; PC:=Z

BRBC b,adrel ; jeżeli SREGb=0 to PC:=PC+1+adrel adrel=-64..63

BRBS b,adrel ; jeżeli SREGb=1 to PC:=PC+1+adrel b=0..7

BRCC adrel ; jeżeli C=0 to PC:=PC+1+adrel ( BRBC 0, adrel)

BRCS adrel ; jeżeli C=1 to PC:=PC+1+adrel ( BRBS 0, adrel)

BRHC adrel ; jeżeli H=0 to PC:=PC+1+adrel (itp....)

BRHS adrel ; jeżeli H=1 to PC:=PC+1+adrel

BRNE adrel ; jeżeli Z=0 to PC:=PC+1+adrel

BREQ adrel ; jeżeli Z=1 to PC:=PC+1+adrel

BRGE adrel ; jeżeli S=0 to PC:=PC+1+adrel

BRLT adrel ; jeżeli S=1 to PC:=PC+1+adrel

Page 16: Rodzina AVR wykład 2

Lista rozkazów ATtiny2313/mega8515 16/27

BRMI adrel ; jeżeli N=1 to PC:=PC+1+adrel

BRPL adrel ; jeżeli N=0 to PC:=PC+1+adrel

BRTC adrel ; jeżeli T=0 to PC:=PC+1+adrel

BRTS adrel ; jeżeli T=1 to PC:=PC+1+adrel

BRVC adrel ; jeżeli V=0 to PC:=PC+1+adrel

BRVS adrel ; jeżeli V=1 to PC:=PC+1+adrel

BRID adrel ; jeżeli I=0 to PC:=PC+1+adrel

BRIE adrel ; jeżeli I=1 to PC:=PC+1+adrel

SBRC rd,b ; jeżeli rdb=0 to pomiń następny rozkaz rd=R0..R31 b=0..7

SBRS rd,b ; jeżeli rdb=1 to pomiń następny rozkaz rd=R0..R31 b=0..7

SBIC px’,b ; jeżeli px’b =0 to pomiń następny rozkaz px’=0..31* b=0..7

SBIS px’,b ; jeżeli px’b =1 to pomiń następny rozkaz px’=0..31* b=0..7

* tylko bity portów o adresach 0..31 są dostępne dla tych rozkazów

Page 17: Rodzina AVR wykład 2

7. Rozkazy wywołań procedur i powrotów

RCALL adr’ ; RAM(SP):=(PC+1)L adr’=-2048..2047; SP:=SP-1; RAM(SP):=(PC+1)H

; SP:=SP-1; PC:=PC+1+adr’

ICALL ; RAM(SP):=(PC+1)L

; SP:=SP-1; RAM(SP):=(PC+1)H

; SP:=SP-1; PC:=Z (Z=R31,R30)

Lista rozkazów ATtiny2313/mega8515 17/27

Page 18: Rodzina AVR wykład 2

Lista rozkazów ATtiny2313/mega8515 18/27

RET ; SP:=SP+1; PCH:=RAM(SP); SP:=SP+1; PCL:=RAM(SP)

RETI ; SP:=SP+1; PCH:=RAM(SP); SP:=SP+1; PCL:=RAM(SP); I:=1

Page 19: Rodzina AVR wykład 2

8. Rozkazy wejścia/wyjścia

IN rd,px ; rd:=px rd=R0..R31, px=0..63

OUT px,rd ; px:=rd

CBI px’,b ; px’b:=0 px’=0..31* b=0..7

SBI px’,b ; px’b:=1 px’=0..31* b=0..7* tylko bity portów o adresach 0..31 są dostępne dla tych rozkazów

Lista rozkazów ATtiny2313/mega8515 19/27

Page 20: Rodzina AVR wykład 2

Lista rozkazów ATtiny2313/mega8515 20/27

9. Rozkazy sterujące

NOP ; “nic nie rób”

CLI ; I:=0 tzn. zablokuj przerwania

SEI ; I:=1 tzn. odblokuj przerwania

SLEEP ; przejdź do trybu pracy z obniżonym poborem mocy

WDR ; zerowanie rejestru zegara watchdoga

BREAK ; rozkaz do debugingu sprzętowego:

; zatrzymuje CPU pod warunkiem zaprogramowania

; bitów konfiguracyjnych JTAGEN lub OCDEN

; w przeciwnym razie jest równoważny NOP

Page 21: Rodzina AVR wykład 2

10. Wpływ rozkazów na SREG

Lista rozkazów ATtiny2313/mega8515 21/27

rozkaz flaga komentarz

T H S V N Z C

ADD,ADC,SUB,SBC,SUBI,SBCI,NEG ? ? ? ? ?

ADIW,SBIW ? ? ? ? ?

CP,CPI ? ? ? ? ? ?

CPC ? ? ? ? ? ? gdy rd-rs-C Z bez zmian

INC,DEC ? ? ?

AND,ANDI,OR,ORI,EOR,TST,CBR,SBR,CLR

? ? ? ?

COM ? ? ? ?

ASR,LSR,LSL,ROL,ROR ? ? ? ?

CLT,CLH,CLS,CLV,CLN,CLZ,CLC,BCLR zerowanie wskazanej flagi

SET,SEH,SES,SEV,SEN,SEZ,SEC,BSET ustawianie wskazanej flagi

BST ?

OUT SREG,rd ? ? ? ? ? ? ?

Page 22: Rodzina AVR wykład 2

;Procedura konwersji 4-cyfrowej liczby w spakowanym BCD;na 2-bajtowa liczbę w NB;wykorzystuje procedure zamiany 1B w BCD na 1B w NB;parametry: r13,r14 liczba w BCD LSB first;wyniki: r17,r18 liczba w NB LSB first;zmiany: r13,r14,r16,sregbcdtonb2B:

mov r16,r13rcall bcdtonb1B ;zamiana ml. bajtu na NB (LSB)mov r13,r16mov r16,r14rcall bcdtonb1B ;zamiana st. bajtu na NB (MSB)mov r14,r16mov r17,r13 ;r18r17:=wartosc ml.bajtu w NBclr r18

dod100: tst r14 ;wynik:=LSB+MSB*100breq koniecsubi r17,-100 ;dodawanie ‘+100’ przezsbci r18,-1 ;odejmowanie ‘-100’ r14 razydec r14rjmp dod100

koniec:ret

AVR - przykłady programowania 22/27

ldi r16,100 ;r1r0:=st.bajt*100mul r16,r14add r17,r0 ;dosumowanie do r18r17adc r18,r1ret

,r0,r1

Page 23: Rodzina AVR wykład 2

; Procedura zamiany 2 cyfr BCD na 1B NB

; parametry: r16 - para cyfr w BCD

; wyniki r16 - wartosc w NB

; zmiany: sreg,r10,r11

bcdtonb1B:

mov r10,r16 ;kopia do r10

andi r16,$0F ;wydzielenie ml.cyfry

mov r11,r16 ;zapamietanie jej w r11

mov r16,r10 ;odtworzenie r16

swap r16

andi r16,$0F ;wydzielenie st.cyfry

add r16,r16

mov r10,r16 ;r10=st.cyfra*2

add r16,r16

add r16,r16 ;r16=st.cyfra*8

add r16,r10 ;r16=st.cyfra*10

add r16,r11 ;r16=NB(r16)

ret

AVR - przykłady programowania 23/27

mov r10,r16

ldi r16,10 ;r1r0:=st.cyfra*10

mul r16,r10

mov r16,r0 ;iloczyn do r16

add r16,r11 ;dosumowanie ml.cyfry

ret

,r0,r1

Page 24: Rodzina AVR wykład 2

AVR - przykłady programowania 24/27

; Procedura konwersji cyfry szesn. na kod wyswietlacza; 7-segmentowego. ; Poszczególne segmenty są przyporządkowane bitom od ; najstarszego następująco: hgfedcba. ; parametry: R0 = cyfra hex.;; wyniki: R0 = kod segmentowy;; zmiany: Z;; długość: 22B/11W (łącznie z tablicą kodów);HEXDISP:

mov r30,r0ldi r31,low(2*kody) add r30,r31ldi r31,high(2*kody)lpm ;pobranie kodu wyswietlaczaret

kody: .DB 0b00111111,0b00000110,0b01011011,0b01001111.DB 0b01100110,0b01101101,0b01111101,0b00000111.DB 0b01111111,0b01101111,0b00000001,0b01000000.DB 0b00001000,0b01010000,0b01111001,0b01110001

; Procedura konwersji cyfry szesn. na kod wyswietlacza; 7-segmentowego. ; Poszczególne segmenty są przyporządkowane bitom od ; najstarszego następująco: hgfedcba. ; parametry: R0 = cyfra hex.;; wyniki: R0 = kod segmentowy;; zmiany: Z;; długość: 22B/11W (łącznie z tablicą kodów);HEXDISP:

mov r30,r0ldi r31,low(2*kody) add r30,r31ldi r31,high(2*kody)clr r0adc r31,r0 ;uwzglednienie ewent. nadmiarulpm ;pobranie kodu wyswietlaczaret

kody: .DB 0b00111111,0b00000110,0b01011011,0b01001111.DB 0b01100110,0b01101101,0b01111101,0b00000111.DB 0b01111111,0b01101111,0b00000001,0b01000000.DB 0b00001000,0b01010000,0b01111001,0b01110001

Page 25: Rodzina AVR wykład 2

AVR - przykłady programowania 25/27

; Fragment programu realizujący skok z przełącznikiem.

; Numer skoku do wykonania znajduje się w rejestrze R10. .....

; jezeli w tablicy skokow JMPTAB uzyje sie rozkazow jmp

; to potrzebny jest na wstepie rozkaz

; 'lsl r10’ lub ‘add r10,r10’ (rozkaz jmp ma dlg. 2W=4B)

ldi r30,low(JMPTAB)

add r30,r10

ldi r31,high(JMPTAB)

clr r10

adc r31,r10

ijmp

.....

JMPTAB: rjmp PROG1

rjmp PROG2

....

rjmp PROGN

Page 26: Rodzina AVR wykład 2

AVR - przykłady programowania 26/27

; Fragment programu mnożący 16-bitowe liczby w U2 (ze znakiem)

; R19..R16:=R23R22 * R21R20

clr r2

muls r23,r21 ;iloczyn starszych bajtow

movw r18,r0

mul r22,r20 ;iloczyn mlodszych bajtow

movw r16,r0

mulsu r23,r20 ;iloczyn starszego bajtu przez mlodszy

sbc r19,r2

add r17,r0

adc r18,r1

adc r19,r2

mulsu r21,r22 ;iloczyn mlodszego bajtu przez starszy

sbc r19,r2

add r17,r0

adc r18,r1

adc r19,r2

Page 27: Rodzina AVR wykład 2

AVR - przykłady programowania 27/27

; Fragment programu realizujący porównanie liczb w U2.

; .....

; Zal: L1=R7R6R5 , L2=R12R11R10

cp r5,r10 ;porownanie najmlodszych bajtow

cpc r6,r11

cpc r7,r12 ;porownanie najstarszych bajtow

brgt L1wieksza

breq rowne

L1mniejsza:

rjmp ...

rowne:

rjmp ...

L1wieksza:

rjmp ...


Recommended