相关元件pdf下载:pic16c72 x9241 作 者: 辽宁工程技术大学 吕振 刘宝良 徐崇丽1、 x9241概述
x9241是xic公司生产的、把4个e2pot数字电位器集成在单片的cmos集成电路上的一种数字电位器。它包含4个电阻阵列,每个阵列包含63个电阻单元,在每个单元之间和2个端点之间都有被滑动单元访问的抽头点。滑动单元在阵列中的位置由用户通过2线串行总线接口控制。每个电阻阵列与1个滑动端计数寄存器(wcr)和4个8位数据寄存器联系在一起。这4个数据寄存器可由用户直接写入和读出。wcr的内容控制滑动端在电阻阵列中的位置,其功能框图如图1所示。2、 x9241工作原理
x9241支持双向总线的定向规约,是一个从属器件。它的高4位地址为0101(器件类型辨识符),低4位地址由a3~a0输入端状态决定。在sda线上的数据只有在scl为低期间才能改变状态。当scl为高时,sda状态的改变用来表示开始和终止条件(开始条件:scl为高时,sda由高至低的跳变;终止条件:scl为高时,sda由低至高的跳变)。送给x9241的所有命令都由开始条件引导,在其后输出x9241从器件的地址。x9241把串行数据流与该器件的地址比较,若地址比较成功,则作出一个应答响应。送到x9241的下一个字节包括指令及寄存器指针的信息,高4位为指令,低4位用来指出4个电位器中的1个及4个辅助寄存器中的1个,其格式为:i3 i2 i1 i0
p1 p0
r1 r0 指 令
电位器选择
寄存器选择
9条指令中的4条以发送指令字节作为结束。这些二字节指令在wcr与数据寄存器中的1个之间交换数据;4条指令为三字节指令,这些指令在主机与x9241之间传输数据(包括主机与1个数据寄存器和主机与wcr之间);还有1条指令为增加/减少指令。三类指令的指令序列及说明见图2及表1。
x9241包括4个wcr,每个e2pot电位器各1个,wcr可以被认为是一个6位并行和串行装载的带有输出译码的计数器,用来选择电阻阵列的64选1的开关。wcr是一个易失性存储器,若断电,其内容即消失。该存储器在上电时自动装入r0的值,但必须注意这个值可能与断电时wcr中的值不同。
每个电位器有4个非易失性数据寄存器。这些寄存器可以被主机直接读出或写入,而且数据可以在4个数据寄存器的任一个和wcr之间传输。任何改变这些寄存器的操作都是非易失性的操作,将花去10 ms的时间(最大)。
x9241的电阻阵列之间可以串联。在三字节指令中,其数据字节包括用来定义滑动端位置的6位(lsb)加上高两位:cm(串联方式,其为0时电位器正常工作;其为1时,电位器与它相邻的高序号的电位器串联连接)和dw(禁止滑动端,其为0时滑动端使能;为1时滑动端被禁止,此时滑动端是电气上隔离的并且是浮空的)。当工作于串联方式时,被串联的阵列的vh、vl及滑动端这三个输出端必须在电气上与外部连接,除了一个滑动端以外,其余的滑动端必须禁止。串联后的电阻阵列如图3所示。3、 x9241与pic16cxx单片机的接口及程序清单
图4为pic16c72与x9241的接口电路。与此对应,给出了所有x9241命令操作的程序清单。在此程序中,main为一主程序。在main中,将43写入e2pot#2的wcr(即滑动端位置为#43)。然后将滑动端抽头位置减少15个脉冲的位置,这使得被选定的wcr减少到值28(即滑动端位置为#28)。随后发出的其它命令也都是相同的过程,清单中不再赘述。 4、程序清单:程序清单(单片机为pic16c72,晶振为4m):status equ 03h ;pic16c72内部特殊c equ 0 ;功能寄存器及标志位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 ;时钟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 ;时钟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 ;转主程序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 ;数据寄存器至wcr(单个)call xfr_wcr ; comm’0ah’return ; wcr至数据寄存器(单个)call gxfr_dr ; comm’0ch’return ; 数据寄存器至wcr(全部)call gxfr_wcr ; comm’0eh’return ; wcr至数据寄存器(全部)call inc_wiper ; comm’10h’return ;增加/减小指定的wcrinstr_gen:start_cond ; 开始条件movf addr_byte, w ;送地址字节call send_bytemovf id, w ;送命令字call send_bytemovf case, w ;根据case值散转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 ;定的寄存器中的内容至iwf id, 1 ;与之相关的wcrmovlw 3 movwf casecall instr_genreturnxfr_wcr: ;传输由p1、p0指定的movlw 0e0h ;wcr中的内容至r1、iwf id, 1 ;r0指定的寄存器中movlw 4movwf casecall instr_genreturngxfr_dr: ;传输由r1、r0指定的所movlw 10h ;有的四个数据寄存器的内iwf id, 1 ;容至与它们相应的wcr中movlw 3movwf casecall instr_genreturngxfr_wcr: ;传输所有wcr中的内 movlw 80h ;容至与它们相应的由r1,iwf id, 1 ;r0指定的数据寄存器中movlw 4movwf casecall instr_genreturninc_wiper: ;使能增加/减小由p1和movlw 20h ;p0指定的wcriwf id, 1movlw 5movwf casecall instr_genreturncase0:call get_byte ; 接收一字节goto case3case1:movf data_byte, wcall send_byte ;发送数据字节goto case3case2:movf data_byte,wcall send_bytecase4:stop_condcall polling ;轮询case3:stop_condreturncase5:movlw b’00111111’;取出脉冲增加或减wf pulses, w ;少的个数送countmovwf countmovlw b’10000000’; 取出脉冲增加或减wf pulses,w;少的方向位送tempp.7movwf temppwiper_loop:set_bit ;发送tempp.7至sda上并decfsz count;产生count个脉冲于sclgoto wiper_loopstop_cond ;停止条件returnsen_byte: 将tempp的内容发送出去movwf tempp;movlw 8 ; 共发送八位movwf countbit_loop:set_bitnext_bit:rlf temppdecfsz countgoto bit_loopbsf ptc, 7 ;八位发送完毕nop ;释放sdanopnopclockreturnget_byte: ;接收一字节,sda=1bsf ptc, 7movlw 8movwf countget_loop:clock ;sda送c并在scl上产生一脉冲rlf data_byte ;c移位至data_bytedecfsz countgoto get_loopbcf tempp, 7 ; 发应答位send_bitreturnpolling:start_cond ;开始条件movf addr_byte, w ;送地址again: call send_bytebtfsc status,c ;sda=0?(有应答吗?)goto polling ;urn ;yesmain:call ini ;初始化子程序movlw b’01010000’ ; 装载从器件地址字节movwf addr_bytemovlw b’00001000’ ;装在识别字节,对movwf id ;eepot #2操作movlw 2 ;写入wcr命令movwf commmovlw b’00101011’;设置d5d4d3d2d1d0movwf data_byte ; =1 0 1 0 1 1 b,即为43dcall interpretmovlw b’00001000’ ;重新装在识别字节movwf idmovlw b’00001111’ ;减少15个脉冲movwf pulsesmovlw 10h ;增加/减少滑动端movwf commcall interpretetc ......ini:clrf ptc ;使c口为输出bsf status, 5clrf triscetc ......end