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 22-02-2008, 10:20 AM   #1
tdm
Đệ tử 7 túi
 
Tham gia ngày: May 2005
Bài gửi: 258
:
Làm cách nào để viết một bảng tra dài như trong 89

nhờ các bạn giúp đỡ để viết một bảng tra lớn hơn 256 byte .
tdm vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-02-2008, 10:35 AM   #2
minoan
Đệ tử 1 túi
 
Tham gia ngày: Aug 2007
Bài gửi: 11
:
Đọc trong piclist.com ay
đây là 1 ví dụ trong đó

Table movlw High(TStart)
addwf OffsetH,W
movwf PCLATH
movlw Low(TStart)
addwf OffsetL,W
skpnc
incf PCLATH,F

movwf PCL ;computed goto with right PCLATH
; end of Table subroutine.


; ...
;
org 0x????
TStart Retlw d'0'
Retlw d'255'
Retlw d'9'
....
etc
minoan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-02-2008, 11:53 AM   #3
tdm
Đệ tử 7 túi
 
Tham gia ngày: May 2005
Bài gửi: 258
:
Trích:
Nguyên văn bởi minoan View Post
Đọc trong piclist.com ay
đây là 1 ví dụ trong đó

Table movlw High(TStart)
addwf OffsetH,W
movwf PCLATH
movlw Low(TStart)
addwf OffsetL,W
skpnc
incf PCLATH,F

movwf PCL ;computed goto with right PCLATH
; end of Table subroutine.


; ...
;
org 0x????
TStart Retlw d'0'
Retlw d'255'
Retlw d'9'
....
etc
bạn có thể viết một bài VD được không.
tdm vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-02-2008, 06:59 PM   #4
david
Đệ tử 4 túi
 
david's Avatar
 
Tham gia ngày: Aug 2006
Bài gửi: 81
:
để có 1 bảng dài hơn 256 byte có thể chia bảng nhỏ bảng đó và đặt ở nhiều Page khác nhau (mình vẫn làm thế!).Và theo mình chỉ có cách này vi thanh ghi PCL chỉ 8 bit
david vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-02-2008, 08:27 PM   #5
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
http://www.picvietnam.com/forum/showthread.php?t=5

Xem bài #27, cái này đã lâu lắm rồi.
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-08-2008, 02:33 PM   #6
thaile
Nhập môn đệ tử
 
Tham gia ngày: Mar 2008
Bài gửi: 6
:
Code:
ORG 0x80 
Table 
   ADDWF  PCL, F 
   RETLW  ‘A’ 
   RETLW  ‘B’ 
   RETLW  ‘C’ 
   . 
   .
Đoạn code trên ta có thể thay đổi lại như sau để đỡ tốn công viết lại các dòng RETLW ' '
Code:
ORG 0x80 
Table 
   ADDWF  PCL, F 
dt "ABC.."
Hoặc
Code:
ORG 0x80 
Table 
   ADDWF  PCL, F 
dt 'A','B','C',..
Với Pic18 có thể dùng đoạn code sau để tra bảng:
Code:
movlw	high(Table)
movwf	TBLPTRH
movlw	low(Table)
addlw        offset
movwf	TBLPTRL
tblrd*                            ; giá trị return từ vị trí "bảng+offset" sẽ chứa trong thanh ghi TABLAT sau lệnh này
Lúc đó Table có dạng như sau
Code:
Table
data   "ABC.."
hoặc
Code:
Table
data   "A","B","C",..

thay đổi nội dung bởi: thaile, 11-08-2008 lúc 03:02 PM.
thaile vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-10-2008, 04:39 AM   #7
risc
Nhập môn đệ tử
 
Tham gia ngày: Feb 2007
Bài gửi: 1
:
Trích:
Nguyên văn bởi tdm View Post
nhờ các bạn giúp đỡ để viết một bảng tra lớn hơn 256 byte .
Bạn có thể sử dụng bộ nhớ chương trình (Flash memory) để lưu bảng, sau dùng tính năng đọc bộ nhớ chương trìng để tra bảng. Với phưong pháp này bạn có thể tạo bảng có độ dài tối đa = 2^14 words. Đoạn chương trình sau có thể giúp bạn hiểu rõ hơn

Code:
lcd_print:
		movlw	HIGH(msg_table)
		movwf	addrh
		movlw	LOW(msg_table)
		addwf	pointer,W ; point to message in the msg_table
		btfsc	STATUS,C	; check for overflow
		incf	addrh,f		; yes, increase hi address
		movwf	addrl		; no, goto next step 
lcd_print_loop:
		call	flash_read	; read from flash memory
		movf	datah		; test for zero
		btfsc	STATUS,Z
		movf	datal		; test for zero
		btfsc	STATUS,Z
		return
		bcf		STATUS, C	; clear carry flag
		rlf		datal,W		; shift MSB of low byte to C
		bcf		datal,7		; clear MSB bit
		rlf		datah,f		; shift C to LSB position of hi byte
		movf	datah,W		        ; put hi byte to LCD
		call	lcd_put_char
		movf	datal,W		        ; put low byte to LCD
		call	lcd_put_char
		incf	addrl		                ; increase address pointer
		btfsc	STATUS,C	                ; check for overflow
		incf	addrh,f
		goto 	lcd_print_loop
		return

;---------------------------------------------------------------
;flash read
flash_read:
		global	flash_read
		movf 	addrl, w ;low address
		Bank2
		movwf 	EEADR 
		Bank0
		movf 	addrh,w ;hi address
		Bank2
		movwf 	EEADRH 
		Bank3
		bsf 	EECON1,EEPGD ;point to program memory (see 16F873A datasheet)
		bsf 	EECON1,RD 	;start read operation
		nop 				;required two nops
		nop 	
		Bank2
		movf 	EEDATA,W ;datal = eedata
		Bank0
		movwf 	datal ;
		Bank2
		movf 	EEDATH,W ;datah = eedath
		Bank0
		movwf 	datah ;
		return

;----------------------------------------------------------
;program memory string table
msg_table:
		global 	msg_table                   ;(pointer position,msg length)
		DA    "HW ver 1.0",0			;(0,6)
		DA    "SW ver 1.2",0			;(6,6)

thay đổi nội dung bởi: risc, 14-10-2008 lúc 05:08 AM.
risc 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


Múi giờ GMT. Hiện tại là 02:39 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