PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > RTOS và Thuật toán với PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

RTOS và Thuật toán với PIC RTOS và Các thuật toán dùng cho PIC/dsPIC/PIC32
Mod: phamminhtuan

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 18-11-2005, 09:30 AM   #1
tuan795
Đệ tử 1 túi
 
Tham gia ngày: Oct 2005
Bài gửi: 16
:
Thuat toan chia

Ai hiểu rỏ thuật toán chia (pic) như 16bit chia cho 8bit 16bit chia cho 16bit giơi thiệu cho tôi với.
tuan795 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-11-2005, 07:06 PM   #2
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Code:
#define bf_carry 3, 0
#define bf_zero 3, 2

#define same 1
#define wreg 0

#define stc bsf bf_carry
#define clc bcf bf_carry

;-[ Div ]--------------------------------------------------------------
; Call w/: Number in f_divhi:f_divlo, divisor in W.
; Returns: Quotient in f_divlo, remainder in f_divhi. W preserved.
;          Carry set if error. Z if divide by zero, NZ if divide overflow.
; Notes:   Works by left shifted subtraction.
;          Size = 29, Speed(w/ call&ret) = 7 cycles if div by zero
;          Speed = 94 minimum, 129 maximum cycles

Div;
    addlw 0          ; w+=0 (to test for div by zero)
    stc              ; set carry in case of error
    btfsc bf_zero    ; if zero
     return          ;   return (error C,Z)

    call DivSkipHiShift
iDivRepeat = 8
while iDivRepeat

    call DivCode

iDivRepeat--
endw

    rlf f_divlo, same ; C << lo << C

    ; If the first subtract didn't underflow, and the carry was shifted
    ; into the quotient, then it will be shifted back off the end by this
    ; last RLF. This will automatically raise carry to indicate an error.
    ; The divide will be accurate to quotients of 9-bits, but past that
    ; the quotient and remainder will be bogus and carry will be set.

    bcf bf_zero  ; NZ (in case of overflow error)
    return       ; we are done!

DivCode
    rlf f_divlo, same    ; C << lo << C
    rlf f_divhi, same    ; C << hi << C
    btfss bf_carry       ; if Carry
     goto DivSkipHiShift ;
    subwf f_divhi, same  ;   hi-=w
    stc                  ;   ignore carry
    return               ;   done
                         ; endif
DivSkipHiShift
    subwf f_divhi, same  ; hi-=w
    btfsc bf_carry       ; if carry set
     return              ;   done
    addwf f_divhi, same  ; hi+=w
    clc                  ; clear carry
    return               ; done
Đây là thuật toán chia 16bit cho 8bit. Bạn tìm hiểu và phân tích thêm nhé, có lẽ mafd_47a sẽ giúp bạn phân tích source code này thêm.

Chúc vui.
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-11-2006, 08:55 PM   #3
anhquangngai
Đệ tử 2 túi
 
Tham gia ngày: Sep 2006
Bài gửi: 33
:
Trích:
Nguyên văn bởi falleaf View Post
Code:
#define bf_carry 3, 0
#define bf_zero 3, 2

#define same 1
#define wreg 0

#define stc bsf bf_carry
#define clc bcf bf_carry

;-[ Div ]--------------------------------------------------------------
; Call w/: Number in f_divhi:f_divlo, divisor in W.
; Returns: Quotient in f_divlo, remainder in f_divhi. W preserved.
;          Carry set if error. Z if divide by zero, NZ if divide overflow.
; Notes:   Works by left shifted subtraction.
;          Size = 29, Speed(w/ call&ret) = 7 cycles if div by zero
;          Speed = 94 minimum, 129 maximum cycles

Div;
    addlw 0          ; w+=0 (to test for div by zero)
    stc              ; set carry in case of error
    btfsc bf_zero    ; if zero
     return          ;   return (error C,Z)

    call DivSkipHiShift
iDivRepeat = 8
while iDivRepeat

    call DivCode

iDivRepeat--
endw

    rlf f_divlo, same ; C << lo << C

    ; If the first subtract didn't underflow, and the carry was shifted
    ; into the quotient, then it will be shifted back off the end by this
    ; last RLF. This will automatically raise carry to indicate an error.
    ; The divide will be accurate to quotients of 9-bits, but past that
    ; the quotient and remainder will be bogus and carry will be set.

    bcf bf_zero  ; NZ (in case of overflow error)
    return       ; we are done!

DivCode
    rlf f_divlo, same    ; C << lo << C
    rlf f_divhi, same    ; C << hi << C
    btfss bf_carry       ; if Carry
     goto DivSkipHiShift ;
    subwf f_divhi, same  ;   hi-=w
    stc                  ;   ignore carry
    return               ;   done
                         ; endif
DivSkipHiShift
    subwf f_divhi, same  ; hi-=w
    btfsc bf_carry       ; if carry set
     return              ;   done
    addwf f_divhi, same  ; hi+=w
    clc                  ; clear carry
    return               ; done
Đây là thuật toán chia 16bit cho 8bit. Bạn tìm hiểu và phân tích thêm nhé, có lẽ mafd_47a sẽ giúp bạn phân tích source code này thêm.

Chúc vui.
vậy thì khi muốn chia thì làm như thế nào?
Anh có thể chỉ cụ thể hơn dc ko?
anhquangngai vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-03-2006, 04:39 PM   #4
Vigorous
Nhập môn đệ tử
 
Tham gia ngày: Dec 2005
Bài gửi: 2
:
Thế còn những thuật toán khác như +,-,*,/ với 2 số 16 bit thì sao?
Anh có biết xin chỉ giáo dùm nhé!
Vigorous vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-03-2006, 11:06 PM   #5
pb1
Đệ tử 2 túi
 
Tham gia ngày: Feb 2006
Bài gửi: 31
:
Bác mafd_47a đâu rồi, phân tích giúp thuật toán này đi, em cũng đang rất muốn biết

thank bác
pb1 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-03-2006, 02:10 AM   #6
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
các bạn có thể tham khảo tại www.piclist.com

Chúc vui
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-04-2006, 01:06 PM   #7
thancongbao
Đệ tử 1 túi
 
Tham gia ngày: May 2005
Bài gửi: 14
:
thuật toán chi với số bit lớn hơn một từ của VXL em thường dùng phương pháp chia nhị phận thường.Bác cứ hình dung lại phép chia thông thường khi mình học lớp 1 ấy bác sẽ làm được.
sơ sơ như thế này:
lần lượt lấy số có trọng số cao nhất chi cho số chia sau đó hạ tiếp số có trọng số cao nhất còn lại xuống kết hợp với số dự để chia cho số chia.Cứ thế cho tới hết.Để em tìm lại code trước đây em viết bằng ASM cho 8051,néu còn em sẽ cho bác để tham khảo hê hê hê !!!
thancongbao vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-05-2006, 12:15 AM   #8
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Có rất nhiều thuật toán chia được phân tích trên www.piclist.com, thuật toán của bạn chỉ là một trong số các thuật toán đó.

Việc phân tích thuật toán và viết các giải thích cho mọi người là điều rất cần thiết vì nó sẽ giúp chúng ta phát triển các thuật toán tối ưu hoá chương trình.

Ở đây mình muốn đưa ra luồng này, nhằm phân tích nó, các bạn có thể copy và thảo luận về các thuật toán cơ bản này, chạy thử, và chuẩn hoá lại...

Chúc vui.
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-11-2006, 08:55 AM   #9
tdm
Đệ tử 7 túi
 
Tham gia ngày: May 2005
Bài gửi: 258
:
Trích:
Nguyên văn bởi tuan795 View Post
Ai hiểu rỏ thuật toán chia (pic) như 16bit chia cho 8bit 16bit chia cho 16bit giơi thiệu cho tôi với.

http://www.piclist.com/techref/micro.../div/index.htm
http://www.piclist.com/techref/micro.../mul/index.htm
tdm vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-11-2006, 10:16 PM   #10
chumeodihia
Đệ tử 1 túi
 
Tham gia ngày: Sep 2006
Bài gửi: 17
:
Đây là phép chia 8 bit cho 8 bit lấy về tham khảo nhe bạn 16 bit cũng tương tự như vậy thôi:

Code:
#include <p18F4431.inc>
org 0x000000
SO_CHIA    EQU 0X81
SO_DU      EQU 0X82
DIV        EQU 0X83
SO_DICH    EQU 0X84
LUU_TAM    EQU 0X85
KQ_CHIA    EQU 0X86
MAIN
MOVLW .15
MOVWF DIV
MOVLW .10
MOVWF SO_CHIA

CLRF KQ_CHIA
CLRF SO_DU
CLRF LUU_TAM
MOVLW .8
MOVWF SO_DICH

MOVF DIV,W
CPFSLT SO_CHIA   ;NHAY NEU SO_CHIA < DIV
  BRA KET_THUC
LOOP
BCF STATUS,C 
RLCF DIV         ;BIT7 OF DIV VAO CO C VA CO C VA BIT0 CUA DIV  
RLCF LUU_TAM     ;BIT7 OF DIV VAO BIT0 CUA LUU_TAM
MOVF LUU_TAM,W
CPFSEQ SO_CHIA
  BRA NO_BANG
  BRA BANG
NO_BANG
MOVF LUU_TAM,W
CPFSLT SO_CHIA   ;NHAY NEU SO_CHIA < LUU_TAM (XEM SO DA DICH >SO CHIA CHUA)
  BRA TTUC       ;NO :THUONG SO=0 VA LUU VAO KQ_CHIA
BANG
MOVF SO_CHIA,W   ;YES:THUONG SO=1 VA LUU VAO KQ_CHIA
SUBWF LUU_TAM,1  ;(LUU_TAM)-(SO_CHIA) LUU VAO LUU_TAM(SO_DU)
MOVLW 0X01 
ADDWF DIV,1      ;DICH 1 VAO BIT0 CUA DIV-CHINH LA KQ_CHIA
TTUC
MOVFF LUU_TAM,SO_DU
MOVFF DIV,KQ_CHIA
DECFSZ SO_DICH,1
BRA LOOP
KET_THUC
END

thay đổi nội dung bởi: falleaf, 13-11-2007 lúc 05:18 PM.
chumeodihia vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-11-2007, 11:57 AM   #11
anchovy
Nhập môn đệ tử
 
Tham gia ngày: Nov 2007
Bài gửi: 3
:
Trích:
Nguyên văn bởi chumeodihia View Post
Đây là phép chia 8 bit cho 8 bit lấy về tham khảo nhe bạn 16 bit cũng tương tự như vậy thôi:

#include <p18F4431.inc>
org 0x000000
SO_CHIA EQU 0X81
SO_DU EQU 0X82
DIV EQU 0X83
SO_DICH EQU 0X84
LUU_TAM EQU 0X85
KQ_CHIA EQU 0X86
MAIN
MOVLW .15
MOVWF DIV
MOVLW .10
MOVWF SO_CHIA

CLRF KQ_CHIA
CLRF SO_DU
CLRF LUU_TAM
MOVLW .8
MOVWF SO_DICH

MOVF DIV,W
CPFSLT SO_CHIA ;NHAY NEU SO_CHIA < DIV
BRA KET_THUC
LOOP
BCF STATUS,C
RLCF DIV ;BIT7 OF DIV VAO CO C VA CO C VA BIT0 CUA DIV
RLCF LUU_TAM ;BIT7 OF DIV VAO BIT0 CUA LUU_TAM
MOVF LUU_TAM,W
CPFSEQ SO_CHIA
BRA NO_BANG
BRA BANG
NO_BANG
MOVF LUU_TAM,W
CPFSLT SO_CHIA ;NHAY NEU SO_CHIA < LUU_TAM (XEM SO DA DICH >SO CHIA CHUA)
BRA TTUC ;NO :THUONG SO=0 VA LUU VAO KQ_CHIA
BANG
MOVF SO_CHIA,W ;YES:THUONG SO=1 VA LUU VAO KQ_CHIA
SUBWF LUU_TAM,1 ;(LUU_TAM)-(SO_CHIA) LUU VAO LUU_TAM(SO_DU)
MOVLW 0X01
ADDWF DIV,1 ;DICH 1 VAO BIT0 CUA DIV-CHINH LA KQ_CHIA
TTUC
MOVFF LUU_TAM,SO_DU
MOVFF DIV,KQ_CHIA
DECFSZ SO_DICH,1
BRA LOOP
KET_THUC
END
co the giai thich lenh nay "MOVLW .15" giup minh dc ko minh moi hoc pic nen ko hieu
anchovy vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-11-2007, 04:48 PM   #12
david
Đệ tử 4 túi
 
david's Avatar
 
Tham gia ngày: Aug 2006
Bài gửi: 81
:
.15 là số thập phân thôi bạn ạ
david vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-11-2007, 08:55 PM   #13
anchovy
Nhập môn đệ tử
 
Tham gia ngày: Nov 2007
Bài gửi: 3
:
cảm ơn bạn mình hiểu rồi.
anchovy vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến

Similar Threads
Ðề tài Người gửi Chuyên mục Trả lời Bài mới
Thảo luân: Vấn đề download, chia sẻ và dịch tài liệu odense Đóng góp ý kiến 19 02-11-2018 03:16 PM
Tạo thư viện tài liệu riêng và chia sẻ falleaf Đóng góp ý kiến 4 29-03-2018 03:12 PM
Dự án chia sẻ thư viện ORCAD/PROTEL falleaf Thực hành 88 05-11-2014 10:58 PM
Chiều gắn LED vào mạch linhbx PIC - Thiết kế và Ứng dụng 36 24-10-2013 06:19 PM
Ngành điện tử VN được ưu tiên nhưng không có chiến lược falleaf Trao đổi ngoài luồng 0 17-06-2006 07:39 PM


Múi giờ GMT. Hiện tại là 12:28 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam