• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
  • slider image 488
  • slider image 491
:::


Browsing this Thread:   1 Anonymous Users






Table write/read 搞不懂,請幫忙.&再進一步說明如下
#1
中級會員
中級會員


查看用戶資訊
偶想要將table的資料用table write方式寫入data EEPROM
,請問如何使用table write.
等了幾天無高手願意賜教 ,卡哇瘦~~
我再說詳細一點
下面是A/D數值(4位數)顯示在四個七段LED同時記錄5位數在
data EEPROM 內 , 如今想要將文字串用table write 方式寫入加在每筆資料前面 以方便閱讀 該如何作 請高手不佞賜教

;**************************************************************************
;**** File : ADdetect.asm ( use Timer1 with 8MHz crystal )
;**** Read RA0 with the analog voltage input and convert the voltage
;**** to 8-bit digital on 7-segment LED and write into EEPROM
;**** input RA0 , Output PORTD<7:4> , PORTC<7:4> is Power set
;**************************************************************************

list p = 18F452
include <p18F452.inc>
;
cblock 0x00
ADresult:1
ADcount:1
Pro_1:1
Pro_2:1
Result_Temp:1
Result_Temp0:1
Result_Temp1:1
Count1:1 ; define address for time delay count number
Count1_1:1
Count1_2:1
Count2:1
Count2_1:1
Count2_2:1
Carry_0:1
Num_Count10000:1
Num_Count1000:1
Num_Count100:1
Num_Count10:1
Num_Count0:1
endc
#define TEN b'00001010'
#define NINE b'00001001'
#define SIX b'00000110'
#define FIVE b'00000101'
#define TWO b'00000010'
#define ONE b'00000001'
#define ZERO b'00000000'
#define Count1_Init_Value 07AH ; LED digits alternately display times(SCANNING)
#define TMR1_VAL .2000
Data_EE_Addr EQU 0X010 ; This is the start of EEPROM address(can't be changed)
Data_EE_Data EQU 0X02A
EEPROM_Buffer equ 0x02
C_Hold_Delay equ 0x20
;********************************************************************
;**** RESET Vector @ 0x0000
;********************************************************************
org 0x0000 ;
bra Main
;

;********************************************************************
;**** The Main Program start from Here !!
;********************************************************************
org 0x002A
Main:

call Init_IO
clrf Data_EE_Addr
AD_Loop
rcall C_Hold_Time ; Delay 50uS for the sample hold time
bsf ADCON0, GO ; Start convert the A/D
nop ; Nop
nop
nop
Check
btfsc ADCON0, GO ; Check the A/D completed ?
goto Check ; A/D isn't completed yet, continut check.
nop
nop
nop
nop
movf ADRESH,0,0
movwf ADresult ; show result
movlw .198 ; multiply 198
mulwf ADresult,W
nop
nop
call C_Hold_Time
nop
nop
movf PRODH,0,0 ; get the msb of prod , i.e. ad value/256,max49998 for 5 V
; Max.6.528V can be detected , over will show error
movwf Pro_1
movf Pro_1,0,0
movwf ADresult
clrf ADcount
clrf Num_Count10000
clrf Num_Count1000
clrf Num_Count100
clrf Num_Count10
clrf Num_Count0
; **** Write AD result into EEPROM
goto CHECK0
CHECK0
movlw b'111111111'
cpfseq ADcount,W
goto CHECK
goto ByeBye
ByeBye
movlw b'00000000'
movwf Num_Count0
movlw b'00001000'
movwf Num_Count10
movlw b'00000010'
movwf Num_Count100
movlw b'00000101'
movwf Num_Count1000
movlw b'00000110'
movwf Num_Count10000
goto LEDdisplay

CHECK
movf ADresult,0,0
cpfseq ADcount,W
goto UPcount0
goto LEDdisplay
UPcount0
incf ADcount
movlw SIX
addwf Num_Count0,1,0
clrf Carry_0
movlw NINE
cpfsgt Num_Count0,W
goto UPgrade_10
movlw TEN
subwf Num_Count0,1,0
movlw ONE
movwf Carry_0
goto CHECK_10
UPgrade_10
movlw FIVE
addwf Num_Count10,1,0
clrf Carry_0
movlw NINE
cpfsgt Num_Count10,W
goto UPgrade_100
movlw TEN
subwf Num_Count10,1,0
movlw ONE
movwf Carry_0
goto CHECK_100
CHECK_10
movf Carry_0,0,0
addwf Num_Count10,1,0
movlw FIVE
addwf Num_Count10,1,0
clrf Carry_0
movlw NINE
cpfsgt Num_Count10,W
goto UPgrade_100
movlw TEN
subwf Num_Count10,1,0
movlw ONE
movwf Carry_0
goto CHECK_100

UPgrade_100
movlw TWO
addwf Num_Count100,1,0
clrf Carry_0
movlw NINE
cpfsgt Num_Count100,W
goto CHECK0
movlw TEN
subwf Num_Count100,1,0
movlw ONE
movwf Carry_0
goto CHECK_1000
CHECK_100
movf Carry_0,0,0
addwf Num_Count100,1,0
clrf Carry_0
movlw TWO
addwf Num_Count100,1,0
movlw NINE
cpfsgt Num_Count100,W
goto CHECK0
movlw TEN
subwf Num_Count100,1,0
movlw ONE
movwf Carry_0
goto CHECK_1000
CHECK_1000
movf Carry_0,0,0
addwf Num_Count1000,1,0
clrf Carry_0
movlw NINE
cpfsgt Num_Count1000,W
goto CHECK0
movlw TEN
subwf Num_Count1000,1,0
movlw ONE
movwf Carry_0
goto CHECK_10000
CHECK_10000
movf Carry_0,0,0
addwf Num_Count10000,1,0
movlw NINE
cpfsgt Num_Count10000,W
goto CHECK0
goto OVER_high

OVER_high
movlw b'00001111'
movwf Num_Count0
movlw b'00001111'
movwf Num_Count10
movlw b'00001111'
movwf Num_Count100
movlw b'00001111'
movwf Num_Count1000
movlw b'00001111'
movwf Num_Count10000
goto LEDdisplay
LEDdisplay ; show voltage detected X.Y on to two 7-seg leds
movlw Count1_Init_Value
nop
nop
cpfseq Count1,W
goto IncCount1
goto clrCount1
IncCount1
movf Num_Count10000,0,0
movwf PORTD,0
bsf PORTC,4 ; switch power on the portc<7> pin
call TIMER100U
bcf PORTC,4 ; switch power off the portc<7> to let next bit show on
movf Num_Count1000,0,0
movwf PORTD,0
bsf PORTC,5
call TIMER100U
bcf PORTC,5
movf Num_Count100,0,0
movwf PORTD,0
bsf PORTC,6
call TIMER100U
bcf PORTC,6
movf Num_Count10,0,0
movwf PORTD,0
bsf PORTC,7
call TIMER100U
bcf PORTC,7
incf Count1
goto LEDdisplay
clrCount1
movlw ZERO
movwf Count1
goto EEPROM_WR
EEPROM_WR
movf Num_Count10000,0,0 ; Load AD result to W
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
bsf ADCON0, GO ; Start convert the A/D
nop
nop
nop
movf Num_Count1000,0,0 ; Load AD result to W
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
bsf ADCON0, GO ; Start convert the A/D
nop
nop
nop
movf Num_Count100,0,0 ; Load AD result to W
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
bsf ADCON0, GO ; Start convert the A/D
nop
nop
nop
movf Num_Count10,0,0 ; Load AD result to W
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
bsf ADCON0, GO ; Start convert the A/D
nop
nop
nop
movf Num_Count0,0,0 ; Load AD result to W
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
goto AD_Loop
;----INTERNAL EEPROM WRITE-----
;
IN_DATA_EEW
movff Data_EE_Addr,EEADR
movff Data_EE_Data,EEDATA
;
BCF EECON1,EEPGD
BCF EECON1,CFGS
BSF EECON1,WREN
;
MOVLW 0X55
MOVWF EECON2
MOVLW 0XAA
MOVWF EECON2
BSF EECON1,WR
;
LOOP1 BTFSS PIR2, EEIF
GOTO LOOP1
;
BCF EECON1,WREN
BCF PIR2,EEIF
RETURN
;***********************************************************************
;**** Initial the PORTD for the output port
;***********************************************************************
Init_IO:
BCF PIR2,EEIF
BCF PIE2,EEIE
bcf RCON,IPEN
movlw b'00000001'
movwf ADCON0
movlw b'00001110'
movwf ADCON1
bcf TRISC,4 ; LED power digit for AD 10th number
bcf TRISC,5 ; LED power digit for AD 0th number
bcf TRISC,6 ; LED power digit for AD 10th number
bcf TRISC,7 ; LED power digit for AD 0th number
bcf PORTC,4
bcf PORTC,5
bcf PORTC,6
bcf PORTC,7
clrf TRISD
movlw b'11111111'
movwf PORTD
bsf TRISA,RA0 ; Set RA0 with input mode
;
return

;***********************************************************************
;**** Sample Hold (Charge) time delay routine (50uS)
;***********************************************************************
C_Hold_Time:
movlw 0FFH
movwf C_Hold_Delay
nop
decfsz C_Hold_Delay,F
bra $-2
return
;**********************************
;* Delay time
;*********************************
TIMER100U
movlw 002H
nop
cpfseq Count2_2,0
goto Time_Loop1
goto TIMER_Finish2
Time_Loop1
incf Count2_2
Time_Loop2
movlw 005H
nop
cpfseq Count2_1,0
goto TIMER_Loop
goto TIMER_Finish1
TIMER_Loop
incf Count2_1
movlw 0C9H
movwf Count2
decfsz Count2
bra $-2
goto Time_Loop2
TIMER_Finish1
clrf Count2_1
goto TIMER100U
TIMER_Finish2
clrf Count2_2
return

END

2006.12.7 修改如下 , 將 Str1 的註釋寫入EEPROM 以便於閱讀 , 請指教 .....
;**************************************************************************
;**** File : ADdetect.asm use 8 MHz crystal
;**** Read RA0 with the analog voltage input and convert the voltage
;**** to 8-bit digital on 7-segment LED and write into EEPROM
;**** input RA0 , Output PORTD<7:4> , PORTC<7:4> is Power set
;**************************************************************************
list p = 18F452
include <p18F452.inc>
;
cblock 0x00
ADresult:1
ADcount:1
Pro_1:1
Pro_2:1
Result_Temp:1
Result_Temp0:1
Result_Temp1:1
Count1:1 ; define address for time delay count number
Count1_1:1
Count1_2:1
Count2:1
Count2_1:1
Count2_2:1
Carry_0:1
TARGET_STR:3
Num_Count10000:1
Num_Count1000:1
Num_Count100:1
Num_Count10:1
Num_Count0:1
endc
PUT_Address MACRO TARGET_STR
movf UPPER TARGET_STR,0,0
movwf TBLPTRU
movf HIGH TARGET_STR,0,0
movwf TBLPTRH
movf LOW TARGET_STR,0,0
movwf TBLPTRL
call Put_String ;
ENDM
#define TEN b'00001010'
#define NINE b'00001001'
#define SIX b'00000110'
#define FIVE b'00000101'
#define TWO b'00000010'
#define ONE b'00000001'
#define ZERO b'00000000'
#define Count1_Init_Value 07AH ; LED digits alternately display times(SCANNING)
#define TMR1_VAL .2000
Data_EE_Addr EQU 0X010 ; This is the start of EEPROM address(can't be changed)
Data_EE_Data EQU 0X02A
EEPROM_Buffer equ 0x02
C_Hold_Delay equ 0x20

;********************************************************************
;**** RESET Vector @ 0x0000
;********************************************************************
org 0x0000 ;
bra Main
;

;********************************************************************
;**** The Main Program start from Here !!
;********************************************************************
org 0x002A
Main:

call Init_IO
clrf Data_EE_Addr
call TIMER1000U
PUT_Address str1
call TIMER1000U
AD_Loop
rcall C_Hold_Time ; Delay 50uS for the sample hold time
bsf ADCON0, GO ; Start convert the A/D
nop ; Nop
nop
nop
Check
btfsc ADCON0, GO ; Check the A/D completed ?
goto Check ; A/D isn't completed yet, continut check.
nop
nop
nop
nop
movf ADRESH,0,0
movwf ADresult ; show result
movlw .196 ; multiply 196 ie FFx.1196=49998
mulwf ADresult,W
nop
nop
call C_Hold_Time
nop
nop
movf PRODH,0,0 ; get the msb of prod , i.e. ad value/256,max49998 for 5 V
; Max.6.528V can be detected , over will show error
movwf Pro_1
movf Pro_1,0,0
movwf ADresult
clrf ADcount
clrf Num_Count10000
clrf Num_Count1000
clrf Num_Count100
clrf Num_Count10
clrf Num_Count0
; **** Write AD result into EEPROM
goto CHECK0
CHECK0
movlw b'111111111'
cpfseq ADcount,W
goto CHECK
goto ByeBye
ByeBye
movlw b'00000000'
movwf Num_Count0
movlw b'00001000'
movwf Num_Count10
movlw b'00000010'
movwf Num_Count100
movlw b'00000101'
movwf Num_Count1000
movlw b'00000110'
movwf Num_Count10000
goto LEDdisplay

CHECK
movf ADresult,0,0
cpfseq ADcount,W
goto UPcount0
goto LEDdisplay
UPcount0
incf ADcount
movlw SIX
addwf Num_Count0,1,0
clrf Carry_0
movlw NINE
cpfsgt Num_Count0,W
goto UPgrade_10
movlw TEN
subwf Num_Count0,1,0
movlw ONE
movwf Carry_0
goto CHECK_10
UPgrade_10
movlw FIVE
addwf Num_Count10,1,0
clrf Carry_0
movlw NINE
cpfsgt Num_Count10,W
goto UPgrade_100
movlw TEN
subwf Num_Count10,1,0
movlw ONE
movwf Carry_0
goto CHECK_100
CHECK_10
movf Carry_0,0,0
addwf Num_Count10,1,0
movlw FIVE
addwf Num_Count10,1,0
clrf Carry_0
movlw NINE
cpfsgt Num_Count10,W
goto UPgrade_100
movlw TEN
subwf Num_Count10,1,0
movlw ONE
movwf Carry_0
goto CHECK_100

UPgrade_100
movlw TWO
addwf Num_Count100,1,0
clrf Carry_0
movlw NINE
cpfsgt Num_Count100,W
goto CHECK0
movlw TEN
subwf Num_Count100,1,0
movlw ONE
movwf Carry_0
goto CHECK_1000
CHECK_100
movf Carry_0,0,0
addwf Num_Count100,1,0
clrf Carry_0
movlw TWO
addwf Num_Count100,1,0
movlw NINE
cpfsgt Num_Count100,W
goto CHECK0
movlw TEN
subwf Num_Count100,1,0
movlw ONE
movwf Carry_0
goto CHECK_1000
CHECK_1000
movf Carry_0,0,0
addwf Num_Count1000,1,0
clrf Carry_0
movlw NINE
cpfsgt Num_Count1000,W
goto CHECK0
movlw TEN
subwf Num_Count1000,1,0
movlw ONE
movwf Carry_0
goto CHECK_10000
CHECK_10000
movf Carry_0,0,0
addwf Num_Count10000,1,0
movlw NINE
cpfsgt Num_Count10000,W
goto CHECK0
goto OVER_high

OVER_high
movlw b'00001111'
movwf Num_Count0
movlw b'00001111'
movwf Num_Count10
movlw b'00001111'
movwf Num_Count100
movlw b'00001111'
movwf Num_Count1000
movlw b'00001111'
movwf Num_Count10000
goto LEDdisplay
LEDdisplay ; show voltage detected X.Y on to two 7-seg leds
movlw Count1_Init_Value
nop
nop
cpfseq Count1,W
goto IncCount1
goto clrCount1
IncCount1
movf Num_Count10000,0,0
movwf PORTD,0
bsf PORTC,4 ; switch power on the portc<7> pin
call TIMER100U
bcf PORTC,4 ; switch power off the portc<7> to let next bit show on
movf Num_Count1000,0,0
movwf PORTD,0
bsf PORTC,5
call TIMER100U
bcf PORTC,5
movf Num_Count100,0,0
movwf PORTD,0
bsf PORTC,6
call TIMER100U
bcf PORTC,6
movf Num_Count10,0,0
movwf PORTD,0
bsf PORTC,7
call TIMER100U
bcf PORTC,7
incf Count1
goto LEDdisplay
clrCount1
movlw ZERO
movwf Count1
goto EEPROM_WR
EEPROM_WR
movf Num_Count10000,0,0 ; Load AD result to W
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
bsf ADCON0, GO ; Start convert the A/D
nop
nop
nop
movf Num_Count1000,0,0 ; Load AD result to W
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
bsf ADCON0, GO ; Start convert the A/D
nop
nop
nop
movf Num_Count100,0,0 ; Load AD result to W
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
bsf ADCON0, GO ; Start convert the A/D
nop
nop
nop
movf Num_Count10,0,0 ; Load AD result to W
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
bsf ADCON0, GO ; Start convert the A/D
nop
nop
nop
movf Num_Count0,0,0 ; Load AD result to W
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
goto AD_Loop
;----INTERNAL EEPROM WRITE-----
;
IN_DATA_EEW
movff Data_EE_Addr,EEADR
movff Data_EE_Data,EEDATA
;
BCF EECON1,EEPGD
BCF EECON1,CFGS
BSF EECON1,WREN
;
MOVLW 0X55
MOVWF EECON2
MOVLW 0XAA
MOVWF EECON2
BSF EECON1,WR
;
LOOP1 BTFSS PIR2, EEIF
GOTO LOOP1
;
BCF EECON1,WREN
BCF PIR2,EEIF
RETURN
;***********************************************************************
;**** Initial the PORTD for the output port
;***********************************************************************
Init_IO:
BCF PIR2,EEIF
BCF PIE2,EEIE
bcf RCON,IPEN
movlw b'00000001'
movwf ADCON0
movlw b'00001110'
movwf ADCON1
bcf TRISC,4 ; LED power digit for AD 10th number
bcf TRISC,5 ; LED power digit for AD 0th number
bcf TRISC,6 ; LED power digit for AD 10th number
bcf TRISC,7 ; LED power digit for AD 0th number
bcf PORTC,4
bcf PORTC,5
bcf PORTC,6
bcf PORTC,7
clrf TRISD
movlw b'11111111'
movwf PORTD
bsf TRISA,RA0 ; Set RA0 with input mode
;
return

;***********************************************************************
;**** Sample Hold (Charge) time delay routine (50uS)
;***********************************************************************
C_Hold_Time:
movlw 0FFH
movwf C_Hold_Delay
nop
decfsz C_Hold_Delay,F
bra $-2
return
;**********************************
;* Delay time
;*********************************
TIMER100U
movlw 002H
nop
cpfseq Count2_2,0
goto Time_Loop1
goto TIMER_Finish2
Time_Loop1
incf Count2_2
Time_Loop2
movlw 005H
nop
cpfseq Count2_1,0
goto TIMER_Loop
goto TIMER_Finish1
TIMER_Loop
incf Count2_1
movlw 0C9H
movwf Count2
decfsz Count2
bra $-2
goto Time_Loop2
TIMER_Finish1
clrf Count2_1
goto TIMER100U
TIMER_Finish2
clrf Count2_2
return
TIMER1000U
movlw 0A2H
nop
cpfseq Count2_2,0
goto Time_Loop11
goto TIMER_Finish22
Time_Loop11
incf Count2_2
Time_Loop22
movlw 0A5H
nop
cpfseq Count2_1,0
goto TIMER_Loopp
goto TIMER_Finish11
TIMER_Loopp
incf Count2_1
movlw 0C9H
movwf Count2
decfsz Count2
bra $-2
goto Time_Loop22
TIMER_Finish11
clrf Count2_1
goto TIMER1000U
TIMER_Finish22
clrf Count2_2
return
Put_String
tblrd *+ ; get in-line string character
movf TABLAT,W ; null character (00)?
bz PutExit ; yes, exit, else
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
tblrd *+ ; get in-line string character
movf TABLAT,W ; null character (00)?
bz PutExit ; yes, exit, else
movwf Data_EE_Data
call IN_DATA_EEW
incf Data_EE_Addr ; Point to next EEPROM Address
bra Put_String ; and do another
PutExit return ;

str1 da "Channel 1 Voltage AD \0"
str2 da "Channel 2 Current AD \0"
str3 da "Channel 3 Temperature AD \0"

END


發表於: 2006/11/30 8:34
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]


:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------