會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





使用MCC,XC8的DATAEE操作
高級會員
註冊日期:
2008/04/13 16:02
所屬群組:
註冊會員
文章: 104
等級: 9; EXP: 20
HP : 0 / 205
MP : 34 / 6349
離線
我用
XC8 1.44
MCC 3.36
MPLAB 3.65
PIC18F67K40

從MCC中選擇MEMORY,得到:

void DATAEE_WriteByte
(uint16_t bAdd, uint8_t bData)
uint8_t DATAEE_ReadByte(uint16_t bAdd)


然後從XC8說明裡,看到有:

#include <xc.h>
unsigned char eeprom_read(unsigned char address);
void eeprom_write(unsigned char address, unsigned char value);


其實目前問題是我想在程式執行中儲存外部參數,來變更Uart的baudrate,在剛上電時讀取此參數來初始化Uart (Uart也從MCC產生)

所以我把原產生的Init改為

void EUSART1_Initialize
(uint32_t _baud)

在裡面算出對應的SP1BRGL、SP1BRGH後套用

但現在發現只要在呼叫EUSART1_Initialize前使用DATAEE_ReadByte就會出錯(剛上電,進入while(1)前的初始化),
若不操作DATAEE_ReadByte,直接給固定值就會正常

試了半天,原本baudrate是放在uint24_t(因會到115200,大於65535),然後用atol來轉,因DATAEE_ReadByte一開始值是0xff,不確定這0xFFFFFF拿去轉會不會出事,因為看英文版論壇說uint24_t不是標準的,不建議使用,在header中也看到用#ifndef __CCI__包住,不知是幹麼的

想問一下:
- 正常想操作PIC內建的EE要用什麼操作?MCC產生的和XC8提供的有什麼不同?

- atol, atoi之類的function,因為看不到實作(只能追到header),如果輸入變數為0xfff...,會不會有異常?


用MCC產生完Code之後,實在不想去改裡面的內容,怕出怪問題,但生出的code又不符合需求得改,用得提心吊膽的...

1月02日 17:19:51
轉換PDF檔 列印


Re: 使用MCC,XC8的DATAEE操作
資深會員
註冊日期:
2012/05/04 19:18
所屬群組:
註冊會員
文章: 203
等級: 13; EXP: 28
HP : 0 / 307
MP : 67 / 5865
離線
覺得你可以用uint32_t的data type來放,
舉個例子115200的baud rate用一個union的架構來做,
union
{
uint32_t BaudRate;
uint8_t Byte[4];
}Uart;

Uart.BaudRate = 115200;


eeprom_write(0x00, Uart.Byte[0]);
eeprom_write(0x01, Uart.Byte[1]);
eeprom_write(0x02, Uart.Byte[2]);
eeprom_write(0x03, Uart.Byte[3]);

Uart.Byte[0] = eeprom_read(0x00);
Uart.Byte[1] = eeprom_read(0x01);
Uart.Byte[2] = eeprom_read(0x02);
Uart.Byte[3] = eeprom_read(0x03);

EUSART1_Initialize(Uart.BaudRate);

1月03日 09:00:09
轉換PDF檔 列印


Re: 使用MCC,XC8的DATAEE操作
高級會員
註冊日期:
2008/04/13 16:02
所屬群組:
註冊會員
文章: 104
等級: 9; EXP: 20
HP : 0 / 205
MP : 34 / 6349
離線
計算完暫存器值之後我是有用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遍地,踩不完的雷,苦命的攻城獅啊~

1月03日 09:41:25
轉換PDF檔 列印


Re: 使用MCC,XC8的DATAEE操作
中級會員
註冊日期:
2015/05/27 22:04
所屬群組:
註冊會員
文章: 48
等級: 5; EXP: 75
HP : 0 / 118
MP : 16 / 1206
離線
一定要存9600,19200,38400,57600,115200 之類的數值嗎?
如果應用上,只有固定的幾種baud rate,
使用簡易對照表,似乎比較方便。
例如:
1, 2, 3, 4, 5
對應
9600,19200,38400,57600,115200
或者9600的倍數作為索引,就是
1,2,4,6,12

做UART初始化時,
從EEPROM或flash內讀出baud rate索引值,
switch case設定UART所需的暫存器
只要程式碼有明確註解,或是利用enum來提高可讀性,使用單byte代表baud rate,未必是不好的。

1月03日 18:25:46
轉換PDF檔 列印


Re: 使用MCC,XC8的DATAEE操作
高級會員
註冊日期:
2008/04/13 16:02
所屬群組:
註冊會員
文章: 104
等級: 9; EXP: 20
HP : 0 / 205
MP : 34 / 6349
離線
使用enum來列舉所有baudrate的確是不錯的做法

只是這樣要取得reg的值要先判斷一次(用switch case)

要查詢參數時,還要再查另一張表來取得對應值(4800,9600,...),否則輸出enum的0,1,2,3還是得用人查表看對應到什麼baudrate

也是要多做些工才能用…

不管哪種其實都不會太麻煩啦…,只是現在這code是MCC產生的,產生之後再去修改就會擔心以後要再變更MCC參數會影響code

MCC既然想當driver產生器,最好還是能儘量提供比較基礎的操作,這樣我們想加東西只要用它的API來組合就好,不要直接修改產出的code,我個人覺得這樣會比較方便使用...

我覺得版主可以開個MCC, Harmony踩雷版,讓大家反應一下遇到的問題,問題集中在一起也比較容易看...

1月04日 11:33:15
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結

網頁捷徑
2018 Winter Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project