一種實(shí)用的PIC編程器的設(shè)計(jì)
3.2 PC指針的處理及尋址方法
在對(duì)其編程的過(guò)程中,需要知道當(dāng)前PIC的PC指針指向的Flash存儲(chǔ)區(qū)單元地址,也就是當(dāng)前的操作單元。由于無(wú)法直接讀取其PC指針的值,故采用在 89C5l的RAM區(qū)定義一個(gè)變量用來(lái)記錄PIC的PC指針(12位,占用2字節(jié))。該變量的值始終和PIC的PC指針一致,讀取該值便可取得當(dāng)前所操作的PIC的Flash存儲(chǔ)單元地址。
變量的操作應(yīng)該遵循如下運(yùn)算規(guī)則:
①只有“加1”這一種運(yùn)算;
②03FF+1=0000(03FF為PIC10F202的存儲(chǔ)器末地址)}
③當(dāng)變量的值不等于03FF時(shí),其“加l”運(yùn)算與指針值“加1”同步;
④初始情況下,指針的值指向03FF。
PICl0F202的Flash單元地址為0000H~03FFH。在以上運(yùn)算規(guī)則下,記錄PC指針的變量值也只能是0000H~03FFH,通過(guò)“加1”運(yùn)算即可尋址到每一個(gè)Flash存儲(chǔ)單元。
3.3 數(shù)據(jù)的讀取
從Flash存儲(chǔ)單元中讀取數(shù)據(jù)位的方法:先是6個(gè)時(shí)鐘下降沿輸入6位命令字,在接收到這個(gè)命令字后,PIC將當(dāng)前PC指針?biāo)鶎?duì)應(yīng)ROM存儲(chǔ)單元的值按位由ISDAT輸出。在第6個(gè)下降沿結(jié)束后,經(jīng)延時(shí),在時(shí)鐘脈沖每個(gè)上升沿對(duì)ISDAT采樣,一共16個(gè)上升沿,輸出16位的數(shù)據(jù)。第2~13位是12位的數(shù)據(jù);14、15位無(wú)效;首位和末位分別是起始位和結(jié)束位,如圖5所示。
讀取數(shù)據(jù)時(shí)有兩點(diǎn)值得注意:
①命令字的輸入和其他操作相同,但數(shù)據(jù)輸出時(shí)是上升沿有效;
②由于01FFH和0204H是系統(tǒng)預(yù)定值單元,當(dāng)尋址到這兩個(gè)單元時(shí),執(zhí)行讀取指令后必須保留其內(nèi)容,以便編程時(shí)恢復(fù)。
3.4 寫入Flash方法
數(shù)據(jù)寫入Flash的過(guò)程如下:
每次導(dǎo)入一個(gè)字節(jié)的數(shù)據(jù)(12位),輸入開始寫入的指令碼,經(jīng)過(guò)一段時(shí)間參數(shù)的延時(shí),再輸人結(jié)束寫入指令碼,就完成一個(gè)字節(jié)的寫入過(guò)程。但需要注意的是,無(wú)論是數(shù)據(jù)讀取還是寫入,都是對(duì)當(dāng)前PC指針?biāo)赶虻腇1ash單元進(jìn)行的;而且數(shù)據(jù)寫入只有在當(dāng)前存儲(chǔ)單元已經(jīng)被擦除的情況下才可以正確地實(shí)現(xiàn)。
指令輸入形式(如芯片擦除、開始寫入、結(jié)束寫入和地址加1等)可以查得其命令宇,其輸入方法與圖4和圖5類似,每個(gè)指令都需要時(shí)鐘脈沖的6個(gè)下降沿輸入。僅有“導(dǎo)入數(shù)據(jù)”和“讀取數(shù)據(jù)”2條命令需要后跟數(shù)據(jù)字節(jié),其他的指令在輸入完成后,經(jīng)延時(shí),便可以進(jìn)行下一條指令的輸入。字節(jié)寫入流程如圖6所示。
3.5 配置字編程及代碼保護(hù)的處理
配置字是關(guān)于PIC的設(shè)置,包括是否使能看門狗,是否采用I/O弱上拉,以及MCLR引腳的配置等。配置字在03FFH單元,PIC進(jìn)入編程模式時(shí),配置字單元就是Pc指針?biāo)赶虻膯卧E渲米值膶懭敕椒ㄅc一般的代碼寫入方法一致。一旦設(shè)置了代碼保護(hù),用戶代碼空間的0040H以上的字節(jié)讀出為“0”,其他的配置空間依舊可以正確讀出,包括配置字單元和用戶ID區(qū)。配置字可以被多次寫入,但是在任何情況下擦除配置字單元,用戶儲(chǔ)存區(qū)的代碼也同時(shí)被擦除??梢酝ㄟ^(guò)圖7的方法解除代碼保護(hù),但是這樣的處理會(huì)將整個(gè)Flastl存儲(chǔ)空間全部清除,所以在代碼保護(hù)使能的情況下,是不可能正確讀取代碼值的。即使可以重寫配置字,但是重寫過(guò)程中代碼已經(jīng)被清除。
3.6 預(yù)定值的處理
每個(gè)PIC芯片都沒(méi)有廠家設(shè)定的預(yù)定值。這些值是不應(yīng)該被更改的,否則PIC芯片就無(wú)法正常工作。ROM區(qū)的01FFH單元保存復(fù)位向量,系統(tǒng)復(fù)位后,PC 指針將指向該單元。0204H單元保存著OSSCAL的值。這兩個(gè)單元的值應(yīng)該先讀出并且保存在一個(gè)臨時(shí)單元(因?yàn)樵谛酒脸倪^(guò)程中會(huì)丟失),待到需要編程的代碼執(zhí)行完畢,再?gòu)呐R時(shí)單元讀出并寫入相應(yīng)的位置。其實(shí)際過(guò)程就是一個(gè)“讀取保存恢復(fù)”的過(guò)程。
要讀取預(yù)定值,首先必須尋址到預(yù)定值所在的單元。其尋址的過(guò)程如圖8所示:進(jìn)入編程模式后,此時(shí)指向的存儲(chǔ)單元是03FFH,89C51中記錄PC指針的變量的值也應(yīng)該設(shè)置成03FF。按照該變量的運(yùn)算規(guī)則,執(zhí)行地址加1指令,變量值也加1,并查詢當(dāng)前變量的值,直到所需的存儲(chǔ)單元為止?;謴?fù)的過(guò)程是先尋址到01FF和0204單元,然后把保留的值寫入,具體流程與圖8類似。
評(píng)論