chap3 8051 microcontroller – assembly

21
DCE Ngôn nglp trình Assembly cho vi điu khin 8051 Microcontroller Chapter 3 Ngo Nhu Khoa Department of Computer Engineering ThaiNguyen University of Technology

Upload: vietanhetc

Post on 19-Nov-2014

1.078 views

Category:

Documents


8 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Chap3 8051 microcontroller – assembly

DCE

Ngôn ngữ lập trình Assembly cho vi điều khiển 8051

MicrocontrollerChapter 3

Ngo Nhu Khoa

Department of Computer Engineering

ThaiNguyen University of Technology

Page 2: Chap3 8051 microcontroller – assembly

10/1/2005 2 DCE

Các vấn đềMã máy - Machine codeCác chế độ địa chỉ của 8051Các lệnh Jump, Loop và CallThường trình con - SubroutinesCác vòng trễ đơn giản

Page 3: Chap3 8051 microcontroller – assembly

10/1/2005 3 DCE

1. Mã đối tượng của 8051Assembler chuyển đổi mã lệnh assembly thành mã máy/đối tượngSự chuyển đổi từ mã assembly sang mã đối tượng là duy nhất

– Data sheet for 8051 lists the table of conversion– Manual assembly is cool !

Mã đối tượng là 1 chuỗi các lệnh máyMỗi lệnh máy có thể có độ dài 1 byte hoặc nhiều hơnCác lệnh máy là 1 giá trị nhị phân và được viết ở hệ 16

Page 4: Chap3 8051 microcontroller – assembly

10/1/2005 4 DCE

1. Mã đối tượng của 8051 (…)Assemblers tạo ra 1 file .lst trong quá trình dịch.Instruction to m/c code translation on a line by line basis is listed

112223

000874 5578 AAA8 AA90 55 AA

nopinc R0mov A, #55Hmov R0, #0AAHmov R0, 0AAHmov DPTR, #55AAH

#bytes Hex code Instruction

Page 5: Chap3 8051 microcontroller – assembly

10/1/2005 5 DCE

1. Mã đối tượng của 8051 (…)

7961781AE912003009D8F9120032020000

8000800180028003800480058006800780088009800A800B800C800D800E800F8010

ValueAddress

.equ cout, 0x0030

.equ cin, 0x0032

.equ esc, 0x004E

.org 0x8000mov r1, #'a'mov r0, #26

next_char:mov A, r1lcall coutinc r1djnz r0, next_charlcall cinljmp 0x0000

0000:0000:0000:8000:8000: 79 618002: 78 1A

8004: E98005: 12 00 308008: 098009: D8 F9800B: 12 00 32800E: 02 00 00

AssemblyHex

Page 6: Chap3 8051 microcontroller – assembly

10/1/2005 6 DCE

2. Các chế độ địa chỉ của 8051CPU có thể truy xuất dữ liệu theo nhiều cách khác nhau

– Chỉ định dữ liệu trực tiếp trong lệnh– Sử dụng các chế độ địa chỉ khác nhau đối với dữ liệu được

lưu trữ trong bộ nhớ mã lệnh và bộ nhớ dữ liệu

5 chế độ địa chỉ– Tức thì - Immediate– Thanh ghi - Register– Trực tiếp - Direct– Gián tiếp thanh ghi - Register Indirect– Chỉ số - Indexed

Page 7: Chap3 8051 microcontroller – assembly

10/1/2005 7 DCE

2.1. Chế độ địa chỉ tức thìToán hạng (dữ liệu) được chỉ định trực tiếp trong lệnh (mã lệnh)Toán hạng là 1 hằng, được biết trong thời gian dịchDữ liệu tức thì phải có tiền tố là dấu “#”Ví dụ:

mov A, #25H ;A ← #0x25mov DPTR, #1FFFH ;DPTR ← #0x1FFFtemp EQU 40 ;assembler directivemov R1, #temp ;R1 ← 28H (40 decimal)

Page 8: Chap3 8051 microcontroller – assembly

10/1/2005 8 DCE

2.2. Chế độ địa chỉ thanh ghiYêu cầu phải sử dụng các thanh ghi để lưu giữ dữ liệuĐặt toán hạng vào 1 thanh ghi và thao tác với nó bằng cách tham chiếu đến thanh ghi chứa (theo tên) trong lệnh

mov A, R0 ;A ← contents (R0)mov R2, A ;R2 ← contents (A)ADD A, R1 ;A ← contents (A) + contents (R1)

Các thanh ghi nguồn và đích phải cùng kích thướcCác lệnh dịch chuyển dữ liệu giữa các thanh ghi không thể áp dụng cho mọi trường hợp, cho mọi thanh ghi:

mov R4, R7 ; invalid– Kiểm tra với danh sách lệnh trước khi sử dụng

Page 9: Chap3 8051 microcontroller – assembly

10/1/2005 9 DCE

2.3. Chế độ địa chỉ trực tiếpĐối với dữ liệu được lưu trữ trên RAM và các thanh ghi

– Tất cả các vùng nhớ đều các thể truy xuất bằng địa chỉ.– Như truy xuất đến tất cả các thanh ghi, các cổng, các thiết bị ngoại

vi trong 8051.

Sử dụng địa chỉ của trực tiếp toán hạng trong lệnh.mov A, 40H ; A ← mem[40H] (note no # sign before 40H)

Chế độ địa chỉ thanh ghi tương tự như chế độ địa chỉ trực tiếp

mov A, 4H ; 4H is the address for R4mov A, R4 ; tương tự như trên. Cả 2 lệnh đều như nhau

;nhưng có thể có mã khác nhauNgăn xếp trong 8051 chỉ sử dụng chế độ địa chỉ trực tiếp

Page 10: Chap3 8051 microcontroller – assembly

10/1/2005 10 DCE

2.4. Chế độ gián tiếp thanh ghi1 thanh ghi được sử dụng như 1 con trỏ

– Thanh ghi lưu giữ địa chỉ của dữ liệuChỉ có các thanh ghi R0, R1 và DPTR có thể được sử dụng cho mục đích này trong 8051R0 và R1 có thể được sử dụng đối với bộ nhớ nội (256 bytes bao gồm cả SFRs) hay từ 00H đến FFH của bộ nhớ ngoài

mov A, @R0 ;A ← internal_mem[R0]mov @R1, A ;A ← internal_mem[R1]movx A, @R0 ; A ← external_mem[R0]

Thanh ghi DPTR có thể được sử dụng đối với bộ nhớ ngoài, trỏ đến ô nhớ bất kỳ trong khoảng 64K

movx A, @DPTR ;A ← external_mem[DPTR]movx @DPTR, A ;vice versa

Page 11: Chap3 8051 microcontroller – assembly

10/1/2005 11 DCE

2.5. Chế độ địa chỉ chỉ sốSử dụng 1 thanh ghi để lưu trữ con trỏ (địa chỉ cơ sở) và 1 thanh ghi khác để lưu giá trị lệchĐịa chỉ kết quả là tổng sum = base+offset

– Chuyển byte mã có quan hệ với DPTR vào A. Địa chỉ kết quả là: DPTR + A

movc A, @A+DPTR ;A ← ext_code_mem [(A + DPTR)]– Chuyển byte mã có quan hệ với PC vào A. Địa chỉ kết quả là

PC + Amovc A, @A+PC ;A ← ext_code_mem [(A + PC)]Được sử dụng rộng rãi trong thực hiện các bảng tra, các mảng dữ liệu, tạo ra ký tự,… trong bộ nhớ mã lệnh (ROM)

Page 12: Chap3 8051 microcontroller – assembly

10/1/2005 12 DCE

2.5. Ví dụChương trình đọc vào 1 giá trị x từ P1 và đưa ra x2 ở P2

ORG 0 ; assembler directivemov DPTR, #LUT ; 300H is the LUT addressmov A, #0FFHmov P1, A ; program the port P1 to input data

Again: mov A, P1 ; read xmovc A, @A+DPTR ; get x2 from LUTmov P2, A ; output x2 to P2sjmp again ; for (1) loop

ORG 300H ;Look-up Table starts at 0x0300LUT: DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81

Page 13: Chap3 8051 microcontroller – assembly

10/1/2005 13 DCE

3. Các lệnh điều khiển chương trìnhRẽ nhánh không điều kiện

– ajmp addr11 ; absolute jump - nhảy theo địa chỉ tuyệt đối– ljmp addr16 ; long jump - nhảy xa– sjmp rel ; nhảy gần đến địa chỉ quan hệ– jmp @A+DPTR ; jump indirect - nhảy gián tiếp

Rẽ nhánh có điều kiện– jz, jnz rel ; nhảy gần đến địa chỉ quan hệ nếu điều kiện thoả mãn– djnz rel ; giảm toán hạng nguồn và nhảy nếu khác không– cjne rel ; so sánh và nhảy nếu không bằng

Gọi thường trình con (Subroutine)– acall addr11 ; gọi tuyệt đối 1 thường trình con– lcall addr16 ; gọi 1 thương trình con ở xa– ret ; trở về chương trình chính từ 1 thường trình con– reti ; trở về từ 1 chương trình phục vụ ngắt (ISV)

Page 14: Chap3 8051 microcontroller – assembly

10/1/2005 14 DCE

3.1. Địa chỉ đíchĐịa chỉ đích có thể là:

– Tuyệt đối: Một giá trị địa chỉ vật lýaddr16: địa chỉ 16 bit, ở vị trí bất kỳ trong không gian 64kaddr11: địa chỉ 11 bit, ở vị trí bất kỳ trong không gian 2k

– rel: relative – quan hệ (tiến hay lùi) -128 bytes đến +127 bytes từ vị trí của mã lệnh hiện thời

Địa chỉ đích được tính toán cho các lệnh nhảy quan hệ– PC của lệnh kế tiếp + địa chỉ quan hệ– Đối với nhảy lùi, bỏ đi giá trị nhớ

PC = 15H, SJMP 0FEHĐịa chỉ là 15H + FEH = 13HNhảy đến vị trí lệnh kế tiếp -2byte (lệnh hiện thời)

Page 15: Chap3 8051 microcontroller – assembly

10/1/2005 15 DCE

3.2. Nhảy có điều kiệnjz, jnz : Điều kiện được xác lập trên thanh ghi chứa A==0

– Kiểm tra nếu A = 0– jz nhảy nếu A =0 và jnz nhảy nếu A # zero– Không cần thực hiện phép toán số học

djnz : giảm đi 1 và nhảy nếu không bằng 0– djnz Rn, rel– djnz direct, rel

jnc : Điều kiện được xác lập trên cờ nhớ CY– jc rel– jnc rel

Cjne : so sánh và nhảy nếu không bằng– cjne A, direct, rel– cjne ARn, #data, rel– cjne @Rn, #data, rel

Page 16: Chap3 8051 microcontroller – assembly

10/1/2005 16 DCE

Add 3 to A ten timesmov A, #0 ; clear Amov R2, #10 ; R2 ← 10, can also say 0AH

AGAIN: add A, #03 ; add 3 to Adjnz R2, AGAIN ; repeat until R2==0mov R5, A ; save the result in R5

Loop within loop using djnzmov R3, #100

loop1: mov R2, #10 ; trying for 1000 loop iterationsloop2: nop ; no operation

djnz R2, loop2 ; repeat loop2 until R2==0djnz R3, loop1 ; repeat loop1 until R3==0

3.2. Nhảy có điều kiện (…)

Page 17: Chap3 8051 microcontroller – assembly

10/1/2005 17 DCE

LJMP addr16– Long jump. Nhảy đến 1 địa chỉ đích 2 byte– Lệnh có độ dài 3 byte

SJMP rel– Nhảy đến 1 địa chỉ quan hệ từ PC+127 đến PC-128– Nhảy đến PC + 127 (00H – 7FH)– Nhảy đến PC – 128 (80H – FFH)

3.3. Nhảy không điều kiện

Page 18: Chap3 8051 microcontroller – assembly

10/1/2005 18 DCE

4. Các lệnh gọi thường trình Thường trình con:

– Những đoạn chương trình có thể dùng lại được

LCALL addr16– Long call. Lệnh 3 byte. Gọi bất kỳ thường trình con nào trong

không gian mã 64Kb– Cất nội dung PC vào ngăn xếp - push PC– Nhảy đến địa chỉ xác định - jmp address

ACALL addr11– Lệnh 2 byte. Gọi bất kỳ thường trình con nào trong khoảng 2k

không gian bộ nhớ mã lệnh– Saves code ROM for devices with less than 64K ROM

RET– Trở về từ 1 thương trình con– Phục hồi lại PC từ ngăn xếp - pop PC

Page 19: Chap3 8051 microcontroller – assembly

10/1/2005 19 DCE

5. Chu kỳ máyLà số các chu kỳ đồng hồ được sử dụng để thực hiện 1 lệnhCó giá trị khác nhau, phụ thuộc lệnh. Lệnh ngắn nhất là 1 chu kỳ máyVới 8051, 12 chu kỳ đồng hồ là thời gian tối thiểu cần thiết cho thực hiện 1 lệnhThời gian của 1 chu kỳ máy:

– Tmc = Số Clocks trên chu kỳ máy/ tần số đồng hồ– Với 8051 tần số đồng hồ là 11.0592MHz,

Tmc = 12 / 11.0592M = 1.085 micro secondsThời gian để thực hiện 1 lệnh

– Tinstr = số chu kỳ máy để thực hiện lệnh * Tmc– Với lệnh NOP, số chu kỳ máy = 1. Vì vậy, Tinstr = 1 * 1.085 =

1.085 micro seconds

Page 20: Chap3 8051 microcontroller – assembly

10/1/2005 20 DCE

6. Các vòng trễ đơn giảnTìm thời gian trễ cho thường trình con

DELAY: mov R3, #200 ; 1 machine cycleHERE: djnz R3, HERE ; 2 machine cyclesRET ; 1 machine cycle

Tính toán– Total machine cycles = 200*2 + 1 + 1 = 402– Time = 402 * 1.085us (giả thiết: 11.0592 MHz clk) =

436.17us

Tương tự, với bất kỳ thời gian trễ nào, đều có thể được xác định bằng các vòng lặp trong lặpVới các bộ trễ lớn hơn, thường sử dụng các bộ định thời.

Page 21: Chap3 8051 microcontroller – assembly

10/1/2005 21 DCE

Chương 3 : Ôn tậpHow does 8051 machine code look ?What are 8051 addressing modes ?What are program control instructions ?Conditional Vs Unconditional branchesSubroutinesWhat is Machine cycle ?How to calculate exact time spent in executing a program ? Or how to write exact time delay loops ?