發新話題
打印

請教有關keil C和C8051F330的一些問題

請教有關keil C和C8051F330的一些問題

先說明我的狀況:
我使用C8051F330來和週邊IC溝通,IC本身有其它功能且有ADC功能和一些監控IC狀態的功能,
它們被放在IC內部的Register,所以我用MCU的I/O to I2C去和IC做通訊傳輸,讀取ADC的值和IC的

狀態
部分程式如下(我只擷取相關部分,其它地方我都確定過沒問題):

unsigned char xdata Data_buf[128];          //這邊是確定用外部RAM,沒顯示的變數基本上是宣告

data
unsigned char xdata monitor[20];       

I2CReadByte(0x9C,0x50,&Data_buf[0],11,0);   // I/O to I2C的function寫在別處
for(n=0;n<11;n++)
        monitor[n]=Data_buf[n];      //把I/O to I2C接收到的值轉到暫存器monitor

中間有delay

I2CReadByte(0x9C,0x3C,&Data_buf[18],1,0);   // 這邊用Data_buf[18]是為了和上面做區別
c = Data_buf[18]&0x01;

以上是我測試過後,才更改的,所以以上是不會出現問題的code
但是當我把"I2CReadByte(0x9C,0x3C,&Data_buf[18],1,0);"裡面的Data_buf[18]改成Data_buf[0]時,

就有錯誤
有時會讀到正確的值,有時會讀到錯誤的值:0x40
讀到錯誤的機率很高,原本是想說I/O to I2C可能有問題,但是換個register就沒問題
後來發現,Data_buf[0]裡面的0改成1~10都會受到影響,而這個剛好是前面的I2CReadByte會去接

收data的暫存值
只要不是這些暫存值,基本上,下一個I2CReadByte出來的值就不會產生錯誤,
但是為什麼會發生這樣的錯誤呢??
是因為
for(n=0;n<11;n++)
        monitor[n]=Data_buf[n];
這個program會使得monitor和Data_buf所存放的記憶體位址link在一起嗎??
而造成Data_buf的值改變後,monitor的值也跟著改變
或是有其他的原因呢??

程式compile結果:
Program Size: data=209.2 xdata=424 code=7122     

謝謝!!

TOP

你的問題敘述無法立即看出問題的原因,你可先試試將 Data_buf[] 定義成全區域變數看看。
若還是無法解決,可以聯絡 2788-5511#1834 卜小姐,詢求 Debug 協助。

TOP

發新話題