Cùng học AVR - AVR2 cấu trúc AVR pot

25 362 1
Cùng học AVR - AVR2 cấu trúc AVR pot

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

AUTO.NLU CÙNG H C AVR AVR2 – C U TRÚC AVR Tho thu n: tài li u thu c quy n s h u c a tác gi , b n có th t tham kh o tài li u khơng đư c phép s d ng ñ in thành sách báo, ñăng lên di n ñàn hay website, b n có th dùng ñư ng link http://www.dieukhientudong.net ñ hư ng t i tài li u Liên h tác gi qua email: thanhtam.h@gmail.com I B n s ñi ñ n ñâu Bài ti p t c ñ u tiên lo t gi i thi u v AVR, n u sau b n ñã ph n bi t cách l p trình cho AVR b ng AVRStudio này, s tìm hi u k v c u trúc c a AVR Sau này, b n s : Hi u ñư c c u trúc AVR, c u trúc b nh cách th c ho t ñ ng c a chip Hi u v Stack cách ho t ñ ng Bi t ñư c m t s instruction b n truy xu t b nh H c instruction r nhánh vịng l p Chương trình (Subroutine) Macro C i ti n ví d Vi t ví d minh h a cách s d ng b nh vòng l p II T ch c c a AVR AVR có c u trúc Harvard, đư ng truy n cho b nh d li u (data memory bus) ñư ng truy n cho b nh chương trình (program memory bus) đư c tách riêng Data memory bus ch có bit ñư c k t n i v i h u h t thi t b ngo i vi, v i register file Trong program memory bus có đ r ng 16 bits ch ph c v cho instruction registers Hình mơ t c u trúc b nh c a AVR B nh chương trình (Program memory): Là b nh Flash l p trình đư c, chip AVR cũ (như AT90S1200 hay AT()2313…) b nh chương trình ch g m ph n Application Flash Section chip AVR m i có thêm ph n Boot Flash setion Boot section s ñư c kh o sát ph n sau, nói v b nh chương trình, t hi u Application section Th c ch t, application section bao g m ph n: ph n ch a instruction (mã l nh cho ho t ñ ng c a chip) ph n ch a vector ng t (interrupt vectors) Các vector ng t n m ph n ñ u c a application section (t ñ a ch 0x0000) dài ñ n tùy thu c vào lo i chip Ph n ch a instruction n m li n sau đó, chương trình vi t cho chip ph i ñư c load vào ph n Xem l i ph n đ u c a ví d 1: ORG 0x000 RJMP BATDAU ORG 0x020 BATDAU: Trong ví d này, sau set v trí 0x000 b ng ch th (DIRECTIVE) ORG 0x000 dùng instruction RJMP đ nh y đ n v trí 0x020, th ph n b nh chương trình t 0x00 đ n 0x01F khơng đư c s d ng (vì ví d khơng s d ng vector For more details and questions, contact me: thanhtam.h@gmail.com AUTO.NLU ng t) Chương trình đư c b t ñ u t ñ a ch 0x020, s 0x020 ngư i l p trình ch n, th t vector ng t c a chip ATMEGA8 ch kéo dài ñ n ñ a ch 0x012, v y chương trình có th đư c b t đ u t b t c v trí sau Đ bi t đ dài vector ng t c a t ng chip b n tham kh o datasheet c a chip Vì ch c c a b nh chương trình ch a instruction, khơng có nhi u h i tác ñ ng lên b nh l p trình cho chip, th đ i v i ngư i l p trình AVR, b nh “không quan tr ng” T t c ghi quan tr ng c n kh o sát n m b nh d li u c a chip Hình C u trúc b nh c a AVR B nh d li u (data memory): Đây ph n ch a ghi quan tr ng nh t c a chip, vi c l p trình cho chip ph n l n truy c p b nh B nh d li u chip AVR có đ l n khác tùy theo m i chip, nhiên v b n ph n b nh ñư c chia thành ph n: Ph n 1: ph n ñ u tiên b nh d li u, mơ t tronh hình 2, ph n bao g m 32 ghi có tên g i register file (RF), hay General Purpose Rgegister – GPR, ho c ñơn gi n Thanh ghi T t c ghi ñ u ghi bits hình Hình Thanh ghi bits T t c chip h AVR ñ u bao g m 32 ghi Register File có đ a ch t ñ i t 0x0000 ñ n 0x001F M i ghi có th ch a giá tr dương t ñ n 255 ho c giá tr có d u t -128 đ n 127 ho c mã ASCII c a m t ký t đó…Các ghi ñư c ñ t tên theo th For more details and questions, contact me: thanhtam.h@gmail.com AUTO.NLU t R0 ñ n R31 Chúng ñư c chia thành ph n, ph n bao g m ghi t R0 ñ n R15 ph n ghi R16 ñ n R31 Các ghi có đ c m sau: - Đư c truy c p tr c ti p instruction - Các toán t , phép toán th c hi n ghi ch c n chu kỳ xung clock - Register File ñư c k t n i tr c ti p v i b x lí trung tâm – CPU c a chip - Chúng ngu n ch a s h ng phép toán đích ch a k t qu tr l i c a phép toán Đ minh h a, xét ví d th c hi n phép c ng ghi b ng instruction ADD sau: ADD R1, R2 B n th y dòng l nh trên, ghi R1 R2 ñư c s d ng tr c ti p v i tên c a chúng, dịng l nh đư c d ch sang opcode đ download vào chip s có d ng: 0000110000010010 00001=1 t c ghi R1 00010 = ch ghi R2 Sau phép c ng, k t qu s ñư c lưu vào ghi R1 T t c instruction s d ng RF làm tốn h ng đ u có th truy nh p t t c RF m t cách tr c ti p chu kỳ xung clock, ngo i tr SBCI, SUBI, CPI, ANDI LDI, instruction ch có th truy nh p ghi t R16 ñ n R31 Thanh ghi R0 ghi nh t ñư c s d ng instruction LPM (Load Program Memory) Các ghi R26, R27, R28, R29, R30 R31 ch c thơng thư ng cịn đư c s d ng tr (Pointer register) m t s instruction truy xu t gián ti p Chúng ta s kh o sát v n đ tr sau Hình mô t ch c ph c a ghi Hình Register file Tóm l i 32 RF c a AVR ñư c xem ph n c a CPU, th chúng đư c CPU s d ng tr c ti p nhanh chóng, đ g i ghi này, khơng c n g i đ a ch mà ch c n g i tr c ti p tên c a chúng RF thư ng ñư c s d ng toán h ng (operand) c a phép tốn lúc l p trình For more details and questions, contact me: thanhtam.h@gmail.com AUTO.NLU Ph n 2: ph n n m sau register file, ph n bao g m 64 ghi ñư c g i 64 ghi nh p/xu t (64 I/O register) hay g i vùng nh I/O (I/O Memory) Vùng nh I/O c a ngõ giao ti p gi a CPU thi t b ngo i vi T t c ghi ñi u n, tr ng thái…c a thi t b ngo i vi ñ u n m ñây Xem l i ví d 1, tơi có đ c p v vi c ñi u n PORT c a AVR, m i PORT liên quan ñ n ghi DDRx, PORTx PINx, t t c ghi ñ u n m vùng nh I/O Xa hơn, n u mu n truy xu t thi t b ngo i vi khác Timer, chuy n ñ i Analog/Digital, giao ti p USART…ñ u th c hi n thơng qua vi c u n ghi vùng nh Vùng nh I/O có th đư c truy c p SRAM hay ghi I/O N u s d ng instruction truy xu t SRAM ñ truy xu t vùng nh đ a ch c a chúng đư c tính t 0x0020 đ n 0x005F Nhưng n u truy xu t ghi I/O đ a ch c a chúng đ ơc tính t 0x0000 đ n 0x003F Xét ví d instruction OUT dùng xu t giá tr ghi I/O, l nh s d ng ñ a ch ki u ghi, c u trúc c a l nh sau: OUT A, Rr, A đ a ch c a ghi vùng nh I/O, Rr ghi RF, l nh OUT xu t giá tr t ghi Rr ghi I/O có đ a ch A Gi s mu n xu t giá tr ch a R6 ghi ñi u n hư ng c a PORTD, t c ghi DDRD, ñ a ch tính theo vùng I/O c a ghi DDRD 0x0011, th câu l nh c a s có d ng: OUT 0x0011, R6 Tuy nhiên trư ng h p khác, n u mu n truy xu t DDRD theo d ng SRAM, ví d l nh STS hay LDS, ph i dùng đ a ch t ñ i c a ghi này, t c giá tr 0x0031, l nh OUT ñư c vi t l i STS 0x0031, R6 Đ th ng nh t cách s d ng t ng , t bây gi dùng khái ni m “ñ a ch I/O” cho ghi vùng nh I/O đ nói đ n đ a ch khơng tính ph n Register File, khái ni m “ñ a ch b nh ” c a ghi ch ñ a ch t ñ i c a chúng SRAM Ví d ghi DDRD có “đ a ch I/O” 0x0011 “đ a ch b nh ” c a 0x0031, “đ a ch b nh ” = “ñ a ch ghi” + 0x0020 Vì ghi vùng I/O khơng đư c hi u theo tên g i Register file, l p trình cho ghi này, ngư i l p trình c n nh ñ a ch c a t ng ghi, ñây vi c tương đ i khó khăn Tuy nhiên, h u h t ph n m m l p trình cho AVR, đ a ch c a t t c ghi vùng I/O ñ u ñư c ñ nh nghĩa trư c file Definition, b n ch c n đính kèm file vào chương trình c a b n có th truy xu t ghi v i tên g i c a chúng Gi s ví d 1, đ l p trình cho chip Atmega8 b ng AVRStudio, dòng th s d ng INCLUDE "M8DEF.INC" ñ load file ñ nh nghĩa cho chip ATMega8, file M8DEF.INC Vì v y, sau mu n s d ng ghi DDRD b n ch c n g i tên c a chúng, như: OUT DDRD,R6 Ph n 4: RAM ngo i (external SRAM), chip AVR cho phép ngư i s d ng g n thêm b nh ngồi đ ch a bi n, vùng th c ch t ch t n t i ngư i s d ng g n thêm b nh vào chip Ph n 5: EEPROM (Electrically Ereasable Programmable ROM) m t ph n quan tr ng c a chip AVR m i, ROM nên b nh khơng b xóa c khơng cung c p ngu n ni cho chip, r t thích h p cho ng d ng lưu tr d li u Như hình 1, ph n b nh EEPROM đư c tách riêng có đ a ch tính t 0x0000 For more details and questions, contact me: thanhtam.h@gmail.com AUTO.NLU AVR ho t đ ng th nào? Hình bi u di n c u bên c a AVR B n th y r ng 32 ghi Register File ñư c k t n i tr c ti p v i Arithmetic Logic Unit -ALU (ALU ñư c xem CPU c a AVR) b ng line, th ALU có th truy xu t tr c ti p lúc ghi RF ch chu kỳ xung clock (vùng ñư c khoanh trịn màu đ hình 4) Hình C u trúc bên AVR Các instruction ñư c ch a b nh chương trình Flash memory dư i d ng ghi 16 bit B nh chương trình đư c truy c p m i chu kỳ xung clock instruction ch a program memory s ñư c load vào instruction register, instruction register tác ñ ng l a ch n register file RAM cho ALU th c thi Trong lúc th c thi chương trình, đ a ch c a dịng l nh th c thi đư c quy t ñ nh b i m t b đ m chương trình – PC (Program counter) Đó cách th c ho t ñ ng c a AVR AVR có ưu m h u h t instruction ñ u ñư c th c thi chu kỳ xung clock, v y có th ngu n clock l n nh t cho AVR có th nh s vi u n khác PIC th i gian th c thi v n nhanh For more details and questions, contact me: thanhtam.h@gmail.com AUTO.NLU III Stack Stack ñư c hi u “tháp” d li u, d li u ñư c ch a vào stack ñ nh “tháp” d li u ñư c l y t ñ nh Ki u truy c p d li u c a stack g i LIFO (Last In First Out – vào sau trư c) Hình th hi n cách truy c p d li u c a stack Hình Stack Khái ni m cách th c ho t ñ ng c a stack có th đư c áp d ng cho AVR, b ng cách khai báo m t vùng nh SRAM stack ta có th s d ng vùng nh m t stack th c th Đ khai báo m t vùng SRAM làm stack c n xác l p ñ a ch ñ u c a stack b ng cách xác l p tr stack-SP (Stack Pointer) SP tr 16 bit bao g m ghi bit SPL SPH (ch L LOW ch ghi mang giá tr byte th p c a SP, H = HIGH), SPL SPH n m vùng nh I/O Giá tr gán cho ghi SP s ñ a ch kh i ñ ng c a stack Quay l i ví d 1, ph n kh i t o ñi u ki n ñ u ; KHOI TAO CÁC DIEU KIEN DAU LDI R16, HIGH(RAMEND) LDI R17, LOW(RAMEND) OUT SPH, R16 OUT SPL, R17 B n dịng khai báo m c đích gán giá tr c a RAMEND cho tr SP, RAMEND (t c End of Ram) bi n ch a ñ a ch l n nh t c a RAM n i AVR, bi n ñư c ñ nh nghĩa file M8DEF.INC Như th sau dòng trên, tr SP ch a giá tr cu i c a SRAM hay nói cách khác vùng stack b t đ u t v trí cu i c a b nh SRAM Nhưng t i v trí cu i mà khơng giá tr khác Có th gi i thích sau: stack AVR ho t ñ ng t xu ng, sau d li u ñư c ñ y vào stack, SP s gi m giá tr th kh i đ ng SP v trí cu i c a SRAM s tránh ñư c vi c m t d li u ghi đè B n có th kh i ñ ng stack v i ñ a ch khác, nhiên lý an tồn, nên kh i ñ ng stack RAMEND Hai instruction dùng cho truy c p stack PUSH POP, PUSH dùng ñ y d li u vào stack POP dùng l y d li u kh i stack D li u ñư c ñ y vào l y kh i stack t i v trí mà tr SP tr đ n Ví d cho chip ATMega8, RAMEND=0x045F, sau kh i ñ ng, tr SP tr đ n v trí 0x045F SRAM, n u ta vi t câu l nh sau: LDI R1, PUSH R1 LDI R1, PUSH R1 LDI R1, For more details and questions, contact me: thanhtam.h@gmail.com AUTO.NLU PUSH R1 Khi n i dung c a stack s hình Hình N i dung stack ví d Sau m i l n PUSH d li u, SP s gi m đơn v tr vào v trí ti p theo Bây gi n u ta dùng POP ñ l y d li u t stack, POP R2, R2 s mang giá tr c a ngăn nh 0x045D, t c R2=8 Trư c instruction POP ñư c th c hi n, tr SP ñư c tăng lên đơn v , sau d li u s ñư c l y t v trí mà SP tr đ n stack Stack AVR khơng ph i “vơ đáy”, nghĩa ch có th PUSH d li u vào stack ñ sâu nh t ñ nh ñ y (ph thu c vào chip) S d ng stack khơng cách đơi s làm chương trình th c thi sai ho c t n th i gian th c thi vô ích Vì th khơng nên s d ng stack ch ñ lưu bi n thông thư ng ng d ng ph bi n nh t c a stack s d ng chương trình (Subroutine), c n “nh y” t m t v trí chương trình đ n chương trình con, sau th c hi n chương trình l i mu n quay v v trí ban đ u chương trình Stack phương cách t i ưu dùng ñ ch a b ñ m chương trình trư ng h p Xem l i ví d 1, chương trình dùng l nh RCALL DELAY ñ nh y ñ n ño n chương trình DELAY, RCALL l nh nh y đ n v trí b nh chương trình, trư c nh y, PC ñư c c ng thêm PUSH m t cách t đ ng vào stack Cu i chương trình DELAY, dùng instruction RET, instruction POP d li u t stack PC m t cách t đ ng, b ng cách có th quay l i v trí trư c Chính l nh RCALL RET s d ng stack m t cách t ñ ng nên ta ph i kh i ñ ng stack t ñ u, n u khơng chương trình s th c thi sai ch c Tóm l i c n kh i đ ng stack đ u chương trình khơng nên s d ng stack m t cách tùy thích n u chưa th t c n thi t IV Thanh ghi tr ng thái – SREG (STATUS REGISTER) N m vùng nh I/O, ghi SREG có đ a ch I/O 0x003F ñ a ch b nh 0x005F (thư ng v trí cu i c a vùng nh I/O) m t s ghi quan tr ng nh t c a AVR, th mà tơi dành ph n ñ gi i thi u v ghi Thanh ghi SREG ch a bit c (flag) ch tr ng thái c a b x lí, t t c bit đ u b xóa sau reset, bit có th đư c đ c ghi b i chương trình Ch c c a t ng bit đư c mơ t sau: For more details and questions, contact me: thanhtam.h@gmail.com AUTO.NLU Hình Thanh ghi tr ng thái • Bit – C (Carry Flag: C nh ): bit nh phép đ i s ho c logic, ví d ghi R1 ch a giá tr 200, R2 ch a 70, th c hi n phép c ng có nh : ADC R1, R2, sau phép c ng, k t qu s ñư c lưu l i ghi R1, k t qu th c 270 mà ghi R1 l i ch có kh ch a t i đa giá tr 255 (vì có bit) nên trư ng h p này, giá tr lưu l i R1 th c ch t ch 14, ñ ng th i c C đư c set lên (vì 270=100001110, ñó bit sau 00001110 =14 s ñư c lưu l i R1) • Bit – Z (Zero Flag: C 0): c ñư c set n u k t qu phép tốn đ i s hay phép Logic b ng • Bit – N (Negative Flag: C âm): c ñư c set n u k t qu phép tốn đ i s hay phép Logic s âm • Bit – V (Two’s complement Overflow Flag: C tràn c a bù 2): ho t đ ng c a c có v s khó hi u cho b n liên quan ñ n ki n th c s nh phân (ph n bù), s ñ c p ñ n th y c n thi t • Bit – S (Sign Bit: Bit d u): Bit S k t qu phép XOR gi a c N V, S=N⊕V • Bit – H (Half Carry Flag: C nh n a): c H c nh vài phép tốn đ i s phép Logic, c hi u qu ñ i v i phép tốn v i s BCD • Bit – T (Bit Copy Storage): ñư c s d ng Instruction BLD (Bit LoaD) BST (Bit STorage) Tơi s gi i thích ch c Bit T ph n gi i thi u v BLD BST • Bit – I (Global Interrupt Enable : Cho phép ng t toàn b ): Bit ph i ñư c set lên n u chương trình có s d ng ng t Sau set bit này, b n mu n kích ho t lo i ng t c n set bit ng t riêng c a ng t Hai instruction dùng riêng ñ Set Clear bit I SEI CLI Chú ý: t t c bit ghi SREG đ u có th đư c xóa thơng qua instruction khơng tốn h ng CLx set b i SEx, x tên c a Bit.Ví d CLT xóa Bit T SEI set bit I Tơi ch gi i thích ng n g n ch c c a bit ghi SREG, c th ch c cách s d ng c a t ng bit s tìm hi u trư ng h p c th sau này, ngư i đ c có th t tìm hi u thêm tài li u v INSTRUCTION cho AVR Tôi cung c p thêm b ng tóm t t s nh hư ng c a phép tốn đ i s , logic lên Bit ghi SREG For more details and questions, contact me: thanhtam.h@gmail.com AUTO.NLU Hình nh hư ng c a phép toán lên SREG V Gi i thi u m t s Imstruction b n Sau tìm hi u c u trúc b nh phương th c ho t ñ ng c a chip, ph n gi i thi u m t s instruction mà r t hay s d ng l p trình cho AVR Tơi s chia instruction thành nhi u nhóm d a theo ph m vi tác ñ ng ch c c a chúng Trư c h t th ng nh t m t s cách s d ng ký hi u cách vi t cú pháp c a instruction sau: • Rd: ghi ngu n đích thu c Register File • Rr: ghi ngu n thu c Register File Khái ni m ngu n (Source), đích (Destination) ch toán h ng k t qu phép tốn đ i s Logic, ví d ADD R1, R2 l nh c ng giá tr ch a ghi R1, R2, trư ng h p c R1 R2 ñ u đư c g i ngu n ch a giá tr trư c th c hi n phép c ng Sau phép c ng ñư c th c hi n, k t qu ñư c ch a l i R1 th R1 đư c g i đích trư ng h p R1 v a ngu n, v a ñích R2 ch ngu n, n u vi t ví d dư i d ng t ng quát s : ADD Rd, Rr • R: k t qu sau l nh ñư c th c thi • K: h ng s • k: h ng s ch ñ a ch t ñ i c a ghi • b: (0 đ n 7) s th t bit ghi c a Register File vùng nh I/O • s: (0 ñ n 7) s th t bit ghi tr ng thái SREG • X,Y,X: ghi ñ a ch tương ñ i (X=R27:R26, X=R29:R28, X=R31:R30) For more details and questions, contact me: thanhtam.h@gmail.com AUTO.NLU • A: ñ a ch I/O • q: ñ d ch chuy n c a ñ a ch t ñ i Instruction ch dùng cho Register Files: - LDI (LoaD Immediate) • Cú pháp: LDI Rd, K • Ch c năng: Load h ng s K vào ghi Rd • Gi i h n: ch áp d ng cho ghi t R16 đ n R31 • Ví d : LDI R16, 99 k t qu ghi R1 mang giá tr 99 - MOV (MOVE) • Cú pháp: MOV Rd, Rr • Ch c năng: Copy giá tr ghi Rr vào ghi Rd • Gi i h n: áp d ng cho t t c ghi RF • Ví d : MOV R15, R16 k t qu R15 có giá tr v i R16 (R15=R16=99) - CLR (CLEAR Register) • Cú pháp: CLR Rd • Ch c năng: xóa ghi Rd, sau l nh ghi Rd=0x00 • Gi i h n: áp d ng cho t t c ghi RF • Ví d : CLR R16 k t qu R16 = 0x00 - SER (SET Register) • Cú pháp: SER Rd • Ch c năng: set t t c bit tronh ghi Rd lên 1, sau l nh ghi Rd=0xFF • Gi i h n: ch áp d ng cho ghi t R16 ñ n R31 • Ví d : SER R16 k t qu R16 = 0xFF - CBR (CLEAR Bit in Register) • Cú pháp: CBR Rd, K • Ch c năng: xóa bit ghi Rd v i “m t n ” K, n u Bit K Bit tương ng Rd s b xóa • Gi i h n: ch áp d ng cho ghi t R16 đ n R31 • Ví d : CBR R16, 0xF0 k t qu bit cao nh t c a R16 b xóa K=11110000 (B) - SBR (SET Bit in Register) • Cú pháp: SBR Rd, K • Ch c năng: set bit ghi Rd v i “m t n ” K, n u Bit K Bit tương ng Rd s đư c set lên • Gi i h n: ch áp d ng cho ghi t R16 ñ n R31 • Ví d : SBR R16, 0xF0 k t qu bit cao nh t c a R16 ñư c set lên K=11110000 (B) - BLD (Bit LoaD from T Flag) • Cú pháp: BLD Rd, b • Ch c năng: Load giá tr c T c a ghi SREG vào bit th b ghi Rd Đây ch c c a c T For more details and questions, contact me: thanhtam.h@gmail.com AUTO.NLU - - - - - • Gi i h n: áp d ng cho t t c ghi RF • Ví d : SET ; set bit T lên BLD R16, K t qu bit c a ghi R16 đư c set lên giá tr c a bit T BST (Bit Storage from T Flag) • Cú pháp: BST Rd, b • Ch c năng: Copy bit th b ghi Rd vào c T c a ghi SREG Đây ch c c a c T • Gi i h n: áp d ng cho t t c ghi RF • Ví d : BST R16, k t qu c T ch a giá tr c a bit c a ghi R16 CPI (COMPARE with Immediate) • Cú pháp: CPI Rd, K • Ch c năng: so sánh ghi Rd v i h ng s K, l nh làm thay ñ i nhi u bit ghi SREG s thay đ i c a c Zero quan tr ng nh t, n u Rd = K c Z=1, ngư c l i Z=0, s d ng ñ c ñi m thay ñ i c a c Z k t h p v i l nh BRNE ho c BREQ có th t o thành m t l nh r nhánh • Gi i h n: ch áp d ng cho ghi t R16 đ n R31 • Ví d : LDI R16, 10 CPI R16, 10 K t qu c Z đư c set thành lúc R16 =10 ANDI (AND with Immediate) • Cú pháp: ANDI Rd, K • Ch c năng: th c hi n phép Logic AND gi a ghi Rd v i h ng s K k t qu ñ t l i Rd • Gi i h n: ch áp d ng cho ghi t R16 đ n R31 • Ví d : ANDI R17, 0x00 k t qu R17 có 0x00 AND (Logical AND) • Cú pháp: AND Rd, Rr • Ch c năng: th c hi n phép Logic AND gi a ghi Rd Rr , k t qu ñ t l i Rd • Gi i h n: áp d ng cho t t c ghi RF • Ví d : LDI R1, 0xFF ;(11111111) LDI R17, 0xAA; (10101010) AND R1, R17 K t qu R1=0xAA 11111111 & 10101010 =10101010 ORI (Logical OR with Immediate) • Cú pháp: ORI Rd, K • Ch c năng: th c hi n phép Logic OR gi a ghi Rd v i h ng s K k t qu ñ t l i Rd For more details and questions, contact me: thanhtam.h@gmail.com AUTO.NLU • Gi i h n: ch áp d ng cho ghi t R16 đ n R31 • Ví d : ORI R17, 0xFF k t qu R17 có 0xFF - OR (Logical OR) • Cú pháp: OR Rd, Rr • Ch c năng: th c hi n phép Logic OR gi a ghi Rd Rr , k t qu ñ t l i Rd • Gi i h n: áp d ng cho t t c ghi RF • Ví d : LDI R1, 0xFF ;(11111111) LDI R17, 0xAA; (10101010) AND R1, R17 K t qu R1=0xFF 11111111 & 10101010 =11111111 - LSL(Logical Shift Left) • Cú pháp: LSL Rd • Ch c năng: d ch t t ghi Rd sang trái v trí, Bit (bit l n nh t) c a Rd s ñư c ch a c nh C, bit c a Rd b xóa thành Th c ch t LSL tương ñương v i phép nhân ghi Rd v i B n xem hình minh h a bên dư i • Gi i h n: áp d ng cho t t c ghi RF • Ví d : LDI R1, 0B11000011 ; (d ng nh phân c a 195) LSL R1 K t qu R1=10000110 c C =1 ghi R1 ñã ñư c d ch sang trái v trí, trư c d ch bit c a R1 nên sau d ch bit ñư c ch a C, C=1 - LSR(Logical Shift Right) • Cú pháp: LSR Rd • Ch c năng: d ch t t ghi Rd sang ph i v trí, Bit (bit nh nh t) c a Rd s ñư c ch a c nh C, bit c a Rd b xóa thành Th c ch t LSR tương ñương v i phép chia ghi Rd cho B n xem hình minh h a bên dư i • Gi i h n: áp d ng cho t t c ghi RF • Ví d : LDI R1, 0B11000110 ; (d ng nh phân c a 195) LSR R1 For more details and questions, contact me: thanhtam.h@gmail.com AUTO.NLU - - - - - K t qu R1=01100001 c C =1 ghi R1 đư c d ch sang ph i v trí, trư c d ch bit c a R1 nên sau d ch bit ñư c ch a C, C=1 ADD(ADD without Carry) • Cú pháp: ADD Rd, Rr • Ch c năng: th c hi n phép c ng ghi Rd Rr , k t qu ñ t l i Rd C nh C khơng đư c s d ng • Gi i h n: áp d ng cho t t c ghi RF • Ví d : LDI R16, 30 LDI R17, 25 ADD R16, R17 K t qu R16=55 ADC(ADD with Carry) • Cú pháp: ADC Rd, Rr • Ch c năng: th c hi n phép c ng ghi Rd Rr , k t qu ñ t l i Rd C nh C ñư c set n u k t qu vư t 255 • Gi i h n: áp d ng cho t t c ghi RF • Ví d : LDI R16, 255 LDI R17, ADC R16, R17 K t qu R16=0 c C=1vì k t qu phép c ng 256=100000000 INC (INCrement) • Cú pháp: INC Rd • Ch c năng: tăng ghi Rd ñơn v k t qu ñ t l i Rd L nh đ c bi t thích h p cho ng d ng l p, k t h p v i BREQ hay BRNE có th t o thành vịng l p FOR • Gi i h n: áp d ng cho t t c ghi RF • Ví d : INC R17 k t qu R17 ñư c tăng thêm đơn v SUB(SUBtract without Carry) • Cú pháp: SUB Rd, Rr • Ch c năng: th c hi n phép tr ghi Rd - Rr , k t qu ñ t l i Rd C nh C khơng đư c s d ng • Gi i h n: áp d ng cho t t c ghi RF • Ví d : LDI R16, 30 LDI R17, 25 SUB R16, R17 K t qu R16=5 SUBI(SUBtract Immediate) • Cú pháp: SUBI Rd, K For more details and questions, contact me: thanhtam.h@gmail.com AUTO.NLU • Ch c năng: th c hi n phép tr ghi Rd v i h ng s K, k t qu đ t l i Rd • Gi i h n: ch áp d ng cho ghi t R16 đ n R31 • Ví d : LDI R16, 30 SUBI R16, 20 K t qu R16=10 - DEC (DECrement) • Cú pháp: DEC Rd • Ch c năng: gi m ghi Rd ñơn v k t qu ñ t l i Rd L nh đ c bi t thích h p cho ng d ng l p, k t h p v i BREQ hay BRNE có th t o thành vịng l p FOR • Gi i h n: áp d ng cho t t c ghi RF • Ví d : DEC R17 k t qu R17 ñư c gi m ñi đơn v - MUL (MULtiply unsigned) • Cú pháp: MUL Rd, Rr • Ch c năng: th c hi n phép nhân không d u ghi bit Rd, Rr, k t qu s 16 bit ñ t ghi R1:R0 Chú ý n u Rd Rr ghi R1 R0 k t qu sau tính ñư c s ñư c vi t ñè lên Xem hình minh h a instruction MUL bên dư i • Gi i h n: áp d ng cho t t c ghi RF • Ví d : LDI R16, 30 LDI R17, 25 MUL R16, R17 K t qu R1=0x2, R0=0xEE, 30x25=750=0x02EE Instruction cho ghi I/O B n instruction sau ñây ñư c thi t k riêng ñ truy c p vùng nh I/O, instruction s d ng ñ a ch I/O c a ghi vùng nh Vì thi t k riêng cho vùng nh I/O, b n không th s d ng ghi ñ truy c p RF hay SRAM Trong cú pháp c a instruction này, khái ni m ñ a ch A ñ a ch I/O, ≤ A ≤ 63, n u ví d A=0x00 ghi đ u tiên c a vùng I/O, không ph i ghi R0 - OUT(OUTPUT Data ) • Cú pháp: OUT A,Rr • Ch c năng: xu t giá tr t ghi Rr ghi có đ a ch A vùng nh I/O ñây cách ph bi n nh t ñ xu t giá tr vùng I/O • Gi i h n: Rr ghi RF b t kỳ, A b gi i h n t ñ n 63 • Ví d : LDI R16, 0xFF For more details and questions, contact me: thanhtam.h@gmail.com AUTO.NLU OUT 0x11, R16 K t qu ghi có đ a ch 0x11 vùng I/O, t c ghi DDRD, có giá tr b ng 0xFF - IN(INPUT Data ) • Cú pháp: IN Rr, A • Ch c năng: Load giá tr t ghi có đ a ch A vùng nh I/O vào ghi Rr Đây cách ph bi n nh t ñ nh n giá tr t vùng I/O • Gi i h n: Rr ghi RF b t kỳ, A b gi i h n t đ n 63 • Ví d : IN R16, 0x10 K t qu ghi R16 nh n ñư c giá tr c a ghi có đ a ch 0x11 vùng I/O, t c ghi PIND, ví d ñ c giá tr chân c a PORTD vào R16 - SBI(Set Bit in I/O Register) • Cú pháp: SBI A, b • Ch c năng: Set bit th b ghi có đ a ch A vùng nh I/O Tuy nhiên l nh tác d ng tồn b vùng I/O mà ch có tác đ i v i 32 ghi ñ u (ñ a ch t ñ n 31) • Gi i h n: b s th bit ghi, 0≤b≤7; A b gi i h n t đ n 31 • Ví d : SBI 0x12, K t qu bit c a ghi có đ a ch 0x12 vùng I/O, t c ghi PORTD, ñư c set lên Đây ví d set chân PD2 c a PORTD - CBI(Clear Bit in I/O Register) • Cú pháp: CBI A, b • Ch c năng: xóa bit th b ghi có đ a ch A vùng nh I/O Tuy nhiên l nh tác d ng tồn b vùng I/O mà ch có tác đ i v i 32 ghi ñ u (ñ a ch t ñ n 31) • Gi i h n: b s th bit ghi, 0≤b≤7; A b gi i h n t đ n 31 • Ví d : CBI 0x12, K t qu bit c a ghi có đ a ch 0x12 vùng I/O, t c ghi PORTD, b xóa thành Đây ví d xóa chân PB2 c a PORTD Như tơi trình bày ph n trên, lúc l p trình, sau include file đ nh nghĩa cho chip b n có th s d ng tên c a ghi thay cho ñ a ch c a chúng, th chương trình c a b n s tr nên d hi u Các tr X, Y, Z cách truy c p tồn b khơng gian b nh Trong Register File c a AVR, ghi t R26 ñ n R31ngồi ch a ghi thơng thư ng cịn có ch c tr (Pointer) vi c truy c p b nh (c b nh data b nh Program) N u ñư c s d ng Pointer, ghi ñư c bi t ñ n v i tên g i X, Y, Z Đ nh nghĩa sau: X=R27:R26, X=R29:R28, X=R31:R30 Chúng ghi 16 bit ñư c ñ nh nghĩa trư c cho t t c AVR Ngồi file đ nh nghĩa cho chip có thêm For more details and questions, contact me: thanhtam.h@gmail.com AUTO.NLU ñ nh nghĩa khác XL, XH, YL, YH, ZL, ZH tên g i c a R26-> R31 Ph n kh o sát m t s instruction dùng truy c p toàn b kh i nh c a AVR b ng cách s d ng ñ a ch tr c ti p b ng cách s d ng Pointer - LDS(LoaD direc from data Space) • Cú pháp: LDS Rd, k • Ch c năng: load giá tr byte t ghi có đ a ch k SRAM vào ghi Rd, k d ng ñ a ch t đ i có gi i h n t đ n 65535(216-1) • Gi i h n: Rd ghi b t kỳ RF giá tr l n nh t c a k 65535, th v i l nh ta không th truy c p vư t kho ng không gian 64KB N u mu n truy c p vùng không gian l n 64KB c n m t s h tr , nhiên ñây gi s b nh c a chip (thư ng b nh data) không vư t 64KB (th c t chưa có chip AVR có SRAM hay EEPROM vư t q 64KB) • Ví d : LDS R2, 0x0060 K t qu ghi R2 ch a giá tr c a ghi có đ a ch 0x0060, ñây ghi ñ u tiên kho ng SRAM (sau RF vùng I/O) c a AVR - STS(STorage direc to data Space) • Cú pháp: STS k, Rr • Ch c năng: instruction hồn tồn gi ng LDS dùng đ xu t d li u t ghi Rr RAM, ñ c có th tham kh o ph n gi i thích cho LDS S d ng đ a ch tr c ti p câu l nh s đơn gi n r t khó nh ph n đ a ch , thông thư ng SRAM vùng hay s d ng ñ ch a bi n t m th i, ngôn ng c p cao ta ch c n nh tên bi n v i ASM ph i nh ñ a ch c a chúng M t cách t t ñ tránh vi c dùng ch th (DIRECTIVE, b n xem l i 1) EQU ñ gán tên bi n cho đ a ch , ví d EQU bientam = 0x0060 sau s d ng bientam thay cho 0x0060 M t cách khác ñư c dùng đ truy c p b nh mà khơng dùng ñ a ch t ñ i s d ng s d ng tr Có instruction h tr tr LD (LoaD indirec from data Space), ST (STorage indirec to data Space), LD ñ c d li u t SRAM vào ghi ST lưu d li u t ghi vào SRAM C tr X, Y Z ñ u có th đư c dùng có m t s ñi m lưu ý: c ñ u dùng ñư c trư ng h p truy xu t thông thư ng v i cách truy c p có offset, tr X khơng s d ng đư c Đ truy xu t b nh chương trình b ng tr Z gi i pháp nh t…Dư i ñây s cách s d ng LD, ST k t h p v i tr , xét thơng qua ví d Ví d 1: CLR R27 ; xóa R27, t c xóa byte cao c a pointer X LDI R26, 0x60 ; load giá tr 0x60 vào R26, t c byte th p c a pointer X ; sau dòng trên, giá pointer X 0x0060, s n sàng ñ tr ñ n v trí ñ u tiên SRAM LD R1, X+ ; Load giá tr nh 0x0060 vào R1 (vì X tr đ n 0x0060), tăng giá tr ;X lên 1, th sau l nh X=0x0061 LD R2, X+ ; Load giá tr nh 0x0061 vào R2, tăng giá tr ;X lên 1, th sau l nh X=0x0062 For more details and questions, contact me: thanhtam.h@gmail.com AUTO.NLU LD R3, X ; Load giá tr ô nh 0x0062 vào R3 khơng thay đ i X LD R4, -X ; Gi m giá tr c a X trư c (X=0x0061), sau load giá tr nh 0x0061 vào R4 T ví d th y có cách b n ñ load d li u t SRAM b ng tr , cách Load tr c ti p trư ng h p LD R3, X, cách load post-increment (ho c post-decrement) trư ng h p LD R1, X+ cách load pre-decrement (ho c pre-increment) trư ng h p LD R4, -X Chúng ta có th vi t l i ví d s d ng tr Y ho c Z thay cho X Ví d vi t cho instruction ST hoàn toàn tương t Tuy nhiên cách truy c p theo cách pre hay post ñ u làm thay ñ i giá tr c a tr , u có b t l i n u mu n quay l i v trí nh đó, ph i ti p t c thay ñ i tr Đ tránh vi c làm này, cách truy c p khác ñư c h tr truy c p “Offset” Xét ví d sau: LD R1, Y+1 Đây cách truy c p Offset dùng tr Y, cách vi t tương ñương v i cách vi t LD R1, Y+ Nhưng ñi m khác bi t cách vi t Offset khơng làm thay ñ i giá tr c a tr Y S d ng Offset có ưu m s d ng m ng (array) ngôn ng l p trình c p cao C n ý giá tr offset không vư t 63 phương pháp ch dùng cho ghi Y Z R nhánh vịng l p Khơng gi ng ngôn ng c p cao, l p trình b ng ASM b n khơng đư c h tr c u trúc ñi u n If, For, While…ngư i l p trình ASM ph i t xây d ng cho c u trúc t nh ng instruction b n N u b n có tay tài li u tra c u instruction cho AVR b n s th y có r t nhi u instruction có d ng BRxx, v i BR vi t t t c a t Branch (r nhánh) Đây instruction b n giúp b n xây d ng c u trúc ñi u n tương ñương If, For, While…cho riêng Trư c h t ta s kh o sát instruction BRNE b ng cách xem l i ví d 1, đo n chương trình DELAY: DELAY: LDI R20, 0xFF DELAY0: LDI R21, 0xFF DELAY1: DEC R21 BRNE DELAY1 DEC R20 BRNE DELAY0 RET B n ý dòng l nh n m gi a đo n chương trình trên, dịng đ u tiên b n bi t load giá tr 255 vào ghi R21, sau tơi đ t label DELAY1- xem c t m c, dịng 3, instruction DEC b n m i đư c h c hôm - gi m giá tr ghi R21 ñi ñơn v , cu i BRNE DELAY1, BRNE vi t t t c a BRanch if Not Equal – r nhánh n u không b ng, th c b n ch t c a l nh r nhánh n u c Zero không b ng Như th câu l nh BRNE DELAY1 For more details and questions, contact me: thanhtam.h@gmail.com AUTO.NLU c a ñư c AVR th c hi n sau: ki m tra c Z, n u Z=1 ti p t c th c hi n dịng ti p theo sau mà khơng quan tâm đ n nhãn DELAY1, n u Z=0 nh y ñ n nhãn DELAY1 B n th y r ng ban ñ u R21 =255, sau gi m b i DEC, ghi R21=254≠0, c Z =0, r nhánh x y ra, b ñ m chương trình nh y v nhãn DELAY1 Quá trình l p l i kho ng 255 l n trư c R21 =0 d n ñ n Z=1 Bao bên ngồi vịng l p c a nhãn DELAY1 vịng l p c a nhãn DELAY0, cách hi u hoàn toàn tương t trư c l nh DEC R20 đư c th c thi ph i ch cho vòng l p DELAY1 kêt thúc B n thân DELAY0 vòng l p 255 l n k t qu cu i ta thu ñư c vòng l p kho ng 255x255 l n mà khơng làm c , ý nghĩa cách ho t ñ ng c a ño n chương trình DELAY Bên c nh BRNE có s instruction ph c v r nhánh khác như: - BREQ(BRanch if EQual ) • Cú pháp: BREQ LABEL • Ch c năng: Nh y đ n nhãn LABEL n u c Z =1 C Z ch u tác ñ ng c a r t nhi u instruction CP, CPI, SUB, SUBI…vì th BREQ thư ng ñư c s d ng sau instruction • Ví d : LDI R16, 0xFF LDI R17, 0xFF CP R16, R17 ; so sanh ghi R16, R17 BREQ RENHANH … RENHANH: ; th c hi n nh ng vi c r nhánh K t qu vi c r nhánh x y so sánh b ng CP, R17=R16 nên c Z t ñ ng ñư c set b ng 1, l nh BREQ ñư c th c thi nh y ñ n nhãn RENHANH Ví d tương đương c u trúc if (R16=R17) {th c hi n nh ng vi c r nhánh} - BRLO(BRanch if LOwer ) • Cú pháp: BRLO LABEL • Ch c năng: b n ch t c a câu l nh nh y ñ n nhãn LABEL n u c C =1 Tuy nhiên, thông thư ng l nh s d ng theo sau instruction CP, CPI, SUB, SUBI…khi vi c r nhánh s x y n u ghi Rd

Ngày đăng: 01/08/2014, 20:20

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan