Bài giảng Vi điều khiển - Chương 3: Ngôn ngữ lập trình Assembly cho vi điều khiển 8051

pdf 21 trang phuongnguyen 3760
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Vi điều khiển - Chương 3: Ngôn ngữ lập trình Assembly cho vi điều khiển 8051", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_vi_dieu_khien_chuong_3_ngon_ngu_lap_trinh_assembly.pdf

Nội dung text: Bài giảng Vi điều khiển - Chương 3: Ngôn ngữ lập trình Assembly cho vi điều khiển 8051

  1. Ngôn ngữ lập trình Assembly cho vi điều khiển 8051 Microcontroller Chapter 3 Ngo Nhu Khoa Department of Computer Engineering DCE ThaiNguyen University of Technology
  2. Các vấn đề z Mã máy - Machine code z Các chế độ địa chỉ của 8051 z Các lệnh Jump, Loop và Call z Thường trình con - Subroutines z Các vòng trễ đơn giản 10/1/2005 2 DCE
  3. 1. Mã đối tượng của 8051 z Assembler chuyển đổi mã lệnh assembly thành mã máy/đối tượng z Sự 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 ! z Mã đối tượng là 1 chuỗi các lệnh máy z Mỗi lệnh máy có thể có độ dài 1 byte hoặc nhiều hơn z Các lệnh máy là 1 giá trị nhị phân và được viết ở hệ 16 10/1/2005 3 DCE
  4. 1. Mã đối tượng của 8051 ( ) z Assemblers tạo ra 1 file .lst trong quá trình dịch. z Instruction to m/c code translation on a line by line basis is listed Instruction Hex code #bytes nop 00 1 inc R0 08 1 mov A, #55H 74 55 2 mov R0, #0AAH 78 AA 2 mov R0, 0AAH A8 AA 2 mov DPTR, #55AAH 90 55 AA 3 10/1/2005 4 DCE
  5. 1. Mã đối tượng của 8051 ( ) Hex Assembly Address Value 0000: .equ cout, 0x0030 8000 79 8001 61 0000: .equ cin, 0x0032 8002 78 0000: .equ esc, 0x004E 8003 1A 8000: .org 0x8000 8004 E9 8005 12 8000: 79 61 mov r1, #'a' 8006 00 8002: 78 1A mov r0, #26 8007 30 next_char: 8008 09 8009 D8 8004: E9 mov A, r1 800A F9 8005: 12 00 30 lcall cout 800B 12 8008: 09 inc r1 800C 00 800D 32 8009: D8 F9 djnz r0, next_char 800E 02 800B: 12 00 32 lcall cin 800F 00 800E: 02 00 00 ljmp 0x0000 8010 00 10/1/2005 5 DCE
  6. 2. Các chế độ địa chỉ của 8051 z CPU 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 z 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 10/1/2005 6 DCE
  7. 2.1. Chế độ địa chỉ tức thì z Toán hạng (dữ liệu) được chỉ định trực tiếp trong lệnh (mã lệnh) z Toán hạng là 1 hằng, được biết trong thời gian dịch z Dữ liệu tức thì phảicó tiền tố là dấu “#” z Ví dụ: mov A, #25H ;A ← #0x25 mov DPTR, #1FFFH ;DPTR ← #0x1FFF temp EQU 40 ;assembler directive mov R1, #temp ;R1 ← 28H (40 decimal) 10/1/2005 7 DCE
  8. 2.2. Chế độ địa chỉ thanh ghi z Yêu cầu phải sử dụng các thanh ghi để lưu giữ dữ liệu z Đặ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) z Các thanh ghi nguồn và đích phải cùng kích thước z Cá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 10/1/2005 8 DCE
  9. 2.3. Chế độ địa chỉ trực tiếp z Đố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. z 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) z Chế độ địa chỉ thanh ghi tương tự như chế độ địa chỉ trực tiếp mov A, 4H ; 4H is the address for R4 mov A, R4 ; tương tự như trên. Cả 2 lệnh đều như nhau ;nhưng có thể có mã khác nhau z Ngăn xếp trong 8051 chỉ sử dụng chế độ địa chỉ trực tiếp 10/1/2005 9 DCE
  10. 2.4. Chế độ gián tiếp thanh ghi z 1 thanh ghi được sử dụng như 1 con trỏ – Thanh ghi lưu giữ địa chỉ của dữ liệu z Chỉ có các thanh ghi R0, R1 và DPTR có thể được sử dụng cho mục đích này trong 8051 z R0 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] z 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 10/1/2005 10 DCE
  11. 2.5. Chế độ địa chỉ chỉ số z 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 z Đị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 + A movc A, @A+PC ;A ← ext_code_mem [(A + PC)] z Đượ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) 10/1/2005 11 DCE
  12. 2.5. Ví dụ z Chương trình đọc vào 1 giá trị x từ P1 và đưa ra x2 ở P2 ORG 0 ; assembler directive mov DPTR, #LUT ; 300H is the LUT address mov A, #0FFH mov P1, A ; program the port P1 to input data Again: mov A, P1 ; read x movc A, @A+DPTR ; get x2 from LUT mov P2, A ; output x2 to P2 sjmp again ; for (1) loop ORG 300H ;Look-up Table starts at 0x0300 LUT: DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 10/1/2005 12 DCE
  13. 3. Các lệnh điều khiển chương trình z Rẽ 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 z 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 z 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) 10/1/2005 13 DCE
  14. 3.1. Địa chỉ đích z Địa chỉ đích có thể là: – Tuyệt đối: Một giá trị địa chỉ vật lý z addr16: địa chỉ 16 bit, ở vị trí bất kỳ trong không gian 64k z addr11: đị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 z Đị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ớ z PC = 15H, SJMP 0FEH z Địa chỉ là 15H + FEH = 13H z Nhảy đến vị trí lệnh kế tiếp -2byte (lệnh hiện thời) 10/1/2005 14 DCE
  15. 3.2. Nhảy có điều kiện z jz, 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 z djnz : giảm đi 1 và nhảy nếu không bằng 0 – djnz Rn, rel – djnz direct, rel z jnc : Điều kiện được xác lập trên cờ nhớ CY – jc rel – jnc rel z 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 10/1/2005 15 DCE
  16. 3.2. Nhảy có điều kiện ( ) z Add 3 to A ten times mov A, #0 ; clear A mov R2, #10 ; R2 ← 10, can also say 0AH AGAIN: add A, #03 ; add 3 to A djnz R2, AGAIN ; repeat until R2==0 mov R5, A ; save the result in R5 z Loop within loop using djnz mov R3, #100 loop1: mov R2, #10 ; trying for 1000 loop iterations loop2: nop ; no operation djnz R2, loop2 ; repeat loop2 until R2==0 djnz R3, loop1 ; repeat loop1 until R3==0 10/1/2005 16 DCE
  17. 3.3. Nhảy không điều kiện z LJMP addr16 – Long jump. Nhảy đến 1 địa chỉ đích 2 byte – Lệnh có độ dài 3 byte z 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) 10/1/2005 17 DCE
  18. 4. Các lệnh gọi thường trình z Thường trình con: – Những đoạn chương trình có thể dùng lại được z 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 z 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 z RET – Trở về từ 1 thương trình con – Phục hồi lại PC từ ngăn xếp - pop PC 10/1/2005 18 DCE
  19. 5. Chu kỳ máy z Là số các chu kỳ đồng hồ được sử dụng để thực hiện 1 lệnh z Có giá trị khác nhau, phụ thuộc lệnh. Lệnh ngắn nhất là 1 chu kỳ máy z Vớ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ệnh z Thờ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, z Tmc = 12 / 11.0592M = 1.085 micro seconds z Thờ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 10/1/2005 19 DCE
  20. 6. Các vòng trễ đơn giản z Tìm thời gian trễ cho thường trình con DELAY: mov R3, #200 ; 1 machine cycle HERE: djnz R3, HERE ; 2 machine cycles RET ; 1 machine cycle z 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 z 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ặp z Với các bộ trễ lớn hơn, thường sử dụng các bộ định thời. 10/1/2005 20 DCE
  21. Chương 3 : Ôn tập z How does 8051 machine code look ? z What are 8051 addressing modes ? z What are program control instructions ? z Conditional Vs Unconditional branches z Subroutines z What is Machine cycle ? z How to calculate exact time spent in executing a program ? Or how to write exact time delay loops ? 10/1/2005 21 DCE