1. Trang chủ
  2. » Thể loại khác

Chapter3 LapTrinh Assembly PIC18 V2q

38 496 12

Đ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

Chapter3 LapTrinh Assembly PIC18 V2q tài liệu, giáo án, bài giảng , luận văn, luận án, đồ án, bài tập lớn về tất cả các...

Chương 3: lập trình hợp ngữ cho PIC18 CHƯƠNG 3: LẬP TRÌNH HỢP NGỮ CHO PIC18 Mục tiêu chương giúp người đọc có khả năng: giải thích cấu trúc chương trình hợp ngữ; biết sử dụng dẫn hợp dịch để định khối nhớ khai báo số; viết chương trình hợp ngữ cho phép tốn số học vòng lặp chương trình; có khả viết chương trình tạo khoản thời gian trễ cần thiết CẤU TRÚC CHƯƠNG TRÌNH HỢP NGỮ Một chương trình viết hợp ngữ bao gồm chuỗi phát biểu, chương trình hợp ngữ cho PIC18 gồm có loại phát biểu: 3.1  Chỉ dẫn hợp dịch: lệnh hợp dịch mà sử dụng để điều khiển hợp dịch ngõ vào, ngõ liệu Một chương trình hợp ngữ phải kết thúc dẫn END Khi gặp dẫn END chương trình kết thúc  Các lệnh hợp ngữ: lệnh lệnh PIC18, vài lệnh định nghĩa với nhãn PIC18 cho phép sử dụng đến 77 lệnh khác  Các thích: có hai loại thích hợp ngữ Loại sử dụng để giải thích chức lệnh đơn giản hay dẫn đơn giản Loại thứ hai giải thích chức nhóm lệnh dẫn hay toàn thủ tục Mã nguồn trình hợp ngữ viết cách sử dụng trình soạn thảo tập văn ASCII Mỗi dòng tập mã nguồn chứa đựng lên tới vùng: nhãn (label), lệnh gợi nhớ (mnemonic), tốn hạng (operand), thích (comment) Trật tự vùng phải theo trật tự Các nhãn phải cột thứ nhất, vùng gợi nhớ phải bắt đầu cột thứ hai hơn, tốn hạng Các ghi sau tốn hạng, lệnh gợi nhớ hay nhãn bắt đầu cột Độ rộng cột trình hợp ngữ cho phép tối đa 256 ký tự Trình hợp ngữ sử dụng khoảng trắng (hoặc hơn) dấu “:” để tách biệt nhãn vùng gợi nhớ, sử dụng khoảng trắng (hoặc hơn) để tách biệt vùng gợi nhớ với toán hạng Nếu có nhiều tốn hạng, phải sử dụng dấu “,” toán hạng Vùng Nhãn Nhãn phải cột 1, theo sau khoảng trắng, dấu “:” kết thúc dòng Nhãn bắt đầu ký tự chữ dấu “_” chứa đựng chữ số, dấu “_” dấu hỏi Chiều dài nhãn cho phép tối đa 32 ký tự Nếu dấu “:” sử dụng định nghĩa nhãn, xem tốn tử nhãn khơng phải phần nhãn Ví dụ 3.1: lệnh sau chứa nhãn đúng: (a) Loop addwf 0x20,F,A (b) _khoa addlw 0x03 87 Chương 3: lập trình hợp ngữ cho PIC18 (c) Hb?gt andlw 0x7F (d) thuc_hien bsf 0x07, 0x05,A Ví dụ 3.2: lệnh sau chứa nhãn không quy định: (a) label_1 btfsc 0x15, 0x07,B ; Nhãn bắt đầu cột thứ (b) 3htb clrf 0x15, 0x07, B ; Nhãn bắt đầu số (c) Three-four cpfsgt 0x14,A ; Nhãn chứa đựng ký tự không cho phép “-” Vùng lệnh gợi nhớ Vùng thuật nhớ lệnh hợp ngữ thị hợp dịch phải bắt đầu cột thứ hai lớn Ví dụ 3.3: nhận biết vùng gợi nhớ (a) False equ ; equ chi dẫn hợp dịch (b) goto start ; goto lệnh gợi nhớ (c) Loop: incf 0x20,W,A ; incf lệnh gợi nhớ Vùng tốn hạng Nếu có tốn hạng diện phải sau lệnh gợi nhớ Vùng tốn hạng có nhiều toán hạng cho lệnh hay đối số cho dẫn hợp dịch Ví dụ 3.4: dạng toán hạng (a) cpfseg 0x20,A ; “0x20” toán hạng (b) true equ ; “5” toán hạng (c) movff 0x20,0x80 ; “0x20” “0x80” toán hạng Vùng thích Vùng thích thêm vào (khơng bắt buộc phải có) để giải thích cho dễ nhớ dễ hiểu Ví dụ 3.5: cách ghi thích chương trình (a) decf 0x20,F,A ; Thực giảm (b) ; Bắt đầu chương trình Lưu ý: tiếng Việt khơng có dấu, thích sử dụng tiếng Việt nhằm để dễ đọc 3.2 CÁC CHỈ DẪN HỢP DỊCH Các dẫn hợp dịch trơng giống lệnh trình hợp ngữ Hầu hết dẫn hợp dịch thông báo cho trình hợp dịch để làm khác việc tạo mã máy cho lệnh Các dẫn hợp dịch cung cấp cho người lập trình hợp ngữ ý nghĩa để thị cho hợp ngữ cách thức để xử lý lệnh hợp ngữ xảy sau Các dẫn cho phép định nghĩa số không gian dự trữ cho biến thay đổi Trình MPASM cung cấp loại dẫn: dẫn điều khiển, dẫn liệu, dẫn thống kê, dẫn macro dẫn đối tượng 88 Chương 3: lập trình hợp ngữ cho PIC18 Các dẫn điều khiển Các dẫn điều khiển sử dụng liệt kê bảng 3.1 Các dẫn có mối quan hệ sau: if else endif Bảng 3.1: dẫn điều khiển MPASM 3.2.1 Chỉ dẫn Mô tả CODE #DEFINE Bắt đầu đoạn mã thi hành Định nghĩa phần thay nguyên văn ELSE END ENDIF ENDW IF IFDEF IFNDEF #INCLUDE RADIX #UNDEFINE WHILE Bắt đầu khối hợp ngữ chọn điều kiện khác với IF Kết thúc khối chương trình Kết thúc khối điều kiện IF Kết thúc vòng while Bắt đầu khối mã lệnh hợp ngữ có điều kiện Thi hành ký hiệu định nghĩa Thi hành ký hiệu chưa định nghĩa Chứa đựng mã nguồn thêm vào Chỉ rõ số mặc định Huỷ nhãn thay Thực vòng while điều kiện Cú pháp [] code [] #define [] #define [, …, ] else end endif endw if ifdel ifndef #include radix #undefine while Ví dụ 3.6: if bien_x == 100; Kiểm tra bien_x movlw 0x0a movwf io_1,A else movlw 0x1a movlw io_2,A endif [] code [] Đây dẫn tuyên bố bắt đầu phần mã chương trình Nếu nhãn khơng rõ phần ẩn có tên “.code” reset code 0x00 ; khởi tạo nhớ chương trình bắt đầu = goto start ; thực nhảy đến nhãn start #define [] Chỉ dẫn định nghĩa chuỗi thay Bất kể thấy mã hợp ngữ thay #define length 20 #define config 0x17,7,A #define sum3(x,y,z) (x + y + z) 89 Chương 3: lập trình hợp ngữ cho PIC18 test dw bsf sum3(1, length, 200) ; đặt (1+20+200) vị trí config ; đặt bit ghi liệu 0x17 #undefine Chức dẫn để xoá chuỗi thay ifdef Nếu định nghĩa đường dẫn điều kiện chọn Hợp ngữ thực thi gặp dẫn else endif #define test_val ifdef test_val ; đường dẫn thực endif ifndef Nếu nhãn không định nghĩa trước hay bị xố bỏ, mã sau dẫn hợp dịch #define lcd_port ; xác định lcd_port #undefine lcd_port ; xoá lcd_port Ifndef led_port ; thực đoạn mã endif end #include “” Chỉ dẫn chứa đựng tập tin nguồn, tập tin nguồn p18F8720.inc, p18F452.inc, p18F4550, Các tập tin định nghĩa khai báo sẵn phần cứng VĐK Mục đích dẫn để khai báo VĐK cụ thể sử dụng thiết kế #include “p18F8720.inc” #include “p18F452.inc” radix Chỉ dẫn để đặt số mặc định cho biểu thức liệu Cơ số mặc định hex Các giá trị số đúng: hex (thập lục), dee (thập phân), oct (bát phân) while endw 90 Chương 3: lập trình hợp ngữ cho PIC18 Các dòng while endw hợp dịch với độ dài ước lượng Vòng lặp while chứa đựng nhiều 100 dòng lặp lại tối đa 256 lần test_mac macro chk_cnt variable i i=0 while i, …] DB Khai báo liệu kích thước byte [] db [, , …, ] [] db [, < text string >, …] DT Định nghĩa bảng DW Khai báo liệu kích thước word [] dt [, , …, ] [] dt [, < text_string >, …] [] dw [, , …, ] [] dw [, < text_string >, …] endc equ [] fill , [] res set variable [= ][, [= ] …] ENDC EQU FILL RES SET VARIABLE Kết thúc khối tự động Định nghĩa số Điền nhớ Đặt trước nhớ Định nghĩa biến Khai báo biến biểu tượng Bảng 3.3: rõ số MPASM Kiểu Thập phân Thập lục Cú pháp D’’ H’’ 0x Ví dụ D’1000’ H’123E’ 0x20FC 91 Chương 3: lập trình hợp ngữ cho PIC18 Bát phân Nhị phân ASCII 0’’ B’’ ‘’ A’’ 0’246’ B’1001100011’ ‘T’ A’T’ cblock [] [:][,[:]] endc Chỉ dẫn cblock định nghĩa danh sách số đặt tên, nhãn định giá trị lớn giá trị nhãn trước Mục đích dẫn để ấn định khoản địa cho nhiều nhãn giá trị bắt đầu cho tên khối Nếu cblock tập mã nguồn khơng có ấn định giá trị bắt đầu Nếu rõ, nhãn ấn định giá trị lớn nhãn trước cblock 0x50 test1, test2, test3, test4 ; test1 test4 nhận giá trị 0x50 0x53 endc cblock 0x30 twoByteVal: 0, twoByteHi, twoByteLo queue: 40 queuehead, queuetail double1:2, double2:2 endc Các giá trị ấn định cho ký hiệu khối thứ hai: twoByteVal: 0x30 twoByteHi: 0x30 twoByteLo: 0x31 queue: 0x32 queuehead: 0x5A queuetail: 0x5B double1: 0x5C double2: 0x5E const = [ , = ] Chỉ dẫn tạo ký hiệu sử dụng biểu thức MPASM Ví dụ: const chu_ky = D’50’ lấy giá trị 50 sử dụng ký hiệu chu_ky gọi tới [] data [,, ,] [] data “”[,“”] 92 Chương 3: lập trình hợp ngữ cho PIC18 Chỉ dẫn data viết da Chỉ dẫn để khởi tạo word nhiều cho liệu nhớ chương trình Mỗi lưu trữ với độ dài word Các ví dụ sau minh hoạ cách sử dụng dẫn này: data 1,2,3 ; số data “count from 1,2,3” ; chuỗi text data ‘A’ ; ký tự đơn data main ; nhãn xác định lại vị trí [] db < expr >[,< expr >, ,< expr >] Chỉ dẫn để giành word nhớ chương trình với giá trị có độ rộng bit Khi có nhiều biểu thức liên tục điền byte liên tiếp kết thúc biểu thức db ‘b’,0x22, ‘t’,0x1f, ‘s’,0x30 [] de [,< expr >, ,< expr >] Chỉ dẫn để dự trữ word nhớ với liệu bit Mỗi phải ước lượng thành giá trị bit bit cao word Mỗi ký tự chuỗi lưu trữ word riêng biệt Mặc dù thiết kế để khởi tạo liệu EEPROM PIC16C8X, dẫn sử dụng cho vị trí tất xử lý org 0x2000 de “this is my program”, ; xác định vị trí [] dt < expr >[, < expr >, ,< expr >] Đây dẫn phát chuỗi lệnh retlw, lệnh ứng với Mỗi phải mang giá trị bit Mỗi ký tự chuỗi lưu trữ lệnh retlw riêng dt “A new era i comming”, dt 1,2,3,4 [] dw < expr >[, < expr >, ,< expr >] Chỉ dẫn để dự trữ word nhớ chương trình liệu, khởi tạo khơng gian để rõ giá trị Các giá trị lưu trữ vị trí nhớ liên tiếp vị trí gia tăng dw 39, 24, “display data” dw array_cnt-1 < label > equ < expr > Chỉ dẫn equ để định nghĩa số Khi nhãn xuất chỗ chương trình, trình hợp dịch thay true equ false equ four equ 93 Chương 3: lập trình hợp ngữ cho PIC18 [] fill < expr >, Chỉ dẫn rõ giá trị điền vào nhớ Giá trị để điền vào , số word mà giá trị lập lại biểu diễn fill 0x2020, ; điền word có giá trị 0x2020 vào nhớ chương trình [] res MPASM sử dụng trỏ vị trí nhớ để lưu giữ địa cho vị trí nhớ Chỉ dẫn thơng báo vị trí hành cho trỏ buffer res 64 set Trong dẫn này, ấn định giá trị cho biểu thức thị Chỉ dẫn set tương đương chức dẫn equ ngoại trừ giá trị thay đổi dẫn set khác length set 0x20 width set 0x21 area_hi set 0x22 area_lo set 0x23 variable [= ][, [=] ] Chỉ dẫn tạo ký hiệu sử dụng biểu thức MPASM Các biến sử dụng thay cho biểu thức Chỉ dẫn variable tạo ký hiệu mà tương đương chức tạo dẫn set Khác dẫn variable không yêu cầu ký tự khởi tạo chúng cơng nhận 3.2.3 Các dẫn macro Macro tên gán cho hay nhiều phát biểu hợp ngữ Trong chương trình hợp ngữ mà có đoạn chương trình gặp nhiều lần nhiều chỗ, để tránh viết nhiều lần ta đặt tên cho đoạn chương trình Sau muốn thực lại đoạn chương trình ta việc gọi tên chương trình này, chương trình gọi chương trình macro Cấu trúc chương trình macro: macro [, , ] endm Bảng 3.4: dẫn macro Chỉ dẫn ENDM EXITM MACRO EXPAND LOCAL NOEXPAND Mô tả Kết thúc định nghĩa macro Thoát khỏi macro Khai báo định nghĩa macro Mở rộng macro Khai báo biến macro địa phương Tắt mở rộng macro Cú pháp endm exitm [] macro [, …, ] expand local [, ] noexpand Để cầu khẩn macro, phải rõ tên đối số macro, trình hợp dịch chèn chuỗi lệnh dẫn macro endm vào đoạn chương trình 94 Chương 3: lập trình hợp ngữ cho PIC18 Ví dụ 3.7: thực macro tính tổng ba số sum_of_3 macro arg1, arg2, arg3 movf arg1, W, A addwf arg2, W, A addwf arg3, W, A ; tổng cuối chứa WREG endm Nếu muốn cộng nội dung ba ghi địa 0x20, 0x21, 0x22 tổng chứa vào ghi WREG, gọi macro sau: Sum_of_3 0x20, 0x21, 0x22 Exitm Chỉ dẫn ép buộc quay trở tức thời thực chương trình macro Expand Noexpand Chỉ dẫn expand báo cho trình hợp dịch để khai triển macro tập tin liệt kê Ngược lại, dẫn noexpand không cho mở rộng macro tập tin liệt kê, Local [, ] Chỉ dẫn công nhận yếu tố liệu rõ có ảnh hưởng cục (local) macro len equ ; tác dụng toàn cục width equ ; abc macro width local len, label ; len label có tác dụng cục len set width ; điều chỉnh biến len cục label res len ; dự trữ buffer len set len-10 endm ; kết thúc macro 3.2.4 Các dẫn thống kê Các dẫn thống kê sử dụng để điều khiển định dạng tập tin thống kê MPASM Các dẫn liệt kê bảng 3.5 Bảng 3.5: dẫn liệt kê trình hợp dịch MPASM Chỉ dẫn Mô tả Phát thông báo lỗi ERROR ERRORLEVEL Định mức độ lỗi LIST MESSG Các lựa chọn thống kê Tạo thông báo định nghĩa người dùng Cú pháp error “” errorlevel {0| 1| + | } [, …] list [, …, ] messg “” 95 Chương 3: lập trình hợp ngữ cho PIC18 Tắt lựa chọn LIST Chèn vào phóng trang thống kê Chèn dòng thống kê trống Định tiêu đề phụ chương trình Định tiêu đề chương trình NOLIST PAGE SPACE SUBTITLE TITLE nolist page space subtitle “” title “” error “” Chỉ dẫn để in thông báo lỗi Thông báo lỗi xuất tập tin liệt kê Độ dài từ đến 80 ký tự errorlevel {0|1|2 + | -}[, ] Chỉ dẫn đặt kiểu thông báo mà in tập tin thống kê tập tin thông báo lỗi Ý nghĩa thông số xem bảng 3.6 Bảng 3.6: ý nghĩa thông số dẫn ERRORLEVEL Tác động Thiết lập - +< msgnum> Các thông báo, cảnh báo lỗi in Các cảnh báo lỗi in Các lỗi in Cấm in thông báo Cho phép in thơng báo Ví dụ, errorlevel 1, -202 cho phép cảnh báo lỗi in ngăn cấm in thông báo số 202 list [, , ] nolist Chỉ dẫn list có ảnh hưởng để mở ngõ thống kê trước bị tắt Chỉ dẫn cung cấp lựa chọn bẳng 3.7 để điều khiển xử lý hợp ngữ hay định dạng tập tin thống kê Chỉ dẫn nolist đơn giản để tắt ngõ tập tin thống kê Bảng 3.7: liệt kê phụ chọn dẫn Chỉ dẫn b = nnn c = nnn f = free fixed mm = {ON | OFF} n = nnn p = r = st = {ON | OFF} t = {ON | OFF} w = {ON | OFF} x = {ON | OFF} 96 Mặc định 132 INHX8M Fixed Fixed ON 60 None Hex ON OFF ON Giải thích Đặt số số khoảng trắng nhảy Định độ rộng cột Định ngõ tập tin dạng hex, INHX32, INHX8M hay INHX8S Sử dụng cú pháp có định dạng tự Dùng trang định dạng cố định In đồ nhớ tập tin thống kê Định số dòng trang Định kiểu xử lý Ví dụ PIC18F4550 Đặt số mặc định hex, dec, oct In bảng ký hiệu tập tin thống kê Cắt xén bớt số dòng thống kê Đặt mức độ thơng báo (xem ERRORLEVEL) Mở tắt mở rộng macro Chương 3: lập trình hợp ngữ cho PIC18 nop end ; lệnh khơng làm CÁC VỊNG CHƯƠNG TRÌNH Vòng chương trình thi hành với số lần hữu hạn bất tận 3.5.1 Xây dựng vòng chương trình Có phương pháp lập vòng chính: (1) Thực phát biểu S vơ tận Đây vòng lặp vơ tận, phát biểu S vòng thi hành mãi Để khỏi vòng, người sử dụng thêm phát biểu “if C then exit” Hình 3.5 mơ tả vòng vơ tận 3.5 Hình 3.5: vòng vơ tận Trong vòng vơ tận đòi hỏi sử dụng “goto target” hay “bra target” lệnh cuối vòng cho PIC18, với target nhãn để bắt đầu thực thi vòng (2) For i = n1 to n2 S for i = n2 downto n1 S Trong vòng lặp for, i biến đếm số lần lặp lại với hai giới hạn n1 n2, S phát biểu để thi hành Trường hợp thứ nhất, n1 > n2 Đầu tiên thực i = n1, sau thực tăng i = n1 + 1, thực i = n2 vòng lặp for, phát biểu S thi hành n2 – n1 + lần Trường hợp thứ hai, n2 < n1 quy trình thực ngược lại Hình 3.6: xây dựng vòng lặp for 110 Chương 3: lập trình hợp ngữ cho PIC18 (3) While C S Điều kiện C kiểm tra để bắt đầu thực vòng Nếu C phát biểu S thi hành, ngược lại khơng thi hành S Hình 3.7: xây dựng vòng lặp while (4) Repeat S until C Đầu tiên phát biểu thi hành, sau so điều kiện C Nếu C phát S thi hành trở lại Ngược lại, S không thi hành kết thúc vòng 3.5.2 Hình 3.8: xây dựng vòng lặp repeat until Thay đổi đếm chương trình Dòng chảy chương trình thơng thường dòng mà CPU thi hành chuỗi lệnh địa thấp đến địa cao Sự thi hành vòng chương trình đòi hỏi khả thay đổi hướng chuyển động chương trình PIC18 cung cấp nhóm lệnh (xem bảng 3.9) mà thay đổi dòng chảy chương trình bình thường Để biết dòng chảy chương trình đâu CPU phải nhờ phận để giám sát, phận gọi đếm chương trình Trong dòng chảy chương trình bình thường, giá trị đếm chương trình gia tăng lần hay (2 tương ứng với lệnh 16-bit, tương ứng với lệnh 32-bit) Đối với PIC18 có đếm chương trình với độ rộng 21 bit Byte thấp gọi ghi PCL; Byte cao ghi PCH Thanh ghi chứa đựng bit theo thứ tự PC đọc ghi trực tiếp Cập nhật ghi PCH phải thực thơng qua ghi PCLATH; Byte cao gọi ghi PCU Thanh ghi chứa đựng bit theo thứ tự PC đọc ghi trực tiếp Cập nhật ghi PCU thông qua ghi PCLATU 111 Chương 3: lập trình hợp ngữ cho PIC18 Bảng 3.9: lệnh PIC18 làm thay đổi lưu trình Lệnh, tốn hạng BC n BN n BNC n BNN n BNOV n BNZ n BOV n BRA n BZ n CALL n, s Rẽ nhánh nhớ Rẽ nhánh âm Rẽ nhánh không nhớ Rẽ nhánh không âm Rẽ nhánh không tràn Rẽ nhánh khác Rẽ nhánh tràn Rẽ nhánh không điều kiện Rẽ nhánh Gọi thủ tục GOTO n Nhảy tới địa quy định RCALL n RETLW k RETURN s Gọi có quan hệ Trả lại giá trị WREG Trở từ thủ tục Mô tả Từ lệnh 16-bit 1110 0010 1110 0110 1110 0011 1110 0111 1110 0101 1110 0001 1110 0100 1110 0nnn 1110 0000 1110 110s 1111 kkkk 1110 1111 1111 kkkk 1101 1nnn 0000 1100 0000 0000 nnnn nnnn nnnn nnnn nnnn nnnn nnnn nnnn nnnn nnnn nnnn nnnn nnnn nnnn nnnn nnnn nnnn nnnn kkkk kkkk kkkk kkkk kkkk kkkk kkkk kkkk nnnn nnnn kkkk kkkk 0001 001s Trạng thái bị ảnh hưởng Không Không Không Không Không Không Không Không Không Không Khơng Khơng Khơng Khơng Hình 3.9: cấu trúc đếm chương trình PIC18 Byte thấp ghi PC ánh xạ vào nhớ liệu PCL đọc ghi ghi liệu PCU PCH byte cao byte cao PC PCLATU PCLATH sử dụng để chốt cho PCU PCH ánh xạ vào nhớ liệu Bất kỳ thời điểm PCL đọc, nội dung PCH PCU truyền tới PCLATH PCLATU tương ứng Thời điểm PCL ghi vào, nội dung PCLATH PCLATU truyền tới PCH PCU tương ứng hình 3.10 Hình 3.10: hoạt động PCL ghi vào 112 Chương 3: lập trình hợp ngữ cho PIC18 Số byte địa PC lớn word nhớ chương trình PIC18 phải truy xuất lệnh nhớ chương trình theo độ gia tăng số byte chẵn Bit LSB ghi PC có giá trị nhỏ 0, ghi PC gia tăng lần đơn vị cho lệnh thực Bit LSB PCL đọc khơng cho phép ghi Các vòng hữu hạn thường yêu cầu lệnh rẽ nhánh có điều kiện PIC18 tạo nhánh thuận ngược Khi lệnh rẽ nhánh thi hành, giá trị có dấu 8-bit kẹp lệnh rẽ nhánh cộng thêm vào PC hành Khi giá trị âm, rẽ nhánh thuận Ngược lại, rẽ nhánh ngược Khoảng cách rẽ nhánh (theo số đơn vị word) đo lường từ byte sau lệnh rẽ nhánh hình 3.11 Hình 3.11: mơ tả khoản rẽ nhánh hướng rẽ nhánh PIC18 tạo độ xác rẽ nhánh nhờ cờ điều kiện ghi trạng thái STATUS Việc sử dụng lệnh rẽ nhánh có điều kiện điểm tham chiếu, lệnh bn -10 thực rẽ nhánh lùi khoản word cờ N đặt 1, lệnh bn 10 thực rẽ nhánh tăng lên khoản 11 word cờ C đặt Thường, việc đếm số từ rẽ nhánh tất tiện Vì thế, hầu hết trình hợp dịch cho phép người lập trình sử dụng nhãn để thích vị trí nhảy tới thay cho việc tính khoản rẽ nhánh Ví dụ, cách viết thực nhảy lùi từ sau: back_9 bn back_9 Hai lệnh sau thường sử dụng để tăng giảm đếm vòng phải cập nhật cờ điều kiện: incf f, d, a ; tăng ghi f decf f, d, a ; giảm ghi f PIC18 sử dụng lệnh goto để thực nhảy Phương pháp đòi hỏi sử dụng thêm lệnh hỗ trợ khác để so sánh, thực giảm, tăng kiểm tra bit để chọn điều kiện định rẽ nhánh Các lệnh hỗ trợ liệt kê bảng 3.10 Bảng 3.10: lệnh hỗ trợ cho điều kiện rẽ nhánh Lệnh, tốn hạng Mơ tả Từ lệnh 16-bit Trạng thái bị ảnh hưởng 113 Chương 3: lập trình hợp ngữ cho PIC18 CPFSEQ f, a CPFSGT f, a CPFSLT f, a DECFSZ f, d, a DECFNZ f, d, a INCFSZ f, d, a INFSNZ f, d, a TSTFSZ f, a BTFSC f, b, a BTFSS f, b, a goto n So sánh ghi f với WREG, bỏ qua So sánh ghi f với WREG, bỏ qua lớn So sánh ghi f với WREG, bỏ qua nhỏ Giảm ghi f, bỏ qua Giảm ghi f, bỏ qua khác Tăng ghi f, bỏ qua Tăng ghi f, bỏ qua khác Kiểm tra f, bỏ qua Bit kiểm tra f, bỏ qua Bit kiểm tra f, bỏ qua Nhảy tới địa n ( words) 0110 001a ffff ffff Không 0110 010a ffff ffff Không 0110 000a ffff ffff Không 0010 11da ffff ffff 0100 11da ffff ffff 0011 11da ffff ffff 0100 10da ffff ffff 0110 011a ffff ffff 1011 bbba ffff ffff 1010 bbba ffff ffff 1110 1111 kkkk kkkk 1111 kkkk kkkk kkkk Khơng Khơng Khơng Khơng Khơng Khơng Khơng Khơng Ví dụ 3.17: viết chương trình thực nhảy với cpfseq loop_1 ; i_cnt tăng vòng cpfseq i_cnt, A ; so sánh i_cnt với WREG, bỏ qua chúng ; goto loop_1 ; nhảy đến nhãn loop_1 i_cnt  WREG Ví dụ 3.18: viết chương trình thực nhảy với decfsz n equ 20 ; n = 20 lp_cnt set 0x10 ; gán ghi file 0x10 thành lp_cnt movlw n movwf lp_cnt ; chuẩn bị để lạup vòng n lần loop_2 ; vòng chương trình ; // decfsz lp_cnt, F, A ; giảm lp_cnt, bỏ qua goto loop_2 ; nhảy đến nhãn loop_2 lp_cnt  Ví dụ 3.19: viết chương trình thực tính + + + + n lưu tổng vào 0x00 0x01, giá trị n giới hạn cho tổng lưu trữ hai byte Giải pháp: lưu đồ thực hình 3.12 114 Chương 3: lập trình hợp ngữ cho PIC18 Hình 3.12: lưu đồ thuật tốn ví dụ 3.19 Chương trình hợp ngữ: #include n equ D’50’ sum_hi set 0x01 ; byte cao tổng sum_lo set 0x00 ; byte thấp tổng i set 0x02 ; số đếm vòng org 0x00 goto start org 0x08 retfie org 0x18 retfie start clrf sum_hi, A ; khởi tạo tổng = clrf sum_lo, A ; // clrf i, A ; khởi tạo i = incf i, F, A ; bắt đầu i = sum_lp movlw n ; đưa n vào WREG cpfsgt i, A ; so i với n, bỏ qua i > n bra add_lp ; thực đến i ≤ 50 bra exit_sum ; thực i > 50 add_lp movf i, W, A ; cất i vào WREG addwf sum_lo, F, A ; thêm i vào sum_lo movlw addwfc sum_hi, F, A ;cộng carry vào sum_hi incf i, F, A ; tăng số vòng lên 115 Chương 3: lập trình hợp ngữ cho PIC18 exit_sum bra nop end sum_lp ĐỌC VÀ GHI DỮ LIỆU VÀO BỘ NHỚ CHƯƠNG TRÌNH Đối với PIC18, có nhớ chương trình 16-bit, nhớ liệu 8-bit Thực tế để đọc ghi chương trình nhớ, PIC18 cung cấp hai lệnh cho phép xử lý di chuyển byte nhớ chương trình liệu TBLRD TBLWT Vì khơng thích hợp cỡ bus nhớ chương trình liệu, PIC18 di chuyển liệu hai không gian nhớ thơng qua ghi 8-bit TABLAT Hình 3.13 mơ tả hoạt động đọc bảng với nhớ chương trình liệu 3.6 Hình 3.13: hoạt động đọc bảng Các hoạt động ghi bảng lưu liệu từ không gian nhớ liệu vào ghi lưu giữ nhớ chương trình Hình 3.14 mơ tả hoạt động ghi bảng với nhớ chương trình liệu Hình 3.14: hoạt động ghi bảng Bộ nhớ chương trình PIC EPROM nhớ flash Hoạt động xoá phải thi hành trước vị trí nhớ EPROM hay flash lập trình xác Các hoạt động xố ghi cho EPROM nhớ flash nhiều thời gian so với SRAM Bảng 3.11 có lệnh cung cấp lệnh đọc/ghi bảng nhớ chương trình Bảng 3.11: lệnh đọc ghi bảng PIC18 Lệnh, toán tử TBLRD* 116 Mô tả Đọc bảng Từ lệnh 16-bit 0000 0000 0000 1000 Trạng thái bị ảnh hưởng Không Chương 3: lập trình hợp ngữ cho PIC18 TbLRD*+ TBLRD*TBLRD+* TBLWT* TBLWT*+ TBLWT*TBLWT+* Đọc bảng với tăng vị trí Đọc bảng với giảm vị trí Đọc bảng với độ gia tăng định trước Ghi bảng Ghi bảng với tăng vị trí Ghi bảng với giảm vị trí Ghi bảng với độ gia tăng định trước 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1001 0000 1010 0000 1011 0000 1100 0000 1101 0000 1110 0000 1111 Không Không Không Không Không Không Không Con trỏ bảng (TBLPTR) định địa byte bên nhớ chương trình TBLPTR chứa ba ghi chức đặc biệt (gồm byte thấp, byte cao byte cao trỏ bảng) hình thành trỏ có độ rộng 22-bit 21 bit thấp cho phép định địa lên tới MB cho không gian nhớ chương trình Bit thứ 22 cho phép truy xuất đọc tới ID thiết bị, ID người sử dụng bit cấu hình Ví dụ 3.20: viết chương trình thực đọc byte nhớ chương trình vị trí 0x60 vào TABLAT Giải pháp: để đọc byte nhớ chương trình cài đặt trỏ bảng clrf TBLPTRU, A ; clrf TPLPTRH, A ; movlw 0x60 ; movwf TBLPTRL, A ; tblrd* ; đọc bảng 3.7 CÁC LỆNH LOGIC PIC18 cung cấp nhóm lệnh logic bảng 3.12 Các lệnh cho phép người sử dụng để thiết lập AND, OR, Ex-OR số 8-bit Bảng 3.12: lệnh logic PIC18 Lệnh, toán tử ANDWF f, d, a COMF f, d, a IORW f, d, a NEGF f, a XORWF f, d, a ANDLW k IOLW k XORLW k Mô tả Thực AND WREG với f Bù ghi ghi f Thực OR WREG với f Phủ định f Thực XOR WREG với f Thực AND k với WREG Thực OR k với WREG Thực XOR k với WREG Từ lệnh 16-bit 0001 01da ffff ffff 0001 11da ffff ffff 0001 00da ffff ffff 0110 110a ffff ffff 0001 10da ffff ffff 0000 1011 kkkk kkkk 0000 1001 kkkk kkkk 0000 1010 kkkk kkkk Trạng thái bị ảnh hưởng Z, N Z, N Z, N Tất Z, N Z, N Z, N Z, N 117 Chương 3: lập trình hợp ngữ cho PIC18 Hình 3.15: lưu đồ ví dụ 3.21 Ví dụ 3.21: viết chuỗi lệnh để thực hiện: (a) Đặt bit 7, ghi PORTA lên mức cao (b) Xoá bit 4, ghi PORTB (c) Đảo bit 7, 5, ghi PORTC Giải pháp: (a) movlw B’11000001’ iorwf PORTA, F, A (b) movlw B’11101001’ andwf PORTB, F, A (c) movlw B’10101010’ xorwf PORTC 3.8 TẠO THỜI GIAN TRỄ Cách làm trễ thời gian (time delay) thực đơn giản cách lặp lại chuỗi lệnh thích hợp với số lần lặp tương thích Ví dụ 3.22: viết chương trình thực tạo delay 0.5 ms Vòng chương trình ứng dụng chạy board PIC 18F8680 sử dụng dao động thạch anh 40 MHz Giải pháp: chu kỳ lệnh gồm chu kỳ dao động, chu kỳ lệnh tương ứng 100 ns Chuỗi lệnh sau thực µs: Loop_cnt equ 0x00 Again nop ; nop = no operation: khơng làm 118 Chương 3: lập trình hợp ngữ cho PIC18 nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop dcfsnz loop_cnt, F, A ; giảm nhảy qua lệnh kế bra again Chuỗi lệnh viết ngắn gọn cách sử dụng macro sau: delay_t macro kk ; macro lệnh nop variable i ; kk lần i=0 while i < kk nop i+ = endw endm Lệnh nop dcsnz thực chu kỳ, lệnh bra again sử dụng chu kỳ lệnh Như vậy, chuỗi lệnh chương trình thực cần 20 chu kỳ lệnh, tương ứng µs Để cần delay 0.5 ms cần thực chuỗi lệnh 250 lần Chương trình hồn chỉnh để tạo delay 0.5 ms sau: movlw D’250’ ; giá trị 250 lần movwf loop_cnt, A again delay_t D’17’ ; 17 chu kỳ lệnh decfsz loop_cnt,F,A ; chu kỳ lệnh (2 [loop_cnt]=0) bra again 119 Chương 3: lập trình hợp ngữ cho PIC18 3.9 CÁC LỆNH XOAY PIC18 hỗ trợ lệnh xoay bảng 3.13 Các lệnh xoay sử dụng để thao tác vùng bit để thực nhân chia số cho luỹ thừa Bảng 3.13: lệnh xoay Lệnh, toán hạng RLCF f, d, a RLCF f, d, a RLCF f, d, a RLCF f, d, a Mô tả Xoay trái ghi f qua cờ nhớ Xoay trái f ( không qua cờ nhớ) Xoay phải ghi f qua cờ nhớ Xoay phải f (không qua cờ nhớ) Từ lệnh 16-bit 0011 01da 0100 01da 0011 00da 0100 00da ffff ffff ffff ffff ffff ffff ffff ffff Trạng thái bị ảnh hưởng C, Z, N Z, N C, Z, N Z, N Cách thực lệnh xoay trái rlcf f,d,a minh hoạ hình 3.16 Kết lệnh cất vào ghi WREG (d = 0) hay ghi f định (d = 1) Hình 3.16: mơ tả hướng dịch chuyển bit lệnh rlcf f,d,a Cách thực lệnh xoay trái rlncf f,d,a minh hoạ hình 3.17 Kết lệnh cất vào ghi WREG (d = 0) hay ghi f định (d = 1) Hình 3.17: mơ tả hướng dịch chuyển bit lệnh rlncf f,d,a Cách thực lệnh xoay phải rrcf f,d,a minh hoạ hình 3.18 Kết lệnh cất vào ghi WREG (d = 0) hay ghi f định (d = 1) Hình 3.18: mơ tả hướng dịch chuyển bit lệnh rrcf f,d,a Cách thực lệnh xoay phải rrncf f,d,a minh hoạ hình 3.19 Kết lệnh cất vào ghi WREG (d = 0) hay ghi f định (d = 1) Hình 3.19: mơ tả hướng dịch chuyển bit lệnh rrncf f,d,a Ví dụ 3.23: tính giá trị ghi liệu 0x10 cờ C sau thi hành lệnh rlcf 0x10,F,A Giả sử giá trị ban đầu nhớ liệu 0x10 0xA9 cờ C Giải pháp: hoạt động lệnh biểu diễn hình 3.20 120 Chương 3: lập trình hợp ngữ cho PIC18 Hình 3.20: thực ví dụ 3.23 Ví dụ 3.24: tính giá trị ghi liệu 0x10 cờ C sau thi hành lệnh rrcf 0x10,F,A Giả sử giá trị ban đầu nhớ liệu 0x10 0xC7 cờ C Giải pháp: hoạt động lệnh biểu diễn hình 3.20 Hình 3.20: thực ví dụ 3.24 Ứng dụng lệnh xoay để thực nhân chia Cách thức nhân cho luỹ thừa thực cách dịch tốn hạng qua trái số vị trí hợp lý Ngược lại, chia cho luỹ thừa dịch chuyển tốn hạng sang phải số vị trí hợp lý Tuy nhiên, PIC lại khơng hỗ trợ lệnh để dịch, việc dịch phải thực cách sử dụng lệnh xoay qua cờ carry Lưu ý, cờ carry phải xoá trước lệnh xoay thi hành Bảng 3.14 cung cấp lệnh để thao tác bit riêng lẻ cho ghi, vùng b để vị trí bit có tác dụng Bảng 3.14: lệnh thao tác bit Lệnh, toán hạng BCF f, b, a BSF f, b, a BTG f, b, a Mơ tả Bit xố ghi f Bit đặt ghi f Bit đảo ghi f Từ lệnh 16-bit 1001 bbba ffff ffff 1000 bbba ffff ffff 0111 bbba ffff ffff Trạng thái bị ảnh hưởng Khơng có Khơng có Khơng có Ví dụ 3.25: viết chuỗi lệnh để nhân số có byte lưu từ 0x00 đến 0x02 cho Giải pháp: thực nhân cho thực cách dịch trái ba vị trí Cách thức dịch trái thực từ byte nhỏ đến byte cao Chuỗi chương trình thực sau: movlw 0x03 ; nạp giá trị 0x03 loop bcf STATUS,C,A; xoá cờ C rlcf 0x00, F, A ; dịch trái vị trí rlcf 0x01, F, A rlcf 0x02, F, A decfsz WREG,W,A ; kiểm tra dịch trái đủ lần? goto loop Ví dụ 3.26: viết chuỗi lệnh để chia số có byte lưu từ 0x10 đến 0x12 cho 16 Giải pháp: thực chia cho 16 thực cách dịch phải bốn vị trí Cách thức dịch phải thực từ byte cao đến byte nhỏ Chuỗi chương trình thực sau: 121 Chương 3: lập trình hợp ngữ cho PIC18 loop movlw bcf rrcf rrcf rrcf decfsz goto 0x04 ; nạp giá trị 0x04 STATUS,C,A; xoá cờ C 0x12, F, A ; dịch phải vị trí 0x11, F, A 0x10, F, A WREG,W,A ; kiểm tra dịch phải đủ lần? loop 3.10 BÀI TẬP 1) Tìm nhãn sai lệnh sau giải thích nguyên nhân sai Cột  a sum_hi equ 0x20 b low_t incf WREG, W, A ; increment WREG by c abc: movwf 0x30, A d 5plus5 clrf 0x33, A e _ok decf 0x35, F, A f ?yes iorw 0x1A, F, A g One_two goto yes 2) Dùng dẫn hợp dịch để định nghĩa bảng cho tất chữ in hoa Đặt bảng vào nhớ chương trình địa 0x2000, với byte cho ký tự 3) Viết chuỗi lệnh để giảm giá trị vị trí nhớ liệu 0x10, 0x11, 0x12 có sẵn giá trị tương ứng 7, 12, 4) Làm lại tập (3) tăng giá trị lên 5) Viết chuỗi lệnh để cộng số 3-byte lưu vị trí nhớ 0x11-0x13 0x140x16 Sau đó, cất tổng vào địa nhớ 0x20-0x22 6) Viết chuỗi lệnh để thực trừ số 4-byte địa nhớ 0x11-0x13 tử số lưu 0x00-0x03 Sau đó, cất hiệu vào địa nhớ 0x20-0x23 7) Viết chuỗi lệnh để dịch số 4-byte lưu địa nhớ 0x20-0x23 sang phải bốn vị trí lưu kết vào địa tương tự 8) Thực lại tập (7) với dịch trái 9) Viết chuỗi lệnh để nhân hai số không dấu 24-bit lưu địa nhớ liệu 0x10-0x12 0x13-0x15 Sau đó, cất tích vào địa nhớ liệu 0x20-0x25 10) Viết chương trình để tính trung bình mảng có 32 số nguyên 8-bit lưu nhớ chương trình Lưu kết vào ghi WREG 11) Viết chuỗi lệnh để trích bit từ bit6-bit2 WREG lưu giá trị kết vào vị trí bit thấp ghi liệu 0x10 12) Viết chuỗi lệnh để tạo delay s 122 Chương 3: lập trình hợp ngữ cho PIC18 13) Viết chuỗi lệnh để tạo delay 250 ms 14) Viết chương trình để đếm số phần tử lẻ mảng có 15 số nguyên 8-bit Mảng lưu nhớ chương trình nhãn array_1 15) Viết chương trình cho PIC18 để đếm số phần tử mảng có giá trị lớn 18, biết mảng chứa đựng n số 8-bit lưu nhớ chương trình nhãn array_2 16) Viết chương trình hợp ngữ để tìm phần tử nhỏ mảng chứa n phần tử 8-bit Mảng lưu nhớ chương trình nhãn array_3 17) Xác định số lần vòng sau thi hành: #include movlw 0x80 Loop bcf STATUS, C, A ; clear the carry flag rrcf WREG, W, A addwf WREG, W, A ; add WREG to itself btfsc WREG, 7, A ; test bit goto Loop … 18) Cho biết giá trị bit carry sau thi hành lệnh sau? Giả sử WREG chứa giá trị 0x19 ban đầu bit C = a addlw 0x30 b addlw 0xA4 c sublw 0x95 d sublw 0x40 19) Giả sử WREG chứa giá trị 0x95 ban đầu bit C = Xác định giá trị WREG bit C sau thực lệnh sau: a rrcf WREG, W, A b rrncf WREG, W, A c rlcf WREG, W, A d rlncf WREG, W, A 20) Viết chuỗi lệnh để thực giao hoán nible số 8-bit chứa địa nhớ 0x10 Kết cất vào ghi WREG 123 Chương 3: lập trình hợp ngữ cho PIC18 124 ... BCD PIC18 thực toàn số học dạng nhị phân Chuỗi lệnh sau cho biết PIC18 thực cộng hai số thập phân 31 47 lưu tổng vào vị trí nhớ 0x50: movlw 0x31 addlw 0x47 movwf 0x50, A Tuy nhiên, vấn đề xảy PIC18. .. hợp ngữ cho PIC18 exit_sum bra nop end sum_lp ĐỌC VÀ GHI DỮ LIỆU VÀO BỘ NHỚ CHƯƠNG TRÌNH Đối với PIC18, có nhớ chương trình 16-bit, nhớ liệu 8-bit Thực tế để đọc ghi chương trình nhớ, PIC18 cung... 0x22 end 3.4.2 Thực phép toán trừ PIC18 có hai lệnh trừ hai tốn hạng hai phép trừ ba toán hạng Các lệnh trừ tác động đến bit cờ ghi STATUS Tương tự VĐK khác, PIC18 thi hành lệnh trừ cách thực

Ngày đăng: 21/12/2017, 12:18

Xem thêm:

TỪ KHÓA LIÊN QUAN