數(shù)字電位器X9241與PIC單片機(jī)的接口及程序設(shè)計(jì)

2013-10-29 14:27:00
  • 相關(guān)元件pdf下載:pic16c72 x9241 作 者: 遼寧工程技術(shù)大學(xué) 呂振 劉寶良 徐崇麗1、 x9241概述  x9241是xic公司生產(chǎn)的、把4個(gè)e2pot數(shù)字電位器集成在單片的cmos集成電路上的一種數(shù)字電位器。它包含4個(gè)電阻陣

相關(guān)元件pdf下載:pic16c72 x9241 作 者: 遼寧工程技術(shù)大學(xué) 呂振 劉寶良 徐崇麗1、 x9241概述

x9241是xic公司生產(chǎn)的、把4個(gè)e2pot數(shù)字電位器集成在單片的cmos集成電路上的一種數(shù)字電位器。它包含4個(gè)電阻陣列,每個(gè)陣列包含63個(gè)電阻單元,在每個(gè)單元之間和2個(gè)端點(diǎn)之間都有被滑動(dòng)單元訪問的抽頭點(diǎn)?;瑒?dòng)單元在陣列中的位置由用戶通過2線串行總線接口控制。每個(gè)電阻陣列與1個(gè)滑動(dòng)端計(jì)數(shù)寄存器(wcr)和4個(gè)8位數(shù)據(jù)寄存器聯(lián)系在一起。這4個(gè)數(shù)據(jù)寄存器可由用戶直接寫入和讀出。wcr的內(nèi)容控制滑動(dòng)端在電阻陣列中的位置,其功能框圖如圖1所示。2、 x9241工作原理

x9241支持雙向總線的定向規(guī)約,是一個(gè)從屬器件。它的高4位地址為0101(器件類型辨識符),低4位地址由a3~a0輸入端狀態(tài)決定。在sda線上的數(shù)據(jù)只有在scl為低期間才能改變狀態(tài)。當(dāng)scl為高時(shí),sda狀態(tài)的改變用來表示開始和終止條件(開始條件:scl為高時(shí),sda由高至低的跳變;終止條件:scl為高時(shí),sda由低至高的跳變)。送給x9241的所有命令都由開始條件引導(dǎo),在其后輸出x9241從器件的地址。x9241把串行數(shù)據(jù)流與該器件的地址比較,若地址比較成功,則作出一個(gè)應(yīng)答響應(yīng)。送到x9241的下一個(gè)字節(jié)包括指令及寄存器指針的信息,高4位為指令,低4位用來指出4個(gè)電位器中的1個(gè)及4個(gè)輔助寄存器中的1個(gè),其格式為:i3 i2 i1 i0

p1 p0

r1 r0  指 令

 電位器選擇

 寄存器選擇

9條指令中的4條以發(fā)送指令字節(jié)作為結(jié)束。這些二字節(jié)指令在wcr與數(shù)據(jù)寄存器中的1個(gè)之間交換數(shù)據(jù);4條指令為三字節(jié)指令,這些指令在主機(jī)與x9241之間傳輸數(shù)據(jù)(包括主機(jī)與1個(gè)數(shù)據(jù)寄存器和主機(jī)與wcr之間);還有1條指令為增加/減少指令。三類指令的指令序列及說明見圖2及表1。

x9241包括4個(gè)wcr,每個(gè)e2pot電位器各1個(gè),wcr可以被認(rèn)為是一個(gè)6位并行和串行裝載的帶有輸出譯碼的計(jì)數(shù)器,用來選擇電阻陣列的64選1的開關(guān)。wcr是一個(gè)易失性存儲(chǔ)器,若斷電,其內(nèi)容即消失。該存儲(chǔ)器在上電時(shí)自動(dòng)裝入r0的值,但必須注意這個(gè)值可能與斷電時(shí)wcr中的值不同。

每個(gè)電位器有4個(gè)非易失性數(shù)據(jù)寄存器。這些寄存器可以被主機(jī)直接讀出或?qū)懭?,而且?shù)據(jù)可以在4個(gè)數(shù)據(jù)寄存器的任一個(gè)和wcr之間傳輸。任何改變這些寄存器的操作都是非易失性的操作,將花去10 ms的時(shí)間(最大)。

x9241的電阻陣列之間可以串聯(lián)。在三字節(jié)指令中,其數(shù)據(jù)字節(jié)包括用來定義滑動(dòng)端位置的6位(lsb)加上高兩位:cm(串聯(lián)方式,其為0時(shí)電位器正常工作;其為1時(shí),電位器與它相鄰的高序號的電位器串聯(lián)連接)和dw(禁止滑動(dòng)端,其為0時(shí)滑動(dòng)端使能;為1時(shí)滑動(dòng)端被禁止,此時(shí)滑動(dòng)端是電氣上隔離的并且是浮空的)。當(dāng)工作于串聯(lián)方式時(shí),被串聯(lián)的陣列的vh、vl及滑動(dòng)端這三個(gè)輸出端必須在電氣上與外部連接,除了一個(gè)滑動(dòng)端以外,其余的滑動(dòng)端必須禁止。串聯(lián)后的電阻陣列如圖3所示。3、 x9241與pic16cxx單片機(jī)的接口及程序清單

圖4為pic16c72與x9241的接口電路。與此對應(yīng),給出了所有x9241命令操作的程序清單。在此程序中,main為一主程序。在main中,將43寫入e2pot#2的wcr(即滑動(dòng)端位置為#43)。然后將滑動(dòng)端抽頭位置減少15個(gè)脈沖的位置,這使得被選定的wcr減少到值28(即滑動(dòng)端位置為#28)。隨后發(fā)出的其它命令也都是相同的過程,清單中不再贅述。 4、程序清單:程序清單(單片機(jī)為pic16c72,晶振為4m):status equ 03h ;pic16c72內(nèi)部特殊c equ 0 ;功能寄存器及標(biāo)志位ptc equ 07htrisc equ 87hcomm equ 24hid equ 25h ; 0 0 0 0 p1 p0 r1 r0 addr_byte equ 26h; 0 1 0 1 a3 a2 a1 a0data_byte equ 27h ;cm dw d5 d4 d3 d2 d1 d0pulses equ 28h ;dir x d5 d4 d3 d2 d1 d0case equ 29hcount equ 2bhtempp equ 2chclock macro ;時(shí)鐘nop ;let sda set-upbsf ptc,6 ;scl=1nop nopnopbcf status,c ;0送cbtfsc ptc,7 ;sda=0?bsf status,c ;no,1送cbcf ptc,6 ;scl=0endmsend_bit macrobcf ptc, 7 ;0送sdabtfsc tempp, 7 ;tempp.7=0?bsf ptc, 7 ;no,1送cclock ;時(shí)鐘endmstart_cond macro ;開始條件bsf ptc,7 ;sda=1bsf ptc,6 ;scl=1nopnopnopnopbcf ptc,7 ;sda=0nopnopnopnopbcf ptc,6 ;scl=0endmstop_cond macro ;終止條件bcf ptc, 7 ;sda=0bsf ptc, 6 ;scl=1nopnopnopnopbsf ptc, 7 ;sda=1endmg 0goto main ;轉(zhuǎn)主程序interpret:movf comm,w;addwf 2first:call read_wcr ;comm ‘0’return ;讀wcrcall write_wcr;comm’2’return ;寫wcrcall read_dr ;comm’4’return ;讀寄存器call write_dr ; comm’6’return ;寫寄存器call xfr_dr ;comm’8’return ;數(shù)據(jù)寄存器至wcr(單個(gè))call xfr_wcr ; comm’0ah’return ; wcr至數(shù)據(jù)寄存器(單個(gè))call gxfr_dr ; comm’0ch’return ; 數(shù)據(jù)寄存器至wcr(全部)call gxfr_wcr ; comm’0eh’return ; wcr至數(shù)據(jù)寄存器(全部)call inc_wiper ; comm’10h’return ;增加/減小指定的wcrinstr_gen:start_cond ; 開始條件movf addr_byte, w ;送地址字節(jié)call send_bytemovf id, w ;送命令字call send_bytemovf case, w ;根據(jù)case值散轉(zhuǎn)addwf 2goto case0goto case1goto case2goto case3goto case4goto case5read_wcr:movlw 90h ;高四位為命令與id組iwf id, 1 ;合成新id,讀wcrclrf case ; case=0call instr_genreturnwrite_wcr:movlw 0a0h ;寫wcriwf id, 1movlw 1movwf case ;case=1call instr_genreturnread_dr: ;讀寄存器movlw 0b0h iwf id, 1movlw 0 ;case=0movwf casecall instr_genreturnwrite_dr: ;寫寄存器movlw 0c0h iwf id, 1movlw 2movwf casecall instr_genreturnxfr_dr: ;傳輸p1、p0、r1、r0指movlw 0d0h ;定的寄存器中的內(nèi)容至iwf id, 1 ;與之相關(guān)的wcrmovlw 3 movwf casecall instr_genreturnxfr_wcr: ;傳輸由p1、p0指定的movlw 0e0h ;wcr中的內(nèi)容至r1、iwf id, 1 ;r0指定的寄存器中movlw 4movwf casecall instr_genreturngxfr_dr: ;傳輸由r1、r0指定的所movlw 10h ;有的四個(gè)數(shù)據(jù)寄存器的內(nèi)iwf id, 1 ;容至與它們相應(yīng)的wcr中movlw 3movwf casecall instr_genreturngxfr_wcr: ;傳輸所有wcr中的內(nèi) movlw 80h ;容至與它們相應(yīng)的由r1,iwf id, 1 ;r0指定的數(shù)據(jù)寄存器中movlw 4movwf casecall instr_genreturninc_wiper: ;使能增加/減小由p1和movlw 20h ;p0指定的wcriwf id, 1movlw 5movwf casecall instr_genreturncase0:call get_byte ; 接收一字節(jié)goto case3case1:movf data_byte, wcall send_byte ;發(fā)送數(shù)據(jù)字節(jié)goto case3case2:movf data_byte,wcall send_bytecase4:stop_condcall polling ;輪詢case3:stop_condreturncase5:movlw b’00111111’;取出脈沖增加或減wf pulses, w ;少的個(gè)數(shù)送countmovwf countmovlw b’10000000’; 取出脈沖增加或減wf pulses,w;少的方向位送tempp.7movwf temppwiper_loop:set_bit ;發(fā)送tempp.7至sda上并decfsz count;產(chǎn)生count個(gè)脈沖于sclgoto wiper_loopstop_cond ;停止條件returnsen_byte: 將tempp的內(nèi)容發(fā)送出去movwf tempp;movlw 8 ; 共發(fā)送八位movwf countbit_loop:set_bitnext_bit:rlf temppdecfsz countgoto bit_loopbsf ptc, 7 ;八位發(fā)送完畢nop ;釋放sdanopnopclockreturnget_byte: ;接收一字節(jié),sda=1bsf ptc, 7movlw 8movwf countget_loop:clock ;sda送c并在scl上產(chǎn)生一脈沖rlf data_byte ;c移位至data_bytedecfsz countgoto get_loopbcf tempp, 7 ; 發(fā)應(yīng)答位send_bitreturnpolling:start_cond ;開始條件movf addr_byte, w ;送地址again: call send_bytebtfsc status,c ;sda=0?(有應(yīng)答嗎?)goto polling ;urn ;yesmain:call ini ;初始化子程序movlw b’01010000’ ; 裝載從器件地址字節(jié)movwf addr_bytemovlw b’00001000’ ;裝在識別字節(jié),對movwf id ;eepot #2操作movlw 2 ;寫入wcr命令movwf commmovlw b’00101011’;設(shè)置d5d4d3d2d1d0movwf data_byte ; =1 0 1 0 1 1 b,即為43dcall interpretmovlw b’00001000’ ;重新裝在識別字節(jié)movwf idmovlw b’00001111’ ;減少15個(gè)脈沖movwf pulsesmovlw 10h ;增加/減少滑動(dòng)端movwf commcall interpretetc ......ini:clrf ptc ;使c口為輸出bsf status, 5clrf triscetc ......end