Re: 使用MCC,XC8的DATAEE操作

作者 b9015038 於 2018年01月03日 09:41:25
計算完暫存器值之後我是有用union放啦…
長得大概像這樣:

baudrate
.int16=0x67
SP1BRGL
= baudrate.L;
SP1BRGH = baudrate.H;


不過後來發現和這邊沒什麼關係…

我請同事幫忙看,他說PIC18F67K40是新的架構,
EE操作,MCC產生的Code大概是這樣

uint8_t DATAEE_ReadByte
(uint16_t bAdd)
{
    
NVMADRH = ((bAdd >> 8) & 0x03);
    
NVMADRL = (bAdd & 0xFF);
    
NVMCON1bits.NVMREG = 0;
    
NVMCON1bits.RD = 1;
    
NOP();  // NOPs may be required for latency at high frequencies
    
NOP();
    return (
NVMDAT);
}


查一下spec,操作Flash, EE, ConfigBit時,要指定NVMCON1bits.NVMREG

然後MCC產出的Code,做了NVMCON1bits.NVMREG = 0;之後,竟然沒有把值設回來!

Errata裡是有提一下:
引用:
3. Module: PIC18 Core
3.1 TBLRD requires NVMREG value to point to
appropriate memory
The affected silicon revisions of the PIC18FXXK40
devices improperly require the NVMREG<1:0>
bits in the NVMCON register to be set for TBLRD
access of the various memory regions. The issue
is most apparent in compiled C programs when the
user defines a const type and the compiler uses
TBLRD instructions to retrieve the data from
program Flash memory (PFM). The issue is also
apparent when the user defines an array in RAM
for which the complier creates start-up code,
executed before main(), that uses TBLRD
instructions to initialize RAM from PFM.


但照著說明設定linker的errata選項,感覺只是讓預設值切到指向flash而已 (不設定的話,一開始用string相關操作就會錯...)

這種錯發生之後也沒有什麼提示,程式也還會跑,但是字串操作的lib都會出錯(如strcpy, strcat, strcmp之類的)

設中斷下去看也只知道執行上面function結果不對,但不知道原因

要自行設定NVMCON1bits.NVMREG這件事,實在是很糟糕的設計,感覺好像為了cost down改用一個控制器來切換,再加上MCC這個豬隊友,真的是坑死人

這種PIC架構換代的部份,有個列表說明差異嗎?
比如說我用PIC18F67K22時,EE操作就和上面的方式差很多

繼續抱怨一下,MCC產出的Bootloader, 竟然暫存器名字給錯,產出的code compile後就直接ERROR,問題參考這個連結

版主也說這個開發環境不要用新版的,那有什麼版是能用的啊...,bug遍地,踩不完的雷,苦命的攻城獅啊~

來自: http://www.microchip.com.tw/newbb/viewtopic.php?forum=1&topic_id=22165&post_id=77643