PIC18F87J11でMPLAB C18 コンパイラを使用しており、C とアセンブリ コードの組み合わせであるインライン アセンブリを使用して、いくつかの値をフラッシュ メモリに保存しようとしています。
フラッシュ メモリに正しく読み書きできるように見えますが、PIC の電源を入れ直し、特定のアドレスから以前に保存したものを読み取ろうとすると、同じ値が得られません。アドレスに保存0x09
してい0xB22A
ます。私が言ったように、値を保存してすぐに読み取ると、すべてが正しく表示されますが、PIC をリセットすると0x00
.
フラッシュ メモリに永続的に保存していないのでしょうか、それとも実際に何が起こっているのでしょうか?
これは私のコードです:
メモリ行を消去
_asm
MOVLW 0x00
MOVWF TBLPTRU,BANKED
MOVLW 0xB2
MOVWF TBLPTRH,BANKED
MOVLW 0x2A
MOVWF TBLPTRL,BANKED
_endasm
EECON1bits.FREE = 1;
INTCONbits.GIE = 0;
_asm
MOVLW 0x55
MOVWF EECON2,BANKED
MOVLW 0xAA
MOVWF EECON2,BANKED
_endasm
EECON1bits.WR = 1;
INTCONbits.GIE = 1;
フラッシュメモリへの書き込み
_asm
MOVLW 0x00
MOVWF TBLPTRU,BANKED
MOVLW 0xB2
MOVWF TBLPTRH,BANKED
MOVLW 0x2A
MOVWF TBLPTRL,BANKED
MOVLW 0x09
MOVWF TABLAT,BANKED
TBLWTPOSTINC
MOVLW 0x09
MOVWF TABLAT,BANKED
TBLWT
_endasm
EECON1bits.WPROG = 1;
EECON1bits.WREN = 1;
INTCONbits.GIE = 0;
_asm
MOVLW 0x55
MOVWF EECON2,BANKED
MOVLW 0xAA
MOVWF EECON2,BANKED
_endasm
EECON1bits.WR = 1;
INTCONbits.GIE = 1;
EECON1bits.WPROG = 0;
EECON1bits.WREN = 0;
フラッシュメモリから読み取る
_asm
MOVLW 0x00
MOVWF TBLPTRU,BANKED
MOVLW 0xB2
MOVWF TBLPTRH,BANKED
MOVLW 0x2A
MOVWF TBLPTRL,BANKED
READ_WORD:
TBLRDPOSTINC
MOVF TABLAT, 0,BANKED
MOVWF WORD_EVEN,ACCESS
TBLRDPOSTINC
MOVF TABLAT, 0,BANKED
MOVWF WORD_ODD,ACCESS
_endasm
printf("\r\n");
PrintChar(WORD_EVEN);
printf("\r\n");
PrintChar(WORD_ODD);
元のコードは第 6 章のデータシートにありますが、C で使用できるように少し変更する必要があったことを思い出してくださいACCESS
。BANKED
問題。