Về tập lệnh, nói riêng về các dòng 8 bit, do có độ dài mã lệnh dài hơn, có thể là 2 byte, do đó nó có thể mã hóa nhiều lệnh hơn. Và bản chất, chuyện mã hóa này còn kèm theo phần ALU của nó có khả năng tính toán logic như thế nào.
Như vậy, với trường hợp lệnh nhân 8 bit với 8 bit, 89 thực hiện với lệnh MUL AB một cách khá đơn giản như sau:
Code:
MOV A,R5 MOV B,R7 MUL AB MOV R2,B MOV R3,A
Trong khi đó, PIC phải thực hiện đến 35 chu kỳ. Thuật toán tốt nhất theo xác suất mà nói thì kết quả là 34 lệnh
Tuy nhiên, nếu xem tiếp tới lệnh nhân 16 bit với 16 bit, trong 89 sẽ viết thế này:
Code:
MUL16_16: ;Multiply R5 by R7 MOV A,R5 ;Move the R5 into the Accumulator MOV B,R7 ;Move R7 into B MUL AB ;Multiply the two values MOV R2,B ;Move B (the high-byte) into R2 MOV R3,A ;Move A (the low-byte) into R3 ;Multiply R5 by R6 MOV A,R5 ;Move R5 back into the Accumulator MOV B,R6 ;Move R6 into B MUL AB ;Multiply the two values ADD A,R2 ;Add the low-byte into the value already in R2 MOV R2,A ;Move the resulting value back into R2 MOV A,B ;Move the high-byte into the accumulator ADDC A,#00h ;Add zero (plus the carry, if any) MOV R1,A ;Move the resulting answer into R1 MOV A,#00h ;Load the accumulator with zero ADDC A,#00h ;Add zero (plus the carry, if any) MOV R0,A ;Move the resulting answer to R0. ;Multiply R4 by R7 MOV A,R4 ;Move R4 into the Accumulator MOV B,R7 ;Move R7 into B MUL AB ;Multiply the two values ADD A,R2 ;Add the low-byte into the value already in R2 MOV R2,A ;Move the resulting value back into R2 MOV A,B ;Move the high-byte into the accumulator ADDC A,R1 ;Add the current value of R1 (plus any carry) MOV R1,A ;Move the resulting answer into R1. MOV A,#00h ;Load the accumulator with zero ADDC A,R0 ;Add the current value of R0 (plus any carry) MOV R0,A ;Move the resulting answer to R1. ;Multiply R4 by R6 MOV A,R4 ;Move R4 back into the Accumulator MOV B,R6 ;Move R6 into B MUL AB ;Multiply the two values ADD A,R1 ;Add the low-byte into the value already in R1 MOV R1,A ;Move the resulting value back into R1 MOV A,B ;Move the high-byte into the accumulator ADDC A,R0 ;Add it to the value already in R0 (plus any carry) MOV R0,A ;Move the resulting answer back to R0 ;Return - answer is now in R0, R1, R2, and R3 RET
Code:
;Load the first value into R6 and R7 MOV R6,#62h MOV R7,#30h ;Load the first value into R4 and R5 MOV R4,#43h MOV R5,#2Eh ;Call the 16-bit subtraction routine LCALL MUL16_16
http://picvietnam.com/showthread.php?t=149
Về việc CB nói về viết bộ PID cho 89 chỉ có 100 lệnh và 1000 lệnh cho PIC là sai. Bởi vì chỉ riêng việc tính toán PWM và điều khiển, thì PIC đã làm tốt hơn nhiều lần so với 89 rồi.
Chưa kể rằng trong thuật toán PID hoàn toàn không có chỗ nào nhân chia với số 8 bit, cho nên chẳng thể nào nói rằng 89 lơi hơn PIC ở điểm tính toán cả.
Nếu bạn điều khiển PID mà chỉ dùng số 8 bit thì e rằng không bao giờ đạt được bộ điều khiển.
Chính vì vậy phải dùng số thực, và với việc dùng số thực, thì việc tính toán gần như như nhau.
Bởi vì tất cả đều là số, và tất cả đều thực hiện qua phép toán logic, mà phép nhân bắt buộc thực hiện như nhau, nhưng ở đây phần cứng 89 hỗ trợ phép nhân 8 bit, chứ không phải do độ dài mã lệnh có thể nhiều hơn mà 89 thực hiện được lệnh nhân 8 bit tốt hơn PIC.
Còn nếu nói về tính đơn giản khi lập trình, nếu bạn dùng MUL AB, thì trong PIC thực hiện với directive * , thế là xong.
Dòng PIC 16 không hỗ trợ lệnh nhân.
Điều này chưa nói được gì về RISC và CISC trong PIC cả.
Leave a comment: