中文字幕无码不卡一区二区三区_少妇被又大又粗又爽毛片久久黑人_91精品国产在热久久无毒不卡_久久久久久亚洲综合网站

技術(shù)熱線: 4007-888-234

專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命

提供開發(fā)工具、應(yīng)用測(cè)試 完善的開發(fā)代碼案例庫(kù)分享

從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無(wú)限潛能!

技術(shù)支持

靈活使用PIC16C57的PROGRAM MEMORY

更新時(shí)間: 2019-01-05

當(dāng)您使用Microchip公司的PIC16C57單片機(jī)在設(shè)計(jì)程式時(shí),是否被它的PROGRAM MEMORY需分PAGE使用,而PAGE之設(shè)定又影響到goto、call、addwf 2、movwf 2四個(gè)指令之執(zhí)行結(jié)果而困擾不已呢?以下是小弟領(lǐng)悟出來(lái)的一點(diǎn)心得,在此野人獻(xiàn)曝,與大家分享。

PIC16C57單片機(jī)之PROGRAM MEMORY共有2 K words,分為四個(gè)PAGE,每個(gè)PAGE有512個(gè)words;goto、call、addwf 2、movwf 2四個(gè)指令之執(zhí)行,會(huì)改變PROGRAM COUNTER內(nèi)容,其結(jié)果也受STATUS WORD REGISTER f3之bit 6, 5的影響,如圖(一)所示;改變STATUS WORD REGISTER之bit 6, 5以下一律以”PAGE(的)控制”稱呼。 除此之外,每個(gè)PAGE分為前半部及後半部,call、addwf 2、movwf 2三個(gè)指令執(zhí)行結(jié)果只會(huì)跳到某一PAGE內(nèi)的前半部,因?yàn)檫@三個(gè)指令執(zhí)行後會(huì)使PROGRAM COUNTER的bit 8變?yōu)?,而goto指令則不受限制,可跳到一個(gè)PAGE之前、後半部。

PROGRAM MEMORY位址7FF是reset後第一個(gè)被執(zhí)行的指令,正常情況下放入goto指令,而且STATUS WORD REGISTER bit 6, 5在 reset後全變?yōu)?,所以這個(gè)goto指令會(huì)使程式跳到PAGE 0去執(zhí)行。至於要goto到何處?我們先以main 的label來(lái)代表,下文再繼續(xù)討論。 結(jié)構(gòu)化的程式撰寫是由主程式呼叫許多副程式組成的,為了能善用這四個(gè)PAGE,又不要讓程式在呼叫副程式時(shí)或做goto之前也要同時(shí)注意PAGE的設(shè)定值,我對(duì)PAGE 0做以下安排:PAGE 0的前半部先存放所有的第一階(即主程式直接呼叫的)副程式,接下來(lái)才存放主程式,上一段所提及的label—main就是安排在這個(gè)地方;整段主程式只能放在PAGE 0內(nèi),否則分置於兩個(gè)PAGE內(nèi)的goto指令前需有不同的PAGE控制,此舉不但麻煩又易出錯(cuò),尤其是尚在發(fā)展更改中的程式,更難掌握。

當(dāng)上述的第一階副程式太大或太多,以致無(wú)法全部放入PAGE 0的前半部時(shí),或是會(huì)造成主程式分跨於PAGE 0與PAGE 1時(shí),就要將部分副程式的”身體”移到別的PAGE中,但”頭”仍需保留在PAGE 0的前半部,”頭”是個(gè)重要的媒介,其任務(wù)就是要把副程式導(dǎo)引到正確的PAGE上執(zhí)行;而被移走的副程式其”尾”(retlw之前)需加上指令,把PAGE的控制轉(zhuǎn)回PAGE 0;如此安排,主程式就不用管它所呼叫的副程式”主體”究竟位於哪個(gè)PAGE上了。請(qǐng)參考如下範(fàn)例:

LIST p=16c57 ;** ORG 0 ;page 0前半部 ;** init: ;副程式的”頭 bsf STATUS,5 ;page selector point to page 1 goto sub1_1 ;———————————————————————————————————————————————— tx: ;副程式的”頭 bsf STATUS,6 ;page selector point to page 2 goto sub2_1 ;———————————————————————————————————————————————— rx: ;副程式的”頭 bsf STATUS,6 ;page selector point to page 2 goto sub2_2 ;———————————————————————————————————————————————— rd_eeprom: ;副程式的”頭 bsf STATUS,5 ;page selector point to page 3 bsf STATUS,6 goto sub3_1 ;———————————————————————————————————————————————— ……………… ;其它的第一階副程的”頭” ;========================================================= main: ;

主程式 ……………… call init ;直接呼叫,不必管PAGE問題 ……………… call rd_eeprom ;直接呼叫,不必管PAGE問題 ……………… call tx ;直接呼叫,不必管PAGE問題 ……………… call rx ;直接呼叫,不必管PAGE問題 ……………… ;** ORG 0x200 ;page 1前半部 ;此前半部可用以放置第二階副程式,而且是僅接受PAGE 1程式的呼叫;同樣的,這些副程式進(jìn)入點(diǎn)也需全部位於PAGE 1的前半部,否則會(huì)被呼叫不到;如此規(guī)劃,對(duì)PAGE的控制才會(huì)單純。 ;———————————————————————————————————————————————— rout1_1: ……………… retlw 0 ;如此規(guī)劃不必更改PAGE控制 ;———————————————————————————————————————————————— rout1_2: ……………… retlw 0 ;如此規(guī)劃不必更改PAGE控制 ;=========================================================

sub1_1: ;副程式的”身體” ……………… call rout1_1 ……………… call rout1_2 ……………… bcf STATUS,5 ;page selector point to page 0 retlw 0 ;** ORG 0x400 ;page 2前半部 ;此前半部的規(guī)劃與PAGE 1同 ;———————————————————————————————————————————————— sub2_1: ;副程式的”身體” ……………… bcf STATUS,6 ;page selector point to page 0 retlw 0 ;———————————————————————————————————————————————— sub2_2: ;副程式的”身體” ……………… bcf STATUS,6 ;page selector point to page 0 retlw 0 ;** ORG 0x600 ;page 3前半部 ;此前半部的規(guī)劃與PAGE 1同 ;————————————————————————————————————————————————

sub3_1: ;副程式的”身體” ……………… bcf STATUS,5 ;page selector point to page 0 bcf STATUS,6 retlw 0 ;** ORG 0x7FF ;reset vector goto main ;*

  • END 上例中將PAGE 1、2、3的前半部?jī)?yōu)先放置第二階副程式,而且此副程式只由同一PAGE中的第一階副程式所呼叫使用;若其它PAGE也有第一階副程式需用到此第二階副程式,那就把有此需要的第一階副程式搬來(lái)同一PAGE吧。如此用心良苦有以下幾個(gè)好處:1、第一階副程式可直接call第二階副程式,不用改變PAGE的控制,2、第二階副程式執(zhí)行結(jié)束時(shí)只需retlw,也不用改變PAGE的控制,3、PAGE的管理單純,不易出錯(cuò),4、整個(gè)程式碼可減少bcf SATUS,5、bcf STATUS,6、bsf STATUS,5、bsf STATUS,6的數(shù)量;當(dāng)主程式也有必要直接呼叫此第二階副程式時(shí),可以有兩種做法,第一種做法可以保持程式PAGE管理的一致性,就是為主程式另外設(shè)計(jì)一個(gè)第一階副程式,來(lái)間接呼叫這個(gè)第二階副程式,這會(huì)增加5個(gè)(若這個(gè)第二階副程式在PAGE 3則需再加2個(gè))指令及其執(zhí)行時(shí)間,第二個(gè)做法就是破壞原則,由主程式直接呼叫,但在call指令的前後需加上PAGE控制,這種做法有其缺點(diǎn),就是當(dāng)此第二階副程式被移到別的PAGE時(shí),主程式內(nèi)所有為呼叫該第二階副程式所做之PAGE控制,全需因應(yīng)修改,而且呼叫的次數(shù)愈多,PAGE控制也跟著多,修改起來(lái)也更費(fèi)事且易出錯(cuò);兩種做法各有其利弊,何者適用則全由閣下視情況自行判斷選擇了。

程式組譯(assemble)完一定要開啟listing檔(副檔名.lst),看看有無(wú)跨PAGE的現(xiàn)象,有的話就要調(diào)整該P(yáng)AGE內(nèi)一部分的副程式到別的PAGE,同時(shí)被搬動(dòng)過(guò)的副程式的”頭”及”尾”也需因應(yīng)修改,同時(shí)要注意的是,是否把相對(duì)應(yīng)的第二階副程式也一齊搬動(dòng);另外要看看副程式(第一階或第二階)之進(jìn)入點(diǎn),有沒有落於每個(gè)PAGE的前半部(即Address的bit 8為0的區(qū)域),沒有的話也要調(diào)整以消除此現(xiàn)象,不然會(huì)造成呼叫不到的bug。現(xiàn)在將以上程式PAGE安排原則總結(jié)如下:一、PAGE 0的前半部先放第一階副程式的”頭”(若空間足夠也可放整個(gè)副程式),”頭”負(fù)責(zé)把PAGE控制轉(zhuǎn)到該副程式的”身體”所座落之PAGE。二、接下來(lái)放置主程式,主程式需全部置於PAGE 0內(nèi)。三、第一階副程式的”身體”可置於任一PAGE內(nèi),該副程式的”尾”負(fù)責(zé)把PAGE控制轉(zhuǎn)回PAGE 0。四、第二階副程式與呼叫它的第一階副程式放在同一PAGE內(nèi)。五、呼叫第二階副程式不用改變PAGE控制(例外:主程式的呼叫);第二階副程式的”尾”也不用改變PAGE控制。六、所有的副程式,不管是第一階或第二階,其進(jìn)入點(diǎn)皆需位於每一PAGE的前半部。如此安排後,對(duì)副程式的呼叫均不需處理PAGE控制,此控制是由副程式的”頭”及”尾”處理掉了;而主、副程式當(dāng)中的goto指令就可安心使用,不虞會(huì)GOTO到錯(cuò)誤的PAGE上。以上安排是不是會(huì)讓您安心撰寫程式而不用擔(dān)心PAGE的控制呢?如果您發(fā)現(xiàn)到更好的方法也請(qǐng)不吝指教,謝謝!

404
返回首頁(yè) |  返回上一頁(yè)
西丰县| 泸州市| 靖宇县| 昌邑市| 周宁县| 西盟| 青田县| 青田县| 夹江县| 临沭县| 石泉县| 牡丹江市| 海城市| 吉林省| 郑州市| 句容市| 洮南市| 休宁县| 四川省| 台东县| 铜川市| 鹿邑县| 九龙城区| 文山县| 临夏市| 洪泽县| 城步| 紫阳县| 班戈县| 伽师县| 浑源县| 石棉县| 洛隆县| 安新县| 梓潼县| 正镶白旗| 三穗县| 紫云| 高邮市| 茶陵县| 许昌市|