會員登陸
帳號:

密碼:

記住我



忘記密碼?

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


正在流覽:   1 名訪客





PIC16F18345 User ID修改
高級會員
註冊日期:
2006/06/06 08:38
所屬群組:
註冊會員
文章: 99
等級: 8; EXP: 94
HP : 0 / 198
MP : 33 / 7232
離線
目前我想要使用bootloader方式來修改User ID碼
使用NVM方式一直無法修改User ID
在PIC16F18345 datasheet中
TABLE 11-2寫只能Read
TABLE 11-3卻寫Read與Write
那到底可不可以write嗎,一直試不出來
有人可以提供給我使用NVM修改User ID的方式嗎

7月06日 15:21:04
轉換PDF檔 列印


Re: PIC16F18345 User ID修改
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14528
等級: 73; EXP: 10
HP : 1081 / 1802
MP : 4842 / 76662
離線
建議使用 EEPROM 來存 ID 會比較方便的。透過 XC8 來對 EEPROM 的支援,可以直接定義 EEPROM 的初始設定資料,這初始資料會存在編譯後的 HEX 檔裡,燒錄程式時會稍在 EEPROM 的位置。

存取或修改這些 EEPROM 資料也是很簡單的,XC8 有提供 EEPROM 的函數可直接讀取或修改 EEPROM 的內容。

使用 __EEPROM_DATA( ) 的巨集
擺放位址從 EEPROM 0x00 的位址開始

範例
:
#include     <xc8.h>
__EEPROM_DATA(0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07);
__EEPROM_DATA(0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F);

==========================================

使用 eeprom_write( ) & eeprom_read( ) 來存取 EEPROM 的資料

#include <xc.h>

int main ()
{    
    
volatile unsigned char value = 0x09;    
    
unsigned char address = 0xE5;    
            
// Writing value 0x9 to EEPROM address 0xE5
    
eeprom_write (address, value);
            
// Reading the value from address 0xE5
    
value = eeprom_read (address);
}


以上 EEPROM 的使用方法可以參考 XC8 的中文教育訓練課程裡的 Page 72 ~ Page 73 的說明。

7月12日 12:17:43
轉換PDF檔 列印


Re: PIC16F18345 User ID修改
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14528
等級: 73; EXP: 10
HP : 1081 / 1802
MP : 4842 / 76662
離線
PIC16F1xxxx 的加強型中階 MCU 有心的 Table Read Flash 的功能,可以使用 FSR0H + FSR0L 來做索引定址到 32KW 的 Flash Memory.

至於要寫入到 NVM (Flash) 裡就只能用傳統方式來寫 Flash。這方法就要參考 Data Sheet 11.4 的說明。NVM 架構是採用 block 的架構,需先將欲寫入的 Block 先做 Erase 的動作後方可以寫入,且一次必須寫一個區塊。

建議如果要將 ID 放在 NVM 裡,初始資料可以用 const 的定義擺在 Flash 陣列裡,使用索引方式讀取 NVM 的資料。但要更改 NVM 裡的 ID 就只能依據 Data Sheet 的方式修改。

有關索引定址的方式可以參考 XC8 教育訓練課程,底下為參考程式:

#include <xc.h>


// ************ 設定 PIC16F1937 Configuration Bits  ******

__CONFIG  ( FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_ON & CP_OFF & BOREN_ON & CLKOUTEN_ON
           
& IESO_OFF & FCMEN_OFF & FCMEN_OFF );
__CONFIG ( PLLEN_ON & STVREN_OFF & BORV_HI & LVP_OFF);


const
unsigned char Lookup_Table[ ]  =
    {
0xA0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
    
18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,
    
34,35,36,37,38,39,40,41,42,43,44,45,56,57,48,49,50,
    
51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,
    
68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,
    
84,85,86,87,88,89,80,91,92,93,94,95,96,97,98,99,100,
    
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
    
18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,
    
34,35,36,37,38,39,40,41,42,43,44,45,56,57,48,49,50,
    
51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,
    
68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,
    
84,85,86,87,88,89,80,91,92,93,94,95,96,97,98,99,100,
    
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
    
18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,
    
34,35,36,37,38,39,40,41,42,43,44,45,56,57,48,49,50,
    
51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,
    
68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,
    
84,85,86,87,88,89,80,91,92,93,94,95,96,97,98,99,100,
    
0xAA,0xAB};

unsigned char Input_Buffer[320] @0x2100;
const
unsigned char *near ROMPTR;
unsigned char *near RAMPTR ;           // PTR 指標位址設在 Common Memory
near unsigned int j ;            // 變數 j 放在 Common Memory

void main(void)
{
    
ROMPTR = Lookup_Table ;
    
RAMPTR = Input_Buffer ;
    for (
j=0; j<=302; j++) *RAMPTR++ = *ROMPTR++;

    
NOP( );
    while(
1);
}

7月12日 13:24:40
轉換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