PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > MPASM

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

MPASM Lập trình bằng hợp ngữ là một việc làm vô cùng vất vả, tuy nhiên, để hiểu và làm việc với vi điều khiển, hợp ngữ trở thành một công cụ khá đắc lực ...

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 16-01-2007, 04:14 PM   #1
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
Xin đoạn code chuyển đổi từ số hexa 6bytes sang bcd packed 8bytes

Mình đang rất cần đoạn code chuyển đổi từ số hexa 6bytes sang số bcd packed 8bytes (code ASM). Bạn nào có thì giúp mình nhé.

Ví dụ : Số hexa là FF FE DC 38 25 E0
chuyển sang bcd packed sẽ là : 02 81 47 00 81 44 32 96

Cảm ơn rất nhiều.
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-01-2007, 04:31 PM   #2
ngohaibac
Đệ tử 9 túi
 
ngohaibac's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: BKHN
Bài gửi: 231
:
Send a message via Yahoo to ngohaibac
Chào bạn. Bạn xin thế thì không ai upload lên cho bạn đâu.

Mình nghĩ bạn nên trình bảy chủ kiến của mình trước. Thảo luận về thuật giải của bạn xem đã được chưa? Rùi xin góp ý của mọi người. Viết bằng ASM rất dài và ngại nên mọi người sẽ không viết đâu bạn ạ. Lần sau bạn chú ý nhé. Mình chỉ nêu ra thuật toán mà mình viết bên www.dientuvietnam.net thôi tại luồng sau (bài thứ 21):
http://www.dientuvietnam.net/forums/...?t=4403&page=3

To vinhsnooker: mình có cách này mình nghĩ là ổn cho việc chuyển đổi số 24bit sang số thập phân.

Mình lấy ví dụ với số 8 bit trước nhé. Ta có số cần chuyển là:
Số A: a7a6a5a4a3a2a1a0 (ai là bit thứ i của số A).

Ta cần chuyển sang số thập phân lưu trữ trong 3 byte: b2 b1 b0 (b2 là hàng trăm, b1 là hàng chục, b0 là hàng đơn vị).

Thuật giải của mình như sau:
  • Cho b2 = b1 = b0
  • Nếu a0 = 1 thì b0 = 1 và làm (*)
  • Nếu a1 = 1 thì tăng b0 thêm 2 và làm (*)
  • Nếu a2 = 1 thì tăng b0 thêm 4 và làm (*)
  • Nếu a3 = 1 thì tăng b0 thêm 8 và làm (*)
  • Nếu a4 = 1 thì tăng b0 thêm 6, tăng b1 thêm 1 và làm (*)
  • Nếu a5 = 1 thì tăng b0 thêm 2, tăng b1 thêm 3 và làm (*)
  • Nếu a6 = 1 thì tăng b0 thêm 4, tăng b1 thêm 6 và làm (*)
  • Nếu a7 = 1 thì tăng b0 thêm 8, tăng b1 thêm 2, tăng b2 thêm 1 và làm (*).

Công việc (*):
  • Nếu b0>10 thì b0 = b0 - 10 và tăng b1 thêm 1
  • Nếu b1>10 thì b1 = b1 - 10 và tăng b2 thêm 1.

Thực chất của phương pháp này chỉ là cộng dồn mà thôi.
Vì: A = a7 * 128 + a6 * 64 + a5 * 32 + a4 * 16 + a3*8 + a2*4 + a1*2 + a0

Nên việc chuyển sang số thập phân chỉ là việc cộng dồn từng số theo thứ tự từ phải sang trái mà thôi .

Các số 128, 64,32,16,8,4,2 có thể dùng cách tra bảng, do đó có thể tổng quát viết chương trình sẽ ngắn gọn hơn rất là nhiều.

Ví dụ: i là số thứ tự của bit trong A, trong vòng lặp ta sẽ tra trong ROM 3 số (c,d,e) nào đó rùi cộng tương ứng vào b2, b1, b0 và thực hiện công việc (*) là xong.

Với số 16 bit, 24bit làm cũng hoàn toàn tương tự mà thôi. Chí khác là phải xác định phạm vi biểu diễn số đó là bao nhiêu số trong số thập phân thôi.

Coi như đây là một bài để cho các bạn tự viết chương trình nhé. Mình mà viết thì còn có ý nghĩa gì nữa, cách làm đã nói hết rùi .

Chúc các bạn thành công.
ngohaibac vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-01-2007, 08:43 AM   #3
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
Cảm ơn bạn đã hồi đáp!
Chính vì viết bằng ASM rất dài nên mình thường hay copy những đoạn code có sẵn trên internet về dùng. Đồng ý với bạn là mình tự làm sẽ tốt hơn nhưng tuỳ từng thời điểm thì sẽ thích hợp. Khi bạn đang đau đầu với 1 project lớn, cần phải đầu tư suy nghĩ nhiều về giải thuật thì việc copy những đoạn code như cộng trừ nhân chia, chuyển đổi... sẽ có lợi cho bạn về mặt thời gian (rất cảm ơn những ai thường chia sẻ code cho mọi người trên internet). Mình cũng vậy, cái gì mình làm được ai hỏi mình sẽ cho ngay không ngần ngại. Ý mình hỏi ở đây là ai có sẵn thì cho mình xin, chứ không phải hỏi để người khác bắt đầu nghĩ và viết hộ mình. Đôi lời tâm sự như vậy với bạn, và xin được bắt tay bạn 1 cái vì cùng là dân BK.
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-01-2007, 08:46 AM   #4
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
To vinhsnooker : đoạn code chuyển đổi từ số 24bit sang số thập phân bạn có thể tìm thấy ở link này : http://www.piclist.com/techref/micro...onversions.htm

Còn nếu bạn muốn tự mình viết thì mình ủng hộ bạn! Viết xong nhớ chia sẻ với mọi người nhé.
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-01-2007, 08:48 AM   #5
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
Xin lỗi, chính xác là link này bạn ạ : http://www.piclist.com/techref/micro...adix/index.htm
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-01-2007, 11:21 AM   #6
ngohaibac
Đệ tử 9 túi
 
ngohaibac's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: BKHN
Bài gửi: 231
:
Send a message via Yahoo to ngohaibac
Cảm ơn bạn nhé.

Có thể mình hơi hiểu nhầm về cách hỏi của bạn . Nếu mà sai thì cho mình xin lỗi nhé. Viết bằng ASM dài và khó hiểu sao bạn không viết bằng C cho đơn giản nhỉ?

Khi mình viết được chương trình hay thì mình cũng upload lên để mọi người đóng góp ý kiến, trao đổi để hoàn thiện mình hơn. Mình có ý là với mỗi ngôn ngữ C hay ASM nên tập hợp lại thành một thư viện thì sẽ hay hơn rất là nhiều. Khi đó chúng ta lập trình sẽ không phải quan tâm nhiều đến thanh ghi nọ, thanh ghi kia. Lập trình IC sẽ trở lên như lập trình hướng đối tượng với các hàm sẵn (giống CCS và PSoC designer) . Nói thế lại sang CCS mất rùi.

Tuy nhiên, người mới học thì nên tự làm từ cái nho nhỏ, không nên dùng những cái có sẵn nhiều sẽ lười và chẳng hiểu kí rì cả.

Cũng bắt tay bạn cái vì cùng dân BKHN.

Chúc bạn thành công.
ngohaibac vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-01-2007, 09:39 AM   #7
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
Mình đã có đoạn code này. Xin được post lên đây để các bạn cùng tham khảo :

Code:
B6_BCD:  
	bcf     STATUS,0                ; clear the carry bit
	movlw   .48			
	movwf   count
	clrf    r0
	clrf    r1
	clrf    r2
	clrf	r3
	clrf	r4
	clrf	r5
	clrf	r6
	clrf	r7
	
loop48  
	rlf     L_byte2, F
	rlf     L_byte1, F
	rlf     M_byte2, F
	rlf     M_byte1, F
	rlf     H_byte2, F
	rlf     H_byte1, F
	
	rlf     r7, F
	rlf     r6, F
	rlf     r5, F
	rlf     r4, F
	rlf     r3, F
	rlf     r2, F
	rlf     r1, F
	rlf     r0, F
;
	decfsz  count, F
	goto    adjDEC
	RETLW   0
;
adjDEC 
	movlw   r7
	movwf   FSR
	call    adjBCD

	movlw   r6
	movwf   FSR
	call    adjBCD

	movlw   r5
	movwf   FSR
	call    adjBCD	

	movlw   r4
	movwf   FSR
	call    adjBCD
;
	movlw   r3
	movwf   FSR
	call    adjBCD
;
	movlw   r2
	movwf   FSR
	call    adjBCD
;
	movlw   r1
	movwf   FSR
	call    adjBCD
;
	movlw   r0
	movwf   FSR
	call    adjBCD
	
	goto    loop48
;
adjBCD  
	movlw   3
	addwf   INDF,W
	movwf   temp
	btfsc   temp,3          ; test if result > 7
	movwf   INDF
	movlw   30
	addwf   INDF,W
	movwf   temp
	btfsc   temp,7          ; test if result > 7
	movwf   INDF               ; save as MSD
	RETLW   0
Note : Kết quả chuyển đổi để trong [r0:r7], trong đó r0 là MSB, r7 là LSB. Số cần chuyển đổi (6byte hex) để trong [H_byte1:H_byte2:M_byte1:M_byte2:L_byte1:L_byte2]. H_byte1 là MSB, L_Byte2 là LSB.

thay đổi nội dung bởi: namqn, 18-01-2007 lúc 07:48 PM.
Jerry 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
tai sao LED tren mạch nap PG5V2r8 khong bao gio sang khoahung Bootloaders - Programmers - Debuggers - Emulators 5 08-05-2007 01:41 AM
Hỏi về báo chuyên ngành điện tử chipchipvn PIC - Thiết kế và Ứng dụng 3 07-04-2007 04:48 AM
picbasic pro unlimit code picbasic Chương trình dịch & các công cụ mô phỏng 4 07-04-2007 01:20 AM
Cần thuê người viết code cho VXL(chỗ này có mùi tiền) nguyencuongcc Tìm mua sản phẩm 1 09-01-2007 09:40 AM
cần giúp gấp về các nguồn cung cấp asm code IIR filter cho DSP56K Motorola bachelor1979 Trao đổi ngoài luồng 2 25-06-2006 10:24 PM


Múi giờ GMT. Hiện tại là 06:33 AM.


Đượ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