8 bitowy rdzeń AVR Dariusz Chaberski
Rodzina AVR (Atmel) 2
podział tinyavr megaavr XMEGA (DMA, wsparcie dla kryptografii) USB AVR CAN AVR AVR Z-Link (IEEE 82.15.4, ZigBee) LCD AVR Lighting AVR (PWM, sterowanie elementami mocy) Smart Battery AVR (wsparcie dla pracy z baterią akumulatorów) Automotive AVR (większa odpornośc na zakłócenia, większy zakres temperatur) FPGA AVR 3
Rdzeń AVR 8 bitowa magistrala danych pamięć programu FLASH rejestr instrukcji licznik programu słowa kontrolno statusowe 32 8 rejestrów ogólnego przeznaczenia kontroler przerwań jednostka SPI dekoder instrukcji linie sterujące adresowanie bezpośrednie adresowanie pośrednie ALU pamięć danych SRAM Watchdog licznik czasomierz komparator analogowy Moduł 1 we/wy Moduł 2 we/wy EEPROM Moduł n we/wy porty wejścia wyjścia 4
Rejestr statusowy - SREG numer bitu 7 nazwa dostęp wartość początkowa I T H S V N Z C R/W R/W R/W R/W R/W R/W R/W R/W I - globalne zezwolenie na przerwania T - znacznik kopii H - znacznik przeniesienia połówkowego S - bit znaku S=V N V - znacznik przepełnienia N - znacznik wartości ujemnej Z - znacznik wartości zerowej C - znacznik przeniesienia lub pożyczki 5
Rejestry ogólnego przeznaczenia 7 R R1 R2 adres x x1 x2... R13 R14 R15 R16 R17 xd xe xf x1 x11... R26 R27 R28 R29 R3 R31 x1a x1b x1c x1d x1e x1f młodszy bajt rejestru X starszy bajt rejestru X młodszy bajt rejestru Y starszy bajt rejestru Y młodszy bajt rejestru Z starszy bajt rejestru Z X, Y, Z - rejestry indeksowe/wskaźnikowe 6
Rejestry indeksowe 15 XH XL rejestr X 7 7 R27(x1B) R26(x1A) 15 YH YL rejestr Y 7 7 R29(x1D) R28(x1C) 15 ZH ZL rejestr Z 7 7 R31(x1F) R3(x1E) 7
Wskaźnik stosu - SP numer bitu nazwa bitu numer bitu dostęp wartość początkowa 15 SP15 SP7 7 R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W 8 SP8 SPH SP SPL R/W 8
Zrównoleglenie cykli pobierania kodu i wykonywania instrukcji T1 T2 T3 T4 zegar F1 E1 F2 E2 F3 E3 F4 F - pobieranie kodu instrukcji E - wykonywanie instrukcji 9
Pojedynczy cykl wykonywania instrukcji T1 T2 zegar A F E W A - całkowity cykl wykonywania instrukcji F - pobieranie operandów do rejestrów tymczasowych układu wykonawczego E - właściwe wykonywanie instrukcji (układ wykonawczy) W - zapis wyniku z rejestru tymczasowego układu wykonawczego w miejsce przeznaczenia 1
Mapa pamięci programu 15 wektory przerwań iresetu x FLASH obszar aplikacji obszar programu modyfikującego pamięć programu x1fff 11
Mapa pamięci danych numer portu nazwa rejestru rejestry ogólnego przeznaczenia R R1 R2... R29 R3 R31 porty wejścia wyjścia x x1 x2... x3d x3e x3f x x1 x2... x1d x1e x1f x2 x21 x22... x5d x5e x5f adres wewnętrzna pamięć SRAM x6 x61... x45e x45f 12
Diagram wykonywania instrukcji dostępu do pamięci SRAM T1 T2 T3 zegar A obliczanie adresu obliczony adres D WR D RD odczyt zapis instrukcja dostępu do pamięci następna instrukcja 13
Budowa cyfrowego portu wejścia wyjścia PUD DDxn Q D Q CLR RESET WDx RDx Pxn SLEEP PORTxn Q D Q CLR RESET WPx RRx synchronizator SYNC PINxn D Q D Q L Q Q RPx clk I/O magistrala danych 14
Synchronizacja odczytu portu wejścia wyjścia clk I/O instrukcje XXX XXX r17=pxn SYNC PINxn r17 x xff t pd,max t pd,min 15
Synchronizacja odczytu portu wejścia wyjścia po programowym ustawieniu stanu portu clk I/O r16 xff instrukcje PORTx=r16 brak operacji r17=pinx SYNC PINxn r17 x xff t pd 16
Tryby adresowania pamięci bezpośrednie jedno rejestrowe - Rd 15 4 rejestry ogólnego przeznaczenia OP Rd d 31 17
bezpośrednie dwu rejestrowe - Rd, Rr 15 9 4 rejestry ogólnego przeznaczenia OP Rr Rd d r 31 18
bezpośrednie - porty wejścia wyjścia 15 1 5 porty wejścia wyjścia OP Rd/Rr A A 63 19
bezpośrednie - pamięć danych 31 2 16 OP Rd/Rr adres danych 15 pamięć danych x RAMEND 2
pośrednie z przesunięciem - pamięć danych 15 rejestrylubz pamięć danych x 15 OP 1 5 Rd/Rr q RAMEND 21
pośrednie - pamięć danych 15 rejestrx,ylubz pamięć danych x RAMEND 22
pośrednie z wcześniejszą dekrementacją - pamięć danych 15 rejestrx,ylubz pamięć danych x -1 RAMEND 23
pośrednie z późniejszą inkrementacją - pamięć danych 15 rejestrx,ylubz pamięć danych x 1 RAMEND 24
adresowanie stałej w pamięci programu pamięć programu x 15 1 rejestr Z LSB FLASHEND 25
z późniejszą inkrementacją - pamięć programu pamięć programu x 15 1 rejestr Z LSB 1 FLASHEND 26
bezpośrednie - pamięć programu pamięć programu x 31 21 16 OP 6MSB 16LSB 15 21 PC FLASHEND 27
pośrednie - pamięć programu pamięć programu x 15 Rejestr Z 15 PC FLASHEND 28
względne - pamięć programu pamięć programu x 15 PC 1 15 12 OP k FLASHEND 29
Instrukcje arytmetyczna i logiczne (1/2) mnemonik operandy opis znaczniki # uwagi ADD Rd, Rr Rd=Rd+Rr ZCNVSH 1 d,r=[,31] ADC Rd, Rr Rd=Rd+Rr+C ZCNVSH 1 d,r=[,31] ADIW Rd, K Rd+1:Rd=Rd+1:Rd+K ZCNVS 2 K=[,63], d=24,26,28,3 SUB Rd, Rr Rd=Rd-Rr ZCNVSH 1 d,r=[,31] SUBI Rd, K Rd=Rd-K ZCNVSH 1 K=[,255], d=[16,31] SBC Rd, Rr Rd=Rd-Rr-C ZCNVSH 1 d,r=[,31] SBCI Rd, K Rd=Rd-K-C ZCNVSH 1 K=[,255], d=[16,31] SBIW Rd, K Rd+1:Rd=Rd+1:Rd-K ZCNVS 2 K=[,63], d=24,26,28,3 AND Rd, Rr Rd=Rd&Rr ZNVS 1 d,r=[,31] ANDI Rd, K Rd=Rd&K ZNVS 1 K=[,255], d=[16,31] OR Rd, Rr Rd=Rd Rr ZNVS 1 d,r=[,31] ORI Rd, K Rd=Rd K ZNVS 1 K=[,255], d=[16,31] EOR Rd, Rr Rd=RdˆRr ZNVS 1 d,r=[,31] COM Rd Rd=xFF-Rd ZCNVS 1 d=[,31] # - liczba cykli zegarowych potrzebnych do wykonania instrukcji 3
arytmetyczna i logiczne (2/2) mnemonik operandy opis znaczniki # uwagi NEG Rd x-rd ZCNVSH 1 d=[,31] SBR Rd, K Rd=Rd K ZNVS 1 K=[,255], d=[16,31] CBR Rd, K Rd=Rd&(xFF-K) ZNVS 1 K=[,255], d=[16,31] INC Rd Rd=Rd+1 ZNVS 1 d=[,31] DEC Rd Rd=Rd-1 ZNVS 1 d=[,31] TST Rd Rd=Rd&Rd ZNVS 1 d=[,31] (AND Rd, Rd) CLR Rd Rd=RdˆRd ZNVS 1 d=[,31] (EOR Rd, Rd) SER Rd Rd=xFF - 1 d=[16,31] MUL Rd, Rr R1:R=Rd*Rr (UU) ZC(R15) 2 d,r=[,31] MULS Rd, Rr R1:R=Rd*Rr (SS) ZC(R15) 2 d,r=[16,31] MULSU Rd, Rr R1:R=Rd*Rr (SU) ZC(R15) 2 d,r=[16,23] FMUL Rd, Rr R1:R=(Rd*Rr)<<1 (UU) ZC(R15) 2 d,r=[16,23] (1.7, 1.15) FMULS Rd, Rr R1:R=(Rd*Rr)<<1 (SS) ZC(R15) 2 d,r=[16,23] (1.7, 1.15) FMULSU Rd, Rr R1:R=(Rd*Rr)<<1 (SU) ZC(R15) 2 d,r=[16,23] (1.7, 1.15) 31
rozgałęziające (1/3) mnemonik operandy opis znaczniki # uwagi RJMP k PC=PC+k+1-2 k=[-248,247] IJMP - PC(15:)=Z, PC(21:16)= - 2 - EIJMP - PC(15:)=Z, PC(21:16)=EIND - 2 - JMP k PC=k - 3 k=[, 4M-1] RCALL k [SP]=PC+1, PC=PC+k+1-3/4 k=[-248,247] ICALL - [SP]=PC+1, PC(15:)=Z, PC(21:16)= - 3/4 - EICALL - [SP]=PC+1 PC(15:)=Z, PC(21:16)=EIND - 4 - CALL k [SP]=PC+2, PC=k - 4/5 k=[,4m-1] RET - PC=[SP] - 4/5 - RETI - I=1, PC=[SP] I 4/5 - CPSE Rd, Rr if(rd==rr) PC=PC+2/3-1/2/3 d,r=[,31] CP Rd, Rr Rd-Rr ZCNVSH 1 d,r=[,31] CPC Rd, Rr Rd-Rr-C ZCNVSH 1 d,r=[,31] CPI Rd, K Rd-K ZCNVSH 1 K=[,255], d=[16,31] 32
rozgałęziające (2/3) mnemonik operandy opis znaczniki # uwagi SBRC Rr, b if(rr(b)==) PC=PC+2/3-1/2/3 r=[,31], b=[,7] SBRS Rr, b if(rr(b)==1) PC=PC+2/3-1/2/3 r=[,31], b=[,7] SBIC A, b if(i/o(a(b))==) PC=PC+2/3-1/2/3 A=[,31], b=[,7] SBIS A, b if(i/o(a(b))==1) PC=PC+2/3-1/2/3 A=[,31], b=[,7] BRBS s, k if(sreg(s)==1) PC=PC+1+k - 1/2 k=[-64,63], s=[,7] BRBC s, k if(sreg(s)==) PC=PC+1+k - 1/2 k=[-64,63], s=[,7] BREQ k if(z==1) PC=PC+1+k - 1/2 k=[-64,63] BRNE k if(z==) PC=PC+1+k - 1/2 k=[-64,63] BRCS k if(c==1) PC=PC+1+k - 1/2 k=[-64,63] BRCC k if(c==) PC=PC+1+k - 1/2 k=[-64,63] BRSH k if(c==) PC=PC+1+k - 1/2 k=[-64,63] BRLO k if(c==1) PC=PC+1+k - 1/2 k=[-64,63] BRMI k if(n==1) PC=PC+1+k - 1/2 k=[-64,63] BRPL k if(n==) PC=PC+1+k - 1/2 k=[-64,63] 33
rozgałęziające (3/3) mnemonik operandy opis znaczniki # uwagi BRGE k if(n V==) PC=PC+1+k - 1/2 k=[-64,63] BRLT k if(n V==1) PC=PC+1+k - 1/2 k=[-64,63] BRHS k if(h==1) PC=PC+1+k - 1/2 k=[-64,63] BRHC k if(h==) PC=PC+1+k - 1/2 k=[-64,63] BRTS k if(t==1) PC=PC+1+k - 1/2 k=[-64,63] BRTC k if(t==) PC=PC+1+k - 1/2 k=[-64,63] BRVS k if(v==1) PC=PC+1+k - 1/2 k=[-64,63] BRVC k if(v==) PC=PC+1+k - 1/2 k=[-64,63] BRIE k if(i==1) PC=PC+1+k - 1/2 k=[-64,63] BRID k if(i==) PC=PC+1+k - 1/2 k=[-64,63] 34
przesyłania danych (1/3) mnemonik operandy opis znaczniki # uwagi MOV Rd, Rr Rd=Rr - 1 r,d=[,31] MOVW Rd, Rr Rd+1:Rd=Rr+1:Rr - 1 r,d=,2,..,3 LDI Rd, K Rd=K - 1 d=[16,31], K=[,255] LDS Rd, k Rd=[k] - 2 d=[,31], k=[,64k-1] LD Rd, X Rd=[X] - 2 d=[,31] LD Rd, X+ Rd=[X], X=X+1-2 d=[,31] LD Rd, -X X=X-1, Rd=[X] - 2 d=[,31] LD Rd, Y Rd=[Y] - 2 d=[,31] LD Rd, Y+ Rd=[Y], Y=Y+1-2 d=[,31] LD Rd, -Y Y=Y-1, Rd=[Y] - 2 d=[,31] LDD Rd, Y+q Rd=[Y+q] - 2 d=[,31], q=[,63] LD Rd, Z Rd=[Z] - 2 d=[,31] LD Rd, Z+ Rd=[Z], Z=Z+1-2 d=[,31] LD Rd, -Z Z=Z-1, Rd=[Z] - 2 d=[,31] LDD Rd, Z+q Rd=[Z+q] - 2 d=[,31], q=[,63] 35
przesyłania danych (2/3) mnemonik operandy opis znaczniki # uwagi STS k, Rr [k]=rr - 2 r=[, 31], k=[, 64k-1] ST X, Rr [X]=Rr - 2 r=[,31] ST X+, Rr [X]=Rr, X=X+1-2 r=[,31] ST -X, Rr X=X-1, [X]=Rr - 2 r=[,31] ST Y, Rr [Y]=Rr - 2 r=[,31] ST Y+, Rr [Y]=Rr, Y=Y+1-2 r=[,31] ST -Y, Rr Y=Y-1, [Y]=Rr - 2 r=[,31] STD Y+q, Rr [Y+q]=Rr - 2 r=[,31], q=[,63] ST Z, Rr [Z]=Rr - 2 r=[,31] ST Z+, Rr [Z]=Rr, Z=Z+1-2 r=[,31] ST -Z, Rr Z=Z-1, [Z]=Rr - 2 r=[,31] STD Z+q, Rr [Z+q]=Rr - 2 r=[,31], q=[,63] 36
przesyłania danych (3/3) mnemonik operandy opis znaczniki # uwagi LPM - R=[Z] - 3 - LPM Rd, Z Rd=[Z] - 3 d=[,31] LPM Rd, Z+ Rd=[Z], Z=Z+1-3 d=[,31] ELPM - R=(RAMPZ:Z) - 3 - ELPM Rd, Z Rd=[RAMPZ:Z] - 3 d=[,31] ELPM Rd, Z+ Rd=[RAMPZ:Z], Z=Z+1-3 d=[,31] SPM - [Z]=R1:R - - - IN Rd, A Rd=I/O(A) - 1 d=[,31], A=[,63] OUT A, Rr I/O(A)=Rr - 1 r=[,31], A=[,63] PUSH Rr [SP]=Rr, SP - 2 r=[,31] POP Rd SP++, Rr=[SP] - 2 r=[,31] 37
bitowe (1/2) mnemonik operandy opis znaczniki # uwagi LSL Rd Rd[n+1]=Rd[n], Rd[]=, C=Rd[7] ZCNVH 1 d=[,31] LSR Rd Rd[n]=Rd[n+1], Rd[7]=, C=Rd[] ZCNV 1 d=[,31] ROL Rd Rd[]=C, Rd[n+1]=Rd, C=Rd[7] ZCNVH 1 d=[,31] ROR Rd Rd[7]=C, Rd[n]=Rd[n+1], C=Rd[] ZCNV 1 d=[,31] ASR Rd Rd[n]=Rd[n+1], n=,..,6 ZCNV 1 d=[,31] SWAP Rd Rd[3,..,] Rd[7,..,4] - 1 d=[,31] BSET s SREG[s]=1 SREG(s) 1 s=[,7] BCLR s SREG[s]= SREG(s) 1 s=[,7] SBI A, b I/O(A(b))=1-2 b=[,7], A=[,31] CBI A, b I/O(A(b))= - 2 b=[,7], A=[,31] BST Rr, b T=Rr[b] T 1 r=[,31], b=[,7] BLD Rd, b Rd[b]=T - 1 d=[,31], b=[,7] 38
bitowe (2/2) mnemonik operandy opis znaczniki # uwagi SEC - C=1 C 1 - CLC - C= C 1 - SEN - N=1 N 1 - CLN - N= N 1 - SEZ - Z=1 Z 1 - CLZ - Z= Z 1 - SEI - I=1 I 1 - CLI - I= I 1 - SES - S=1 S 1 - CLS - S= S 1 - SEV - V=1 V 1 - CLV - V= V 1 - SET - T=1 T 1 - CLT - T= T 1 - SEH - H=1 H 1 - CLH - H= H 1-39
kontrolne mnemonik operandy opis znaczniki # uwagi BREAK - debugowanie - 1 - NOP - operacja pusta - 1 - SLEEP - stan uśpienia - 1 - WDR - zerowanie licznika WATCHDOGa - 1-4