PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   MPASM (http://www.picvietnam.com/forum/forumdisplay.php?f=34)
-   -   Làm cách nào để viết một bảng tra dài như trong 89 (http://www.picvietnam.com/forum/showthread.php?t=2012)

tdm 22-02-2008 10:20 AM

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 .

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

Trích:

Nguyên văn bởi minoan (Post 14421)
Đọ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

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",..


risc 14-10-2008 04:39 AM

Trích:

Nguyên văn bởi tdm (Post 14420)
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)



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

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam