2012年05月28日 01:20
list p=16f628a最後の32バイトのデータが書き込んだプログラム。
#include p16f628a.inc
variable env
; RA2+-v-+RA1
; RA3| |RA0
; RA4| |RA7
; RA5| |RA6
; Vss| |Vdd
; RB0| |RB7
; RB1| |RB6
; RB2| |RB5
; RB3+---+RB4
env = _BOREN_OFF
env &= _CP_OFF
env &= _DATA_CP_OFF
env &= _PWRTE_OFF
env &= _WDT_OFF
env &= _LVP_OFF
env &= _MCLRE_OFF
env &= _INTOSC_OSC_NOCLKOUT
__config env
RAMSTART equ 0x20
clk equ 0
dat equ 1
LOAD_CONF equ b'00000000'
LOAD_PROG equ b'00001000'
LOAD_DATA equ b'00001100'
INC_ADDR equ b'00011000'
READ_PROG equ b'00010000'
READ_DATA equ b'00010100'
BEGIN_PROG equ b'00100000'
ERASE_PROG equ b'00100100'
ERASE_DATA equ b'00101100'
cblock RAMSTART
count
count2
pgmcount
iobuf
clkbuf
datbuf
ptr
temp
freeram
endc
;
org 0x00
init
clrf PORTB
bsf STATUS,RP0
clrf TRISB ; PORTB : all output
clrf TRISA ; PORTA : all output
clrf STATUS
decf CMCON,F ; Comparator Off
movlw 0x10
movwf pgmcount
clrf count2
waitloop1 ;なんとなく待つ
call wait500us
call wait500us
call wait500us
call wait500us
decfsz count2
goto waitloop1
clrf iobuf ;PGMピンをHに
bsf iobuf,7
movf iobuf,W
movwf PORTB
nop ;5usでいいがなんとなく余計に待つ
nop
nop
nop
bsf iobuf,6 ;/MCLRピンをHに
movf iobuf,W
movwf PORTB
clrf ptr
pgmloop
;ロード
movlw freeram
movwf FSR
;load for program memoryコマンドをセット
movlw LOAD_PROG
movwf INDF
incf FSR,F
movlw 0xFC
movwf INDF
incf FSR,F
;プログラムデータをセット
call setdata
incf ptr
movlw freeram-1
movwf FSR
movlw d'24'
call transmit
;プログラム
movlw freeram
movwf FSR
;begin programコマンドをセット
movlw BEGIN_PROG
movwf INDF
incf FSR,F
movlw 0xFC
movwf INDF
incf FSR,F
movlw freeram-1
movwf FSR
movlw d'8'
call transmit
;待ち。ループ書くのめんどくさい。
call wait500us
call wait500us
call wait500us
call wait500us
call wait500us
call wait500us
call wait500us
call wait500us
call wait500us
call wait500us
call wait500us
call wait500us
;アドレス++
movlw freeram
movwf FSR
;inc addressコマンドをセット
movlw INC_ADDR
movwf INDF
incf FSR,F
movlw 0xFC
movwf INDF
incf FSR,F
movlw freeram-1
movwf FSR
movlw d'8'
call transmit
decfsz pgmcount
goto pgmloop
goto $
transmit
movwf count
transmitloop
movlw 0x07
andwf count,W
btfss STATUS,Z
goto noadvance
incf FSR
movf INDF,W
movwf datbuf
incf FSR
movf INDF,W
movwf clkbuf
noadvance
;clkをLに
bcf iobuf,clk
movf iobuf,W
movwf PORTB
;データ準備
rrf datbuf,F
bcf iobuf,dat
btfsc STATUS,C
bsf iobuf,dat
rrf clkbuf,F
btfsc STATUS,C
bsf iobuf,clk
;出力
movf iobuf,W
movwf PORTB
decfsz count,F
goto transmitloop
;clkをLに
bcf iobuf,clk
movf iobuf,W
movwf PORTB
return
;;;;
setdata
;プログラムデータをセット
movf ptr,W
call readtable
movwf INDF
rlf INDF,F
rlf temp,F ;Cを保存
incf FSR,F
movlw 0xFF
movwf INDF
incf FSR,F
incf ptr
movf ptr,W
call readtable
movwf INDF
rrf temp,F ;Cを取り出し
rlf INDF,F
incf FSR,F
movlw 0xFF
movwf INDF
return
;;;;
;0.5ms待つ
wait500us
movlw d'165'
movwf count
loop500us
decfsz count,F
goto loop500us
return
readtable
addwf PCL
programtable
dt 0x83, 0x16, 0x86, 0x01, 0x85, 0x01, 0x83, 0x01, 0x9F, 0x03, 0x55, 0x30, 0xFF, 0x3A, 0x85, 0x00
dt 0x86, 0x00, 0xA0, 0x01, 0xA1, 0x01, 0xA1, 0x0B, 0x0B, 0x28, 0xA0, 0x0B, 0x0A, 0x28, 0x06, 0x28
dt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;何か間違ったときのために少し余計にデータを置いておく
dt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
end
(宣言とか略)
org 0x00
init
bsf STATUS,RP0
clrf TRISB ; PORTB : all output
clrf TRISA ; PORTA : all output
clrf STATUS
decf CMCON,F ; Comparator Off
movlw 0x55
loop
xorlw 0xFF
movwf PORTA
movwf PORTB
clrf count1
wait1
clrf count2
wait2
decfsz count2
goto wait2
decfsz count1
goto wait1
goto loop