2016-08-17 5 views
0

私は、受信した送信の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 (何か他のもの)..しかしそれは起こらなかった。

私は何が欠けていますか?それとも私はそれを間違ってやっているのですか?

+0

私は8051を知りませんが、メモリマップの登録方法についての簡単なgoogleは、 ://what-when-how.com/8051-microcontroller/8051-register-banks-and-stack/)あなたのコードはレジスタバンク0を使用していますか?そうでない場合、 'R0'はアドレス0x00' –

+0

それは銀行に入れられており、私はデフォルトの銀行を使用していると確信しています – RedSmolf

+0

あなたは 'R0'を変更するとどのようなアドレスが値を変更しますか? uld sanity-デバッガでそれを確認してください、そうですか?あなたの質問を読んで、私は推測する必要がありますが、デフォルトの動作は、あなたのデータセグメントをレジスタバンクと重複させることではありません。デバッガを使用して、 'RX_Message'にアクセスする命令によって実際にどのアドレスが使用されているのか確認できますか?リンクした後に何が起こったのか把握しますか? –

答えて

0

解決策.. 割り込みは私が重要だとは思わなかったので言及しませんでした。スタックを再配置するコードを追加することで問題は解決しました。リンカーが私のRX_Messageラベルをスタックのデフォルトアドレスに置いていないことを期待しました..

関連する問題