SN 8 位單片機(jī) SN8P2743 應(yīng)用實(shí)踐(2)
===========================================================
使用 2743 不能對(duì) P0.N 位操作的問(wèn)題
在使用 SN8P2743 時(shí),代碼里有:
BSET FP03
BCLR FP03
這樣的指令,結(jié)果,編譯器提示出錯(cuò)! "Only can use MOV command to change the Bit.."
查閱芯片手冊(cè),對(duì) I/O 配置描述是:
IO 引腳配置
雙向輸入輸出IO 口:P0、P1、P4
具有喚醒功能的IO 口:P0、P1 電平變換
具有上拉電阻的IO 口:P0、P1、P4
OP-amp/比較器引腳:P1、P4
ADC 輸入引腳:P4.0~P4.7
這里,沒(méi)有看見(jiàn)我為什么遇見(jiàn)的問(wèn)題所在!
又查閱軟件文件夾里的 SN8P2743.INC 文件,文件里對(duì) P0 口的內(nèi)容如下:
P0M EQU 0B8H
FP06M EQU P0M.6
FP05M EQU P0M.5
FP03M EQU P0M.3
FP02M EQU P0M.2
FP00M EQU P0M.0
P0 EQU 0D0H
FP06 EQU P0.6
FP05 EQU P0.5
FP04 EQU_R P0.4;只讀
FP03 EQU P0.3
FP02 EQU P0.2
FP01 EQU_W P0.1 ;只寫(xiě)
FP00 EQU P0.0
留意到,P0 端口有一位只讀,有一位只寫(xiě)! ----- 對(duì)一組端口里有只讀位的,并不會(huì)影響其它位的位操作,是不是有只寫(xiě)位就不行了呢?
又再查閱芯片手冊(cè),在引腳說(shuō)明里看見(jiàn)只寫(xiě)位 FP01 :
P0.1/PWM0 I/O P0.1:漏極開(kāi)路的輸出引腳。PWM0:PWM輸出引腳和脈沖輸出引腳。
再看看對(duì)端口 P0 的系統(tǒng)寄存器內(nèi)容:
I/O 口模式
寄存器PnM 控制I/O 口的工作模式。
0B8H Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
P0M - P06M P05M - P03M P02M - P00M
讀/寫(xiě) - R/W R/W - R/W R/W - R/W
復(fù)位后 - 0 0 - 0 0 - 0
I/O 口數(shù)據(jù)寄存器 P0
0D0H Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
P0 - P06 P05 P04 P03 P02 P01 P00
讀/寫(xiě) - R/W R/W R R/W R/W W R/W
復(fù)位后 - 0 0 0 0 0 0 0
注:
1、當(dāng)通過(guò)編譯選項(xiàng)使能外部復(fù)位時(shí),P04 保持為1。
2、若需要設(shè)置P0 寄存器的某位(P0.n)時(shí),建議使用“MOV”或者“B0MOV”指令,而不要使用“read & modify write(讀-改寫(xiě))”型的指令(如,BSET、BCLR、B0BSET、B0BCLR…),否則執(zhí)行這些指令后,P0 寄存器的只寫(xiě)位P0.1 會(huì)被更改。
原來(lái)問(wèn)題是:
如果一組端口有某位為只寫(xiě)位,為了避免位操作指令的"讀-改寫(xiě)"破壞只寫(xiě)位的狀態(tài),因此,對(duì)這組端口的其它位不能使用位操作指令!
這種情況很少遇見(jiàn),芯片手冊(cè)里 I/O 配置說(shuō)明也不夠具體和明確,
----- 為避免使用 2743 時(shí)出現(xiàn)類(lèi)似麻煩,特貼出供大家參考!
=============================================================
注意 2743 的 P0 端口使用問(wèn)題與解決方法:
最近使用 2743 做項(xiàng)目,其 P0 口的使用確實(shí)遇見(jiàn)一些麻煩事!
首先,它的 P0.1 是只能作為輸出使用.屬于開(kāi)漏輸出.(普通I/O模式時(shí)).不能輸出高電平!
其次,這組端口不能使用位操作指令,非常的不方便!
如果使用它做數(shù)碼管筆段驅(qū)動(dòng),低電平有效,如果包含小數(shù)點(diǎn)位置在內(nèi),是不能通過(guò)位操作指令快捷設(shè)置的!
先把端口狀態(tài)讀進(jìn)來(lái),到一個(gè)臨時(shí) RAM ,然后操作這個(gè)小數(shù)點(diǎn),之后再送回到 P0 口!
此時(shí),會(huì)出現(xiàn)錯(cuò)誤, P0.1 這位狀態(tài)會(huì)出錯(cuò)!
利用 AND 與 OR 等指令配合來(lái)操作,仍然會(huì)出現(xiàn)錯(cuò)誤! --- 有點(diǎn)莫名其妙!
注意了: 偏偏在仿真器上沒(méi)有這些錯(cuò)誤,都是燒寫(xiě)芯片后才發(fā)現(xiàn)錯(cuò)誤!
冷靜下來(lái),重新閱讀芯片手冊(cè),終于幡然大悟! ---- P0.1 是只寫(xiě)位,不能讀! 讀進(jìn)來(lái)就是錯(cuò)的!
凡是經(jīng)過(guò)"讀--改--寫(xiě)"過(guò)程的指令,操作它都會(huì)出錯(cuò)!
解決辦法:
使用一個(gè) P0 口的"影子"寄存器 EME,專(zhuān)門(mén)對(duì)付操作 P0 口的輸出. 這樣,不僅僅方便了,也與其它芯片做法一致了!所有對(duì) P0 口的輸出操作都變成對(duì)這個(gè)影子寄存器的操作,之后再及時(shí)" MOV_ P0,EME"去!
經(jīng)過(guò)這樣處理,較好地避免了對(duì) P0 口操作出錯(cuò)的問(wèn)題. ------ 輸入模式下可以逐位讀入,僅僅 P0.1 不能讀!
=========================================================
SN8P2743 的比較器初試
SN8P2743 芯片內(nèi)部帶有 3 個(gè)比較器,今天,終于抽空對(duì)其進(jìn)行了一些測(cè)試.
3 個(gè)比較器匯編叫做比較器 0 ,比較器 1 ,比較器 2 .
3 個(gè)比較器都是軌到軌輸出的,就是在 5V 供電下,高/低電平輸出幅度幾乎達(dá)到 5V 和 GND 電平!
(芯片內(nèi)部還有一個(gè)放大器,放大器的測(cè)試已經(jīng)發(fā)布過(guò)帖子了!)
3 個(gè)比較器都可以作為普通比較器使用或特殊比較器器使用. 所謂特殊就是可以觸發(fā)或停止 TC0 定時(shí)器的 PWM 輸出脈沖.
與常規(guī)集成電路比較器更多選擇的是,可以選擇比較器翻轉(zhuǎn)方向和進(jìn)入中斷! 可以選擇是否使用比較器輸出的引腳(與普通 I/O 口共享). 如果不用硬件引腳,就僅僅是軟件內(nèi)部處理結(jié)果或數(shù)據(jù),則可以節(jié)省 3 個(gè) I/O 口. 這是一大特色!
而比較器 1 和比較器 2 更有意思,可以軟件選擇內(nèi)部參考到同相輸入作為參考電壓,此時(shí),也可以不用硬件引腳,成為功能齊全而僅僅一個(gè)外接引腳的比較器! -------- 太棒了!
比較器是進(jìn)行 2 個(gè)電壓比較大小的重要元件,我對(duì)比較器 0 進(jìn)行測(cè)試,方法是:
使用 2 個(gè) 1% 精度 3K 的電阻,串聯(lián)后接到 5V 與 GND ,中間就是 5V/2 了,把這個(gè) 2.5V 接到比較器 0 的反相輸入引腳,然后,利用微調(diào)定位器給比較器 0 的同相輸入電壓, 用數(shù)字萬(wàn)用表實(shí)時(shí)測(cè)量 2 個(gè)輸入引腳的電壓差, 并且讓其比較輸出低電平時(shí)或高電平時(shí)進(jìn)入中斷,結(jié)果都是 OK 的!
它還可以選擇延時(shí)輸出,但是我沒(méi)有使用,一律不用延時(shí)輸出.
而其比較的動(dòng)作電壓,一開(kāi)始感覺(jué)有些大,高達(dá)上百 mV ! 查閱手冊(cè),分別給 2 個(gè)輸入端口加上一只 1u 的濾波電容器, 結(jié)果,翻轉(zhuǎn)電壓差下降到僅僅 0.6~0.8mV 左右. ------ 就是在 5/2=2.5V 電壓附近, +0.8V,輸出=5V, -0.8V 輸出=0 !
評(píng)論