270 likes | 390 Vues
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
E N D
AVR 2/27 Lista rozkazów AVRPrzykłady programowania
Lista rozkazów ATtiny2313/mega85153/27 1. Rozkazy arytmetyczne ADD rd,rs ; rd:=rd+rsrd=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-rsrd=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/mega85154/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/mega85155/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/mega85156/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/mega85157/27 2. Rozkazy logiczne AND rd,rs ; rd:=rd and rsrd=R0..R31 ZNV ANDI rd’,n ; rd’:=rd’ and nrd’=R16..R31, ZNV n=0..255 | -128..127 OR rd,rs ; rd:=rd or rsrd=R0..R31 ZNV ORI rd’,n ; rd’:=rd’ or nrd’=R16..R31 ZNV n=0..255 | -128..127 EOR rd,rs ; rd:=rd xor rsrd=R0..R31 ZNV
Lista rozkazów ATtiny2313/mega85158/27 CBR rd’,n ; rd’:=rd’ and (not n) ZNV SBR rd’,n ; rd’:=rd’ or 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 ; rd:=not rd rd=R0..R31 ZNCV TST rd ; rd and rd V:=0; ZNS ; ( AND rd, rd)
C 7 rd 0 7 rd 0 7 rd 0 7 rd 0 7 rd 0 C C C C 7 6 5 4 3 2 1 0 0 0 Lista rozkazów ATtiny2313/mega85159/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
Lista rozkazów ATtiny2313/mega851510/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:= rdbrd=R0..R31, b=0..7 BLD rd,b ; rdb:=T
Lista rozkazów ATtiny2313/mega851511/27 5. Rozkazy przesłań (nie zmieniają flag) MOV rd,rs ; rd:=rsrd,rs=R0..R31 MOVW rd,rs ; rd+1:rd:=rs+1:rsrd,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/mega851512/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’:=nrd’=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/mega851513/27 ST X,rd ; RAM[X]:=rdrd=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]:=rdd=0..63
Lista rozkazów ATtiny2313/mega851514/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/mega851515/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+adreladrel=-64..63 BRBS b,adrel ;jeżeli SREGb=1 to PC:=PC+1+adrelb=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/mega851516/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
Lista rozkazów ATtiny2313/mega851517/27 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/mega851518/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
Lista rozkazów ATtiny2313/mega851519/27 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/mega851520/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
Lista rozkazów ATtiny2313/mega851521/27 10. Wpływ rozkazów na SREG
,r0,r1 ldi r16,100 ;r1r0:=st.bajt*100 mul r16,r14 add r17,r0 ;dosumowanie do r18r17 adc r18,r1 ret AVR - przykłady programowania 22/27 ;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,sreg bcdtonb2B: mov r16,r13 rcall bcdtonb1B ;zamiana ml. bajtu na NB (LSB) mov r13,r16 mov r16,r14 rcall bcdtonb1B ;zamiana st. bajtu na NB (MSB) mov r14,r16 mov r17,r13 ;r18r17:=wartosc ml.bajtu w NB clr r18 dod100: tst r14 ;wynik:=LSB+MSB*100 breq koniec subi r17,-100 ;dodawanie ‘+100’ przez sbci r18,-1 ;odejmowanie ‘-100’ r14 razy dec r14 rjmp dod100 koniec: ret
,r0,r1 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 AVR - przykłady programowania 23/27 ; 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 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,r0 • ldi r31,low(2*kody) • add r30,r31 • ldi r31,high(2*kody) • clr r0 • adc r31,r0 ;uwzglednienie ewent. nadmiaru • lpm ;pobranie kodu wyswietlacza • ret • 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,r0 • ldi r31,low(2*kody) • add r30,r31 • ldi r31,high(2*kody) • lpm ;pobranie kodu wyswietlacza • ret • 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 ...