楽天市場
[無料でホームページを作成] [通報・削除依頼]

続PIC10F322 フラッシュメモリの操作

続PIC10F322 フラッシュプログラムメモリの操作

PIC10F322のフラッシュ書き込みには、ページ書き込み用のラッチが使えます。
ラッチ書き込みに対応するように前回のコードを再検討しました。

以下のコードでラッチ書き込みにも対応します。プログラムコードは1ワード増加します。

wr_e:                                                     ;フラッシュメモリーのバルク消去
           bsf        PMCON1,FREE
wr_l:                                                      ;データラッチへの書き込み
           bsf        PMCON1,LWLO
wr_w:                                                    ;フラッシュメモリーの書き込み
           bsf        PMCON1,WREN
           movlw   0x55
           movwf   PMCON2
           movlw   0xaa
           movwf   PMCON2
           bsf        PMCON1,WR
rd:                                                         ;フラッシュメモリーの読み出し
           bsf        PMCON1,RD
           nop
           nop
           clrf        PMCON1
           return


上記サブルーチンを使用する前提条件として、PMCON1のbit6~bit0が事前にクリアされている必要がありますが、リセットでPMCON1のbit6~bit0がクリアされるのと、このサブルーチンを使用すると読み出し・書き込み・消去に関わらずPMCON1が必ずクリアされますので、PMCON1を意図的に書き換えない限り問題なく使用可能です。


このルーチンを使用したフラッシュプログラムメモリのデモプログラム
アドレス0x0050~0x008Fのデータをアドレス0x0010~0x004Fに書き換える

◎起動1回目
img_20130626-134615.jpg

◎起動2回目
img_20130626-134639.jpg


<ソースコード>

LIST P=PIC10F322
#INCLUDE <P10F322.inc>

#ifdef W_TBL
__CONFIG _FOSC_INTOSC & _BOREN_OFF & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _LVP_OFF & _LPBOR_OFF & _BORV_HI & _WRT_OFF
#endif

; #DEFINE W_TBL ;ブートローダー本体を一緒にコンパイルする
; 注意)W_TBLを定義すると、TinyPicBootloader+ では書き込めません

#DEFINE TX 2 ;RS-232C データ出力用ビット
#DEFINE RX 3 ;RS-232C データ入力用ビット
#DEFINE Direct_RX ;RS-232C直結方式、コメントアウトで反転方式
#DEFINE Direct_TX ;RS-232C直結方式、コメントアウトで反転方式
;
;***************************************************************************************
;*
;* 注意(重要)
;*
;* 本デモプログラムではPIC10F322のフラッシュメモリーの書き換えを行いますが、
;* TinyPicBootloader+でプログラム転送した後も通信機能を使用します。
;* ご使用時は、JMP_TXおよびJMP_RX のショートピンをTinyPicBootloader+
;* の状態から差し替えないでください。
;*
;* このソースでW_TBLを定義してコンパイルするとスタンドアローンで作動する
;* プログラムを作成することができます。
;*
;* ご使用にはTREATERMやハイパーターミナルなどのターミナルソフトが必要です。
;* 通信条件: ボーレート9600、8ビット、1ストップビット、ノーパリティ
;*
;***************************************************************************************
;
; ********************************************************************
; Define General Purpose Registers (64 bytes maximum ; 40h-7Fh)
; Bank 0 Only
; RS-232C使用時 :40h-7Dh
; RS-232C未使用時 :40h-7Fh
; ********************************************************************

count equ 0x40 ;データ転送用カウンター
adr equ 0x41 ;アドレス一時保存

cn equ 0x7E ;RS-232Cワークレジスタ
rxd equ 0x7F ;RS-232C送受信データ

; ********************************************************************
; ブートローダー中の予約変数、サブルーチン領域
; ********************************************************************

bwait equ 0x01DC ;100usのウエイト(CALL文込み/W=0x09,Carry=1,Zero=1で戻る)
bwait2 equ 0x01DD ; 50usのウエイト(CALL文込み/W=0x09,Carry=1,Zero=1で戻る)
rs1rx equ 0x01F4 ;1文字受信サブルーチン
r1rx11 equ 0x01F6 ;1文字受信サブルーチン(スタートビット検出後)
rs1tx equ 0x01D0 ;1文字送信サブルーチン
CRLF equ 0x01CD ;改行コード送出
LF equ 0x01C ;改行コード送出
wr_e equ 0x01C0 ;フラッシュプログラムメモリーブロック消去(16ワード)
wr_l equ 0x01C1 ;フラッシュプログラムメモリーラッチ書き込み
wr_w equ 0x01C2 ;フラッシュプログラムメモリー書き込み
rd equ 0x01C8 ;フラッシュプログラムメモリー読み出し

; ********************************************************************

PUTC equ rs1tx ;1文字送信サブルーチン
GETC equ rs1rx ;1文字受信サブルーチン

;/////////////////////////////////////////////////////////////////
;
; プログラムコード
;
;/////////////////////////////////////////////////////////////////

#ifdef W_TBL
org 0x0000
;**************************************************************************
;
; ブートローダー本体を一緒にコンパイルする場合、
; この4行中にブートローダーへのジャンプを記述する
;
;**************************************************************************
goto TINYBLD
nop
nop
nop

org 0x019C
;**************************************************************************
;
; ブートローダー本体を一緒にコンパイルする場合、
; ユーザープログラムが存在しない場合、ブートローダーへのジャンプを記述する
; ユーザープログラムが存在する場合、ユーザープログラムへのジャンプを記述する
;
;**************************************************************************
goto INIT
nop
nop
nop
#else
org 0x0000
;**************************************************************************
;
; ブートローダー本体を一緒にコンパイルしない場合、
; 以下4行中にユーザープログラムへのジャンプを記述する
; この4行はブートローダーで書き込む際に0x019C~0x019Fに移動する
;
;**************************************************************************
goto INIT
nop
nop
nop
#endif

org 0x0004
;**********************************************************
;
; ここからユーザープログラムを記述する(0x0004~0x019B)
;
;**********************************************************

ORG 0x0010 ;
mes_b MOVLW 0x82 ;こ
CALL PUTC ;
MOVLW 0xB1 ;
CALL PUTC ;
MOVLW 0x82 ;れ
CALL PUTC ;
MOVLW 0xEA ;
CALL PUTC ;
MOVLW 0x82 ;は
CALL PUTC ;
MOVLW 0xCD ;
CALL PUTC ;
MOVLW 0x8F ;書
CALL PUTC ;
MOVLW 0x91 ;
CALL PUTC ;
MOVLW 0x82 ;き
CALL PUTC ;
MOVLW 0xAB ;
CALL PUTC ;
MOVLW 0x8A ;換
CALL PUTC ;
MOVLW 0xB7 ;
CALL PUTC ;
MOVLW 0x82 ;え
CALL PUTC ;
MOVLW 0xA6 ;
CALL PUTC ;
MOVLW 0x91 ;前
CALL PUTC ;
MOVLW 0x4F ;
CALL PUTC ;
MOVLW 0x82 ;の
CALL PUTC ;
MOVLW 0xCC ;
CALL PUTC ;
MOVLW 0x83 ;デ
CALL PUTC ;
MOVLW 0x66 ;
CALL PUTC ;
MOVLW 0x81 ;ー
CALL PUTC ;
MOVLW 0x5B ;
CALL PUTC ;
MOVLW 0x83 ;タ
CALL PUTC ;
MOVLW 0x5E ;
CALL PUTC ;
MOVLW 0x82 ;で
CALL PUTC ;
MOVLW 0xC5 ;
CALL PUTC ;
MOVLW 0x82 ;す
CALL PUTC ;
MOVLW 0xB7 ;
CALL PUTC ;
MOVLW 0x81 ;。
CALL PUTC ;
MOVLW 0x42 ;
CALL PUTC ;
CALL CRLF ;
GOTO CRLF ;

ORG 0x0050 ;

mes_a MOVLW 0x8F ;書
CALL PUTC ;
MOVLW 0x91 ;
CALL PUTC ;
MOVLW 0x82 ;き
CALL PUTC ;
MOVLW 0xAB ;
CALL PUTC ;
MOVLW 0x8A ;換
CALL PUTC ;
MOVLW 0xB7 ;
CALL PUTC ;
MOVLW 0x82 ;え
CALL PUTC ;
MOVLW 0xA6 ;
CALL PUTC ;
MOVLW 0x82 ;は
CALL PUTC ;
MOVLW 0xCD ;
CALL PUTC ;
MOVLW 0x8F ;上
CALL PUTC ;
MOVLW 0xE3 ;
CALL PUTC ;
MOVLW 0x8E ;手
CALL PUTC ;
MOVLW 0xE8 ;
CALL PUTC ;
MOVLW 0x82 ;く
CALL PUTC ;
MOVLW 0xAD ;
CALL PUTC ;
MOVLW 0x82 ;い
CALL PUTC ;
MOVLW 0xA2 ;
CALL PUTC ;
MOVLW 0x82 ;き
CALL PUTC ;
MOVLW 0xAB ;
CALL PUTC ;
MOVLW 0x82 ;ま
CALL PUTC ;
MOVLW 0xDC ;
CALL PUTC ;
MOVLW 0x82 ;し
CALL PUTC ;
MOVLW 0xB5 ;
CALL PUTC ;
MOVLW 0x82 ;た
CALL PUTC ;
MOVLW 0xBD ;
CALL PUTC ;
MOVLW 0x82 ;か
CALL PUTC ;
MOVLW 0xA9 ;
CALL PUTC ;
MOVLW 0x81 ;?
CALL PUTC ;
MOVLW 0x48 ;
CALL PUTC ;
CALL CRLF ;
GOTO CRLF ;

ORG 0x0090 ;
INIT ;初期化
; CLRF ANSELA ;デジタルポートに設定(ブートローダーで設定済み)
; BCF TRISA,TX ;TXポート設定(ブートローダーで設定済み)
CALL CRLF ;改行
CALL CRLF ;改行

MES1 ;最初に書き込まれているメッセージを出力
CALL mes_b ;
;
KEYIN ;キー入力待ち
MOVLW "H" ;H
CALL PUTC ;
MOVLW "i" ;i
CALL PUTC ;
MOVLW "t" ;t
CALL PUTC ;
MOVLW " " ;空白
CALL PUTC ;
MOVLW "A" ;A
CALL PUTC ;
MOVLW "n" ;n
CALL PUTC ;
MOVLW "y" ;y
CALL PUTC ;
MOVLW " " ;空白
CALL PUTC ;
MOVLW "K" ;K
CALL PUTC ;
MOVLW "e" ;e
CALL PUTC ;
MOVLW "y" ;y
CALL PUTC ;
MOVLW "!" ;!
CALL PUTC ;

CALL GETC ;
CALL CRLF ;
CALL CRLF ;

ERASE ;clear[0x10,0x4f]
MOVLW 0x04 ;count=4
MOVWF count ;
CLRF PMADRH ;PMADRH=0
CLRF PMADRL ;PMADRL=0
ELOOP
MOVLW 0x10 ;PMADRL=PMADRL+10
ADDWF PMADRL ;
CALL wr_e ;ページ消去
DECFSZ count,F ;count=count-1
GOTO ELOOP ;loop

COPY ;copy[0x50,0x8f] to [0x10,0x4f]
MOVLW 0x04 ;count=4
MOVWF count ;
MOVLW 0x10 ;adr=0x10
CLOOP
MOVWF adr ;read data
MOVF adr,W ;
ADDLW 0x40 ;
MOVWF PMADRL ;
CALL rd ;
MOVF adr,W ;copy data
MOVWF PMADRL ;
CALL wr_l ;
MOVLW 0x01 ;W=adr+1
ADDWF adr,W ;

SKPDC ;DC=1?
GOTO CLOOP ;loop

CALL wr_w ;write PAGE
INCF adr,W ;W=adr+1
DECFSZ count,F ;count=count-1,count=0?
GOTO CLOOP ;loop

MES2 ;書き換えられたメッセージを出力
CALL mes_b ;
GOTO $ ;停止



;///////////////////////////////////////////////////////////////////////////////
;
; ブートローダー本体
; [クロック8MHz(内部)、ボーレート9600、8ビット、1ストップビット、ノーパリティ]
;
;///////////////////////////////////////////////////////////////////////////////
;
org 0x01A0
TINYBLD

#ifdef W_TBL

DW 0x21E2,0x3CC1,0x1D03,0x29F3,0x3011,0x21D0,0x304B,0x21D0
DW 0x01FA,0x21E4,0x00A1,0x21E4,0x00A0,0x21E4,0x21E4,0x00A2
DW 0x21E4,0x00A3,0x21C1,0x3001,0x07A0,0x1C83,0x29AE,0x21E4
DW 0x1D03,0x29BE,0x03A0,0x21C0,0x21C2,0x29A6,0x304E,0x29A7
DW 0x1624,0x16A4,0x1524,0x3055,0x00A5,0x30AA,0x00A5,0x14A4
DW 0x1424,0x0000,0x0000,0x01A4,0x0008,0x300D,0x21D0,0x300A

#ifdef Direct_TX
#if (TX==0)
DW 0x00FF,0x300A,0x00FE,0x1003,0x1803,0x1005,0x1C03,0x1405
DW 0x21DC,0x0CFF,0x0BFE,0x29D4,0x21DD,0x30E8,0x3E01,0x1D03
DW 0x29DE,0x3409,0x0188,0x1006,0x3005,0x00FB,0x01FC,0x01FD
#endif
#if (TX==1)
DW 0x00FF,0x300A,0x00FE,0x1003,0x1803,0x1085,0x1C03,0x1485
DW 0x21DC,0x0CFF,0x0BFE,0x29D4,0x21DD,0x30E8,0x3E01,0x1D03
DW 0x29DE,0x3409,0x0188,0x1086,0x3005,0x00FB,0x01FC,0x01FD
#endif
#if (TX==2)
DW 0x00FF,0x300A,0x00FE,0x1003,0x1803,0x1105,0x1C03,0x1505
DW 0x21DC,0x0CFF,0x0BFE,0x29D4,0x21DD,0x30E8,0x3E01,0x1D03
DW 0x29DE,0x3409,0x0188,0x1106,0x3005,0x00FB,0x01FC,0x01FD
#endif
#else
#if (TX==0)
DW 0x00FF,0x300A,0x00FE,0x1003,0x1803,0x1405,0x1C03,0x1005
DW 0x21DC,0x0CFF,0x0BFE,0x29D4,0x21DD,0x30E8,0x3E01,0x1D03
DW 0x29DE,0x3409,0x0188,0x1006,0x3005,0x00FB,0x01FC,0x01FD
#endif
#if (TX==1)
DW 0x00FF,0x300A,0x00FE,0x1003,0x1803,0x1485,0x1C03,0x1085
DW 0x21DC,0x0CFF,0x0BFE,0x29D4,0x21DD,0x30E8,0x3E01,0x1D03
DW 0x29DE,0x3409,0x0188,0x1086,0x3005,0x00FB,0x01FC,0x01FD
#endif
#if (TX==2)
DW 0x00FF,0x300A,0x00FE,0x1003,0x1803,0x1505,0x1C03,0x1105
DW 0x21DC,0x0CFF,0x0BFE,0x29D4,0x21DD,0x30E8,0x3E01,0x1D03
DW 0x29DE,0x3409,0x0188,0x1106,0x3005,0x00FB,0x01FC,0x01FD
#endif
#endif

#ifdef Direct_RX
#if (RX==0)
DW 0x1C05,0x29ED,0x21F6,0x07FA,0x0008,0x0BFD,0x29E8,0x0BFC
DW 0x29E7,0x0BFB,0x29E6,0x299C,0x1C05,0x29F4,0x21DD,0x00FE
DW 0x0CFF,0x21DC,0x1805,0x1003,0x0BFE,0x29F8,0x087F,0x0008
#endif
#if (RX==1)
DW 0x1C85,0x29ED,0x21F6,0x07FA,0x0008,0x0BFD,0x29E8,0x0BFC
DW 0x29E7,0x0BFB,0x29E6,0x299C,0x1C85,0x29F4,0x21DD,0x00FE
DW 0x0CFF,0x21DC,0x1885,0x1003,0x0BFE,0x29F8,0x087F,0x0008
#endif
#if (RX==2)
DW 0x1D05,0x29ED,0x21F6,0x07FA,0x0008,0x0BFD,0x29E8,0x0BFC
DW 0x29E7,0x0BFB,0x29E6,0x299C,0x1D05,0x29F4,0x21DD,0x00FE
DW 0x0CFF,0x21DC,0x1905,0x1003,0x0BFE,0x29F8,0x087F,0x0008
#endif
#if (RX==3)
DW 0x1D85,0x29ED,0x21F6,0x07FA,0x0008,0x0BFD,0x29E8,0x0BFC
DW 0x29E7,0x0BFB,0x29E6,0x299C,0x1D85,0x29F4,0x21DD,0x00FE
DW 0x0CFF,0x21DC,0x1985,0x1003,0x0BFE,0x29F8,0x087F,0x0008
#endif
#else
#if (RX==0)
DW 0x1805,0x29ED,0x21F6,0x07FA,0x0008,0x0BFD,0x29E8,0x0BFC
DW 0x29E7,0x0BFB,0x29E6,0x299C,0x1805,0x29F4,0x21DD,0x00FE
DW 0x0CFF,0x21DC,0x1C05,0x1003,0x0BFE,0x29F8,0x087F,0x0008
#endif
#if (RX==1)
DW 0x1885,0x29ED,0x21F6,0x07FA,0x0008,0x0BFD,0x29E8,0x0BFC
DW 0x29E7,0x0BFB,0x29E6,0x299C,0x1885,0x29F4,0x21DD,0x00FE
DW 0x0CFF,0x21DC,0x1C85,0x1003,0x0BFE,0x29F8,0x087F,0x0008
#endif
#if (RX==2)
DW 0x1905,0x29ED,0x21F6,0x07FA,0x0008,0x0BFD,0x29E8,0x0BFC
DW 0x29E7,0x0BFB,0x29E6,0x299C,0x1905,0x29F4,0x21DD,0x00FE
DW 0x0CFF,0x21DC,0x1D05,0x1003,0x0BFE,0x29F8,0x087F,0x0008
#endif
#if (RX==3)
DW 0x1985,0x29ED,0x21F6,0x07FA,0x0008,0x0BFD,0x29E8,0x0BFC
DW 0x29E7,0x0BFB,0x29E6,0x299C,0x1985,0x29F4,0x21DD,0x00FE
DW 0x0CFF,0x21DC,0x1D85,0x1003,0x0BFE,0x29F8,0x087F,0x0008
#endif
#endif

#endif
;
END

<HEXファイル>

:020000040000FA
:08000000902800000000000040
:100020008230D021B130D0218230D021EA30D021AD
:100030008230D021CD30D0218F30D0219130D021CD
:100040008230D021AB30D0218A30D021B730D021BE
:100050008230D021A630D0219130D0214F30D02114
:100060008230D021CC30D0218330D0216630D021D5
:100070008130D0215B30D0218330D0215E30D0213F
:100080008230D021C530D0218230D021B730D0216C
:0C0090008130D0214230D021CD21CD297B
:1000A0008F30D0219130D0218230D021AB30D0217F
:1000B0008A30D021B730D0218230D021A630D02153
:1000C0008230D021CD30D0218F30D021E330D021EB
:1000D0008E30D021E830D0218230D021AD30D021F7
:1000E0008230D021A230D0218230D021AB30D0213B
:1000F0008230D021DC30D0218230D021B530D021E7
:100100008230D021BD30D0218230D021A930D02101
:0C0110008130D0214830D021CD21CD29F4
:10012000CD21CD2110204830D0216930D02174302C
:10013000D0212030D0214130D0216E30D0217930F3
:10014000D0212030D0214B30D0216530D0217930E2
:10015000D0212130D021F421CD21CD210430C00087
:10016000A101A0011030A007C021C00BB2280430AB
:10017000C0001030C1004108403EA000C821410825
:10018000A000C12101304107831CBA28C221410AC5
:08019000C00BBA281020CB2897
:00000001FF