Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 25 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
25
Dung lượng
453,49 KB
Nội dung
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