2

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 で使用できるように少し変更する必要があったことを思い出してくださいACCESSBANKED問題。

4

1 に答える 1

2

すでに解決策にたどり着いたようです。問題は の使用にありBANKEDます。

EECON2などは、バンク 15 に常駐する特殊機能レジスタ (SFR) です。それらにアクセスする最速の方法はACCESS、アドレスを計算する際にバンク レジスタを無視する を使用することです。

使用しているアセンブリ言語のように見えますが、ACCESS0 とBANKED1 を意味します。これらの値のいずれかがmovwf命令に必要です。データシートの例では、記号定数ではなく実際の数値を使用しています。

データシートには、RAM のバンク方法も説明されています。

基本的に、バンク 0 から 15 を表す 4 ビットを保持する as レジスターがあります。この番号は、命令に指定された 8 ビット番号の先頭に追加され、12 ビットすべてを示します。これにより、より高速な実行が可能になります。正しい場所に保存するには、最初にこのレジスタを正しいバンクに設定する必要があります。

0 と 15 の 2 つのバンクは、汎用レジスタと特殊機能レジスタにもマップされます。これらは最も頻繁に使用されるため、アドレスを計算する際にバンク レジスタを無視する命令でフラグを使用し、必要な GPR または SFR に直接移動することで、これらにすばやくアクセスできます。

問題は、レジスタが存在する場所とは異なるメモリバンクを使用するようにフラグを設定していたことです。

于 2013-08-13T04:04:42.117 に答える