rodzina avr wykład 2
DESCRIPTION
Rodzina AVR wykład 2. AVR 2 /27. Lista rozkazów AVR Przykłady programowania. Lista rozkazów ATtiny2313 /mega8515 3 /27. 1. Rozkazy arytmetyczne - PowerPoint PPT PresentationTRANSCRIPT
Rodzina AVRwykład 2
AVR 2/27
Lista rozkazów AVR
Przykłady programowania
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
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
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
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
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
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)
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
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
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
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
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
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
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
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
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
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
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
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
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 ? ? ? ? ? ? ?
;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
; 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
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
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
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
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 ...