PDA

View Full Version : Làm cách nào để viết một bảng tra dài như trong 89


tdm
22-02-2008, 10:20 AM
nhờ các bạn giúp đỡ để viết một bảng tra lớn hơn 256 byte .

minoan
22-02-2008, 10:35 AM
Đọ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

tdm
22-02-2008, 11:53 AM
Đọ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.

david
22-02-2008, 06:59 PM
để 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

falleaf
22-02-2008, 08:27 PM
http://www.picvietnam.com/forum/showthread.php?t=5

Xem bài #27, cái này đã lâu lắm rồi.

thaile
11-08-2008, 02:33 PM
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 ' '

ORG 0x80
Table
ADDWF PCL, F
dt "ABC.."

Hoặc

ORG 0x80
Table
ADDWF PCL, F
dt 'A','B','C',..


Với Pic18 có thể dùng đoạn code sau để tra bảng:

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

Table
data "ABC.."

hoặc

Table
data "A","B","C",..

risc
14-10-2008, 04:39 AM
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


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)