當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]筆者在某智能水表開(kāi)發(fā)中使用了EM78P447芯片,對(duì)EM78系列芯片有了較深認(rèn)識(shí),在實(shí)踐中總結(jié)了一些開(kāi)發(fā)此類(lèi)芯片應(yīng)注意的問(wèn)題,同時(shí)給出了應(yīng)用中的編程技巧。 市面上常見(jiàn)的介紹EM78系列的參考書(shū)中,都給出了一些應(yīng)用

筆者在某智能水表開(kāi)發(fā)中使用了EM78P447芯片,對(duì)EM78系列芯片有了較深認(rèn)識(shí),在實(shí)踐中總結(jié)了一些開(kāi)發(fā)此類(lèi)芯片應(yīng)注意的問(wèn)題,同時(shí)給出了應(yīng)用中的編程技巧。
    市面上常見(jiàn)的介紹EM78系列的參考書(shū)中,都給出了一些應(yīng)用實(shí)例,但這些實(shí)例一般程序代碼量較小,功能單一。雖然這些實(shí)例對(duì)于新手確實(shí)起到了很好的作用,但一個(gè)產(chǎn)品可能功能很復(fù)雜,程序可能達(dá)到幾千行,這就會(huì)出現(xiàn)一些短程序中沒(méi)有遇見(jiàn)的問(wèn)題。以筆者的開(kāi)發(fā)為例,程序總共5千多行,有效的匯編語(yǔ)句代碼有3千多行。由于義隆沒(méi)有提供C的編譯環(huán)境,只能以匯編進(jìn)行編碼,而匯編的結(jié)構(gòu)、條理性與C語(yǔ)言比較不是很清晰,再加上EM78單片機(jī)結(jié)構(gòu)的獨(dú)特性,所以當(dāng)程序代碼量較大的時(shí)候總會(huì)出現(xiàn)一些新的問(wèn)題。下面將實(shí)踐中遇到的問(wèn)題及其解決方法總結(jié)一下,以供參考。


1 RAM數(shù)據(jù)的讀取方法
    EM78系列的RAM既可以認(rèn)為是普通單片機(jī)中的RAM,也可以認(rèn)為是寄存器(通用和專(zhuān)用寄存器)。以EM78P447為例,RAM共148×8位,其結(jié)構(gòu)如圖1所示。

    其中地址為20H一3EH,共有124(31×4)個(gè),分布在4個(gè)RAM“體”(Bank)上。4個(gè)體分別標(biāo)記為“BankO(體O)”、“Bankl(體1)”、“Bank2(體2)”、“Bank3(體3)”。當(dāng)程序中用到的變量不多或者數(shù)據(jù)量不是很大時(shí),這種RAM結(jié)構(gòu)對(duì)程序不會(huì)有什么影響,即程序變量能夠分配在一個(gè)Bank中;但是當(dāng)變量較多時(shí),操作起來(lái)將會(huì)有些麻煩,同時(shí)有可能因?yàn)槌绦蛑蠦ank選擇不當(dāng)導(dǎo)致程序出錯(cuò)。筆者覺(jué)得當(dāng)數(shù)據(jù)量較大時(shí),只要是對(duì)數(shù)據(jù)操作,就要先進(jìn)行Bank的選擇。特別是對(duì)子程序而言,一進(jìn)入子程序就要進(jìn)行Bank的選擇,從而控制所操作數(shù)據(jù)的范圍,時(shí)刻要清楚自己操作的數(shù)據(jù)在哪個(gè)Bank內(nèi)。通過(guò)改變“體選碼”,即RSR寄存器的最高2位,來(lái)選擇所要訪問(wèn)的數(shù)據(jù)Bank。下面給出一個(gè)程序來(lái)說(shuō)明。
    BS RSR,7 :到Bank2
    MOV A,0X2F
    AND A,@OB00111111
    MOV OX2E,A
    CALL LCD _LEAR ;調(diào)用顯示屏清零程序
    LCD CLEAR:
    BC RSR,7 ;到Bank0
    BC RSR,6
    MOVA,@OB00000000
    MOV LCd address,A

    ……
    如上面程序所示,在調(diào)用LCD_ CLEAR之前訪問(wèn)了Bank2數(shù)據(jù)區(qū),接著調(diào)用LCD-CLEAR子程序。此時(shí)在子程序內(nèi),若沒(méi)有注意數(shù)據(jù)的Bank問(wèn)題,即沒(méi)有設(shè)置選擇BankO,則原本要對(duì)BankO的數(shù)據(jù)操作則會(huì)發(fā)生在Bank2的相應(yīng)數(shù)據(jù)地址上,從而程序發(fā)生錯(cuò)誤。所以進(jìn)入子程序后,馬上選擇要使用數(shù)據(jù)的Bank,從而防止發(fā)生誤操作EM78系列單片機(jī)的開(kāi)發(fā)語(yǔ)言為匯編語(yǔ)言,所以當(dāng)編寫(xiě)匯編程序時(shí),一定要養(yǎng)成一個(gè)良好的編程習(xí)慣,這非常有利于程序的開(kāi)發(fā)和維護(hù)。筆者建議程序中對(duì)變量按如下操作。
    ①定義變量表。在程序開(kāi)始的地方定義好變量表,為每一個(gè)變量取名,分配地址空間。
    ②相關(guān)變量最好定義在同一Bank內(nèi),這樣當(dāng)對(duì)這些相關(guān)變量操作時(shí)就可以免去選擇Bank的麻煩。
    ③以變量名進(jìn)行操作。不要對(duì)變量的地址直接操作,最好以變量名進(jìn)行操作,這樣當(dāng)變量需要改變名字或者需要更改分配地址時(shí),直接更改變量表即可,而不用更改具體的程序。這點(diǎn)對(duì)于較大的程序非常有利,不但可以增加程序的可讀性,更重要的是提高程序的編寫(xiě)便利性和維護(hù)性。
    以上幾點(diǎn)對(duì)于編寫(xiě)較高質(zhì)量的代碼都非常重要,應(yīng)在具體實(shí)踐中仔細(xì)體會(huì)。

2 程序跨頁(yè)跳轉(zhuǎn)和跨頁(yè)調(diào)用技巧
    首先需要介紹一下EM 78系列單片機(jī)的程序存儲(chǔ)器ROM結(jié)構(gòu)。EM78系列的程序存儲(chǔ)器ROM容量為4K×13位,采用Page(“頁(yè)”)分配原則,就是將4K的程序空間分為4頁(yè),每個(gè)頁(yè)容量為1K。其結(jié)構(gòu)如圖2所示,其中Page0(000H~3FFH)、Pagel(400H~7FFH)、Page2(800H~BFFH)、Page3(COOH~FFFH)。指令系統(tǒng)中的兩條長(zhǎng)距離跳轉(zhuǎn)指令JMP和CALL,所攜帶的地址碼僅僅有l(wèi)O位,210=lK地址空間,即只能在1K的空間內(nèi)跳轉(zhuǎn)。當(dāng)使用JMP指令時(shí),裝入目標(biāo)地址到PC程序指針的低10位;使用CALL指令時(shí),裝入目標(biāo)地址至PC程序指針的低10位,且PC+l壓棧,調(diào)用同1K頁(yè)面內(nèi)的任何程序。PC程序指針(寄存器R2)和堆棧的位數(shù)是12位,即尋址空間分別為4K,一個(gè)程序頁(yè)面為lK。頁(yè)面選擇通過(guò)設(shè)定狀態(tài)寄存器R3的Bit6(PS1)、Bit5(PSO)來(lái)完成。

    在EM447中,當(dāng)需要跳轉(zhuǎn)或調(diào)用不同頁(yè)面的子程序時(shí),則需在調(diào)用前修改R3的PSl、PS0,這樣當(dāng)執(zhí)行IMP指令或CALL指令時(shí)會(huì)將狀態(tài)寄存器R3的PSl、PS0載入PC的A11、A10,所以PC程序指針可以在4K范圍的地址空間內(nèi)自由跳轉(zhuǎn)。
    當(dāng)編寫(xiě)的程序代碼量較大(超過(guò)1K)時(shí),程序跨頁(yè)跳轉(zhuǎn)和跨頁(yè)調(diào)用是避免不了的。在使用JMP指令時(shí),一定要知道將要跳到哪個(gè)Page;使用CALL指令時(shí),一定要知道要調(diào)用的子程序位于哪個(gè)Page中。這樣在使用JMP指令和CALL指令之前必須要設(shè)置PSl和PS0位來(lái)選擇將要跳轉(zhuǎn)或調(diào)用程序的存儲(chǔ)空間。例程如下:
    BS STATUS,PSl ;到Page3
    BS STATUS,PS0
    CALL INIT CLEAR ;調(diào)用初始數(shù)據(jù)清零程序
    CALL SYS INIT ;調(diào)用系統(tǒng)初始化程序
    BC STATUS,PSI ;到Pagel
    JMP SYS_BEGIN ;跳轉(zhuǎn)到系統(tǒng)啟動(dòng)程序
    例程中首先設(shè)置PS相應(yīng)位來(lái)選擇Page3,然后調(diào)用INIT_CLEAR和SYS_INIT,之后選擇Pagel,跳到Pagel中的SYS BEGIN主程序中。對(duì)于較大的程序,這種調(diào)用和跳轉(zhuǎn)是經(jīng)常出現(xiàn)的,所以要求編寫(xiě)程序前必須熟悉程序地址空間的分配。


3 ROM模塊化編程原則
    因?yàn)榱x隆提供的調(diào)試環(huán)境只支持匯編語(yǔ)言,而用匯編語(yǔ)言編寫(xiě)的程序,結(jié)構(gòu)條理性劣于用C語(yǔ)言編寫(xiě)的程序,所以編寫(xiě)程序時(shí)應(yīng)盡可能的將子程序功能模塊化,即以完成某個(gè)功能來(lái)編寫(xiě)子程序,這樣結(jié)構(gòu)清晰、調(diào)用方便。
    筆者在編寫(xiě)程序時(shí),針對(duì)EM78系列單片機(jī)ROM的Page結(jié)構(gòu),將子程序按區(qū)分功能原則分別存放到不同的Page內(nèi),如圖3所示為筆者項(xiàng)目中程序的存儲(chǔ)空間分配。
    圖3中,PageO存放的主要是比較常用的子程序,如系統(tǒng)初始化程序、鍵盤(pán)掃描、液晶顯示等;Pagel存放的是一些數(shù)據(jù)處理程序,如不同Bank的數(shù)據(jù)拷貝,十六進(jìn)制轉(zhuǎn)為二進(jìn)制壓縮BCD碼等程序;Page2存放的加密算法程序,這是筆者項(xiàng)目開(kāi)發(fā)中最重要的部分,所以單獨(dú)的放在一個(gè)Page內(nèi);Page3主要是對(duì)IC存儲(chǔ)器24LC02的一些讀寫(xiě)操作子程序。這樣將功能相近的子程序放在一個(gè)Page內(nèi),從而根據(jù)單片機(jī)的結(jié)構(gòu)特點(diǎn)結(jié)合項(xiàng)目開(kāi)發(fā)的實(shí)際來(lái)劃分程序存儲(chǔ)空間。在這樣調(diào)試時(shí),很容易發(fā)現(xiàn)問(wèn)題出現(xiàn)在哪個(gè)區(qū)域,使得程序結(jié)構(gòu)清晰明了,調(diào)用方便,易于調(diào)試和維護(hù)。

4 采用分區(qū)指令冗余技術(shù)提高軟件抗干擾性
    為了確保程序穩(wěn)定可靠運(yùn)行,有時(shí)必須采用軟硬件抗干擾設(shè)計(jì)。在某些場(chǎng)臺(tái),大量的干擾源雖然不會(huì)造成單片機(jī)硬件系統(tǒng)的破壞,卻常常會(huì)破壞數(shù)字信號(hào)的時(shí)序,更改單片機(jī)寄存器內(nèi)容,導(dǎo)致程序的“跑飛”或進(jìn)入死循環(huán)。因此在提高硬件可靠性的基礎(chǔ)上,還需要在程序設(shè)計(jì)中采取軟件抗干擾,從而提高軟件的可靠性,減少軟件錯(cuò)誤的發(fā)生或者在發(fā)生錯(cuò)誤的情況下仍能使系
統(tǒng)恢復(fù)正常運(yùn)行。
    針對(duì)EM78系列單片機(jī),筆者采用了分區(qū)指令冗余技術(shù)來(lái)防止程序的跑飛。即對(duì)程序中沒(méi)有使用的程序空間用“NOP_NOP_JMP”指令將其填滿。當(dāng)程序跑飛到單指令的“NOF”上時(shí),不會(huì)發(fā)生將操作數(shù)當(dāng)作指令來(lái)執(zhí)行的錯(cuò)誤,同時(shí)后面增加“JMP”指令使程序跳轉(zhuǎn)到程序跑飛處理程序上。圖4給出圖例。

    圖4中,針對(duì)EM78系列單片機(jī)ROM的結(jié)構(gòu)特點(diǎn),分別在4個(gè)頁(yè)里存放一個(gè)單獨(dú)的跑飛處理程序Error(),程序的功能可以是“踢狗”(外置“狗”)。這樣做的原因如下:如果只編寫(xiě)一個(gè)跑飛處理程序,假設(shè)放在PageO里,如果程序在Page2跑飛后,它不會(huì)跳到PageO的跑飛處理程序,反而會(huì)跳到Page2中,這樣程序仍然處于一種跑飛的狀態(tài)。所以在每個(gè)Page里添加Error()程序,這樣無(wú)論程序在哪個(gè)Page里跑飛,都會(huì)跳到Error()處理程序中。筆者實(shí)際中采用了這種方法取得了很好的效果。


5 其它常見(jiàn)問(wèn)題分析
    在使用EM78系列芯片進(jìn)行開(kāi)發(fā)時(shí),除了上面要注意的幾點(diǎn),還會(huì)遇見(jiàn)一些其它小問(wèn)題。下面就提出這些問(wèn)題及解決方法,希望讀者編程時(shí)有所注意。
(1)切記堆棧的深度
    匯編語(yǔ)言編程中經(jīng)常調(diào)用子程序,子程序的使用可以大大減少程序的書(shū)寫(xiě)量,提高程序的使用效率。但在對(duì)EM78系列芯片進(jìn)行開(kāi)發(fā)時(shí),調(diào)用子程序應(yīng)切記堆棧的深度。EM78系列單片機(jī)采用的是5級(jí)深度的硬件堆棧,它既不占用程序空間也不占用數(shù)據(jù)空間,是獨(dú)立的暫存空間,不需要進(jìn)棧和出棧的堆棧操作專(zhuān)用指令。堆棧的使用是環(huán)行的,若已有5個(gè)返回地址被存入堆棧后,若再次調(diào)用子程序,則第6個(gè)返回地址將被存入堆棧的第一層中(該層原有的內(nèi)容將被覆蓋),所以設(shè)計(jì)應(yīng)用程序時(shí),子程序的嵌套調(diào)用層數(shù)不能超過(guò)5層,若嵌套調(diào)用超過(guò)5層,則會(huì)發(fā)生程序跑飛。
(2)長(zhǎng)時(shí)間的軟件延時(shí)方法
    EM 78系列芯片內(nèi)部帶有定時(shí)器,但對(duì)于較長(zhǎng)時(shí)間的延時(shí)(如幾十s)則不太適用。筆者在開(kāi)發(fā)中要使用20s的延時(shí),編寫(xiě)了一段軟件延時(shí)程序,采用3層嵌套程序,源代碼如下,程序可以直接移植運(yùn)行。
;…主循環(huán)………
LOOP0: MOV A,@18H
        MOV DATAl,A
LOOF1: MOV A,@07fH
        MOV DATA2,A
LOOP2: MOV A,@07IfH
        MOV DATA3,A
LOOp3: JMP CHECK ;跳到應(yīng)用程序
        CHE(1K BACK:DJZ DATA3 ;應(yīng)用程序退出
        JMP LOOP3
        DJZ DATA2
        JMP LOOP2
        DJZ DATAl
        IMP LOOP1
        ;20s后執(zhí)行OTHER程序
        IMP OTHER
(3)查表程序中防止程序跑飛的技巧
    在單片機(jī)開(kāi)發(fā)應(yīng)用中,經(jīng)常要用到查表程序來(lái)實(shí)現(xiàn)代碼轉(zhuǎn)換,例如8段LED的譯碼顯示。EM78系列芯片的指令系統(tǒng)中,有查表所需的專(zhuān)用指令TBL和RETL。查表過(guò)程是,先通過(guò)把被顯數(shù)字(即索引值)作為在數(shù)據(jù)表中的偏移量存入A,通過(guò)子程序傳遞參數(shù),子程序?qū)?shù)和當(dāng)前PC相加,則PC跳到偏移位置,然后經(jīng)由RETL將所列數(shù)據(jù)裝入A,然后退出子程序。假設(shè)所列數(shù)據(jù)表中只有1O項(xiàng),則傳遞到子程序的參數(shù)最大為9。但如果程序跑飛,則有可能傳入大于9的參數(shù),這樣此數(shù)加上PC指針則跳出數(shù)據(jù)表的范圍,程序出錯(cuò)。筆者在自己的程序中加上如下措施,從而有效的解決了這個(gè)問(wèn)題。即進(jìn)入子程序后,首先判斷傳人參數(shù)是否大于9,即偏移量是否正確,不正確則跳到錯(cuò)誤處理程序ERROR(),正確則繼續(xù)執(zhí)行。這樣可確保顯示的數(shù)據(jù)都是正確的。
;……數(shù)據(jù)譯碼表……
DATA_TPANS_JBL:
    AND A,@OXOF;判斷顯示的偏移數(shù)據(jù)是否超過(guò)09
    MOV Disp_limit,a

    BC STATUS,C
    SUB A,@OxO9
    IBS STATUS,C
    JMP ERROR  ;若顯示偏移數(shù)據(jù)出錯(cuò)跳到出錯(cuò)
               ;處理程序
    ……

    ……

    TBL
    RETL 0BI 10101 11 ;
    “O”段碼AB′ABDEF,“0XD7”
    RETL 0800000110 ;“1”段碼:“Bc” ,“0X06”

    ……

    ……
    RETL 0810110111 ;“9”段碼’′ABCDFG′,"0XB7"以上是筆者在產(chǎn)品開(kāi)發(fā)中的一些心得,文中所列舉的程序均經(jīng)ELAN WICE。E編譯通過(guò),讀者可直接引用。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉