:::


Browsing this Thread:   1 Anonymous Users






PIC16F18345 User ID修改
#1
高級會員
高級會員


查看用戶資訊
目前我想要使用bootloader方式來修改User ID碼
使用NVM方式一直無法修改User ID
在PIC16F18345 datasheet中
TABLE 11-2寫只能Read
TABLE 11-3卻寫Read與Write
那到底可不可以write嗎,一直試不出來
有人可以提供給我使用NVM修改User ID的方式嗎

發表於: 2018/7/6 15:21
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: PIC16F18345 User ID修改
#2
版主
版主


查看用戶資訊
建議使用 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 (addressvalue);
             
// Reading the value from address 0xE5
    
value eeprom_read (address);
}


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

發表於: 2018/7/12 12:17
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: PIC16F18345 User ID修改
#3
版主
版主


查看用戶資訊
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=0j<=302j++) *RAMPTR++ = *ROMPTR++;

    
NOP( );
    while(
1);
}

發表於: 2018/7/12 13:24
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
You cannot start a new topic.
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]