私は、受信した送信のUARTバッファ(S0BUF)を読み取って、ボタンを押すとUART経由で返信する簡単なプログラムをやっています。 Nordic SemiconductorのnRF24LE1チップを使用しています。DSステートメントで定義されたデータ
私はCで動作するようになりました.R0〜R7レジスタの1つを使用すると動作します。 私がしたいのは、通常のRレジスタの代わりにリロケータブルバイトを使用することです。
以下は、動作するコードスニペットです。
UART_ISR: ; (Store incoming transmission in R0)
JNB RI0, UART_ISR_A
MOV R0, S0BUF
SETB P00
CLR RI0
JMP UART_ISR_END
UART_ISR_A:
SETB P01
CLR TI0
UART_ISR_END:
RETI
Main:
MOV A, P2
XRL A, #0x0FE
JZ Main_Case_A
XRL A, #(0x0FE XOR 0x0FD)
JZ Main_Case_B
...
Main_Case_A:
MOV S0BUF, R0
SJMP Main
しかし、私は(< ---これでマークされた)次の変更も文句を言わない作業を行う場合。私はこの断片の中にいくつかのセグメントやものを紛失していることを知っていますが、私は多くの行を望んでいません。
?DT?Data segment data ; <--- THIS
rseg ?DT?Data ; <--- THIS
RX_Message: ds 1 ; <--- THIS
UART_ISR: ; (Store incoming transmission in R0)
JNB RI0, UART_ISR_A
MOV RX_Message, S0BUF ; <-- THIS
SETB P00
CLR RI0
JMP UART_ISR_END
UART_ISR_A:
SETB P01
CLR TI0
UART_ISR_END:
RETI
Main:
MOV A, P2
XRL A, #0x0FE
JZ Main_Case_A
XRL A, #(0x0FE XOR 0x0FD)
JZ Main_Case_B
...
Main_Case_A:
MOV S0BUF, RX_Message ; <--- AND THIS
SJMP Main
警告とエラーは発生しませんが、結果は同じではありません。
私が望むのは、RX_Messageバイトを置く場所をアセンブラ/リンカが決定するようにすることです。 リストファイルを見ると、どこにでもR0を使用していないので、アドレス0x00に割り当てられていることがわかります。私はどこでもR0を使用していません。しかし、私はどこかでR0を使用するとRX_Messageアドレスを0x01 (何か他のもの)..しかしそれは起こらなかった。
私は何が欠けていますか?それとも私はそれを間違ってやっているのですか?
私は8051を知りませんが、メモリマップの登録方法についての簡単なgoogleは、 ://what-when-how.com/8051-microcontroller/8051-register-banks-and-stack/)あなたのコードはレジスタバンク0を使用していますか?そうでない場合、 'R0'はアドレス0x00' –
それは銀行に入れられており、私はデフォルトの銀行を使用していると確信しています – RedSmolf
あなたは 'R0'を変更するとどのようなアドレスが値を変更しますか? uld sanity-デバッガでそれを確認してください、そうですか?あなたの質問を読んで、私は推測する必要がありますが、デフォルトの動作は、あなたのデータセグメントをレジスタバンクと重複させることではありません。デバッガを使用して、 'RX_Message'にアクセスする命令によって実際にどのアドレスが使用されているのか確認できますか?リンクした後に何が起こったのか把握しますか? –