数字电位器X9241与PIC单片机的接口及程序设计电路图

数字电位器x9241与pic单片机的接口及程序设计
作 者: 辽宁工程技术大学 吕振 刘宝良 徐崇丽
1、 x9241概述
x9241是xicor公司生产的、把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 i0p1 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 ;功能寄存器及标志位
portc equ 07h
trisc equ 87h
command equ 24h
id equ 25h ; 0 0 0 0 p1 p0 r1 r0
addr_byte equ 26h; 0 1 0 1 a3 a2 a1 a0
data_byte equ 27h ;cm dw d5 d4 d3 d2 d1 d0
pulses equ 28h ;dir x d5 d4 d3 d2 d1 d0
case equ 29h
count equ 2bh
tempp equ 2ch
clock macro ;时钟
nop ;let sda set-up
bsf portc,6 ;scl=1
nop
nop
nop
bcf status,c ;0送c
btfsc portc,7 ;sda=0?
bsf status,c ;no,1送c
bcf portc,6 ;scl=0
endm
send_bit macro
bcf portc, 7 ;0送sda
btfsc tempp, 7 ;tempp.7=0?
bsf portc, 7 ;no,1送c
clock ;时钟
endm
start_cond macro ;开始条件
bsf portc,7 ;sda=1
bsf portc,6 ;scl=1
nop
nop
nop
nop
bcf portc,7 ;sda=0
nop
nop
nop
nop
bcf portc,6 ;scl=0
endm
stop_cond macro ;终止条件
bcf portc, 7 ;sda=0
bsf portc, 6 ;scl=1
nop
nop
nop
nop
bsf portc, 7 ;sda=1
endm
org 0
goto main ;转主程序
interpret:
movf command,w;
addwf 2
first:
call read_wcr ;command ‘0’
return ;读wcr
call write_wcr;command’2’
return ;写wcr
call read_dr ;command’4’
return ;读寄存器
call write_dr ; command’6’
return ;写寄存器
call xfr_dr ;command’8’
return ;数据寄存器至wcr(单个)
call xfr_wcr ; command’0ah’
return ; wcr至数据寄存器(单个)
call gxfr_dr ; command’0ch’
return ; 数据寄存器至wcr(全部)
call gxfr_wcr ; command’0eh’
return ; wcr至数据寄存器(全部)
call inc_wiper ; command’10h’
return ;增加/减小指定的wcr
instr_gen:
start_cond ; 开始条件
movf addr_byte, w ;送地址字节
call send_byte
movf id, w ;送命令字
call send_byte
movf case, w ;根据case值散转
addwf 2
goto case0
goto case1
goto case2
goto case3
goto case4
goto case5
read_wcr:
movlw 90h ;高四位为命令与id组
iorwf id, 1 ;合成新id,读wcr
clrf case ; case=0
call instr_gen
return
write_wcr:
movlw 0a0h ;写wcr
iorwf id, 1
movlw 1
movwf case ;case=1
call instr_gen
return
read_dr: ;读寄存器
movlw 0b0h
iorwf id, 1
movlw 0 ;case=0
movwf case
call instr_gen
return
write_dr: ;写寄存器
movlw 0c0h
iorwf id, 1
movlw 2
movwf case
call instr_gen
return
xfr_dr: ;传输p1、p0、r1、r0指
movlw 0d0h ;定的寄存器中的内容至
iorwf id, 1 ;与之相关的wcr
movlw 3
movwf case
call instr_gen
return
xfr_wcr: ;传输由p1、p0指定的
movlw 0e0h ;wcr中的内容至r1、
iorwf id, 1 ;r0指定的寄存器中
movlw 4
movwf case
call instr_gen
return
gxfr_dr: ;传输由r1、r0指定的所
movlw 10h ;有的四个数据寄存器的内
iorwf id, 1 ;容至与它们相应的wcr中
movlw 3
movwf case
call instr_gen
return
gxfr_wcr: ;传输所有wcr中的内
movlw 80h ;容至与它们相应的由r1,
iorwf id, 1 ;r0指定的数据寄存器中
movlw 4
movwf case
call instr_gen
return
inc_wiper: ;使能增加/减小由p1和
movlw 20h ;p0指定的wcr
iorwf id, 1
movlw 5
movwf case
call instr_gen
return
case0:call get_byte ; 接收一字节
goto case3
case1:movf data_byte, w
call send_byte ;发送数据字节
goto case3
case2:movf data_byte,w
call send_byte
case4:stop_cond
call polling ;轮询
case3:stop_cond
return
case5:movlw b’00111111’;取出脉冲增加或减
andwf pulses, w ;少的个数送count
movwf count
movlw b’10000000’; 取出脉冲增加或减
andwf pulses,w;少的方向位送tempp.7
movwf tempp
wiper_loop:set_bit ;发送tempp.7至sda上并
decfsz count;产生count个脉冲于scl
goto wiper_loop
stop_cond ;停止条件
return
sen_byte: 将tempp的内容发送出去
movwf tempp;
movlw 8 ; 共发送八位
movwf count
bit_loop:set_bit
next_bit:rlf tempp
decfsz count
goto bit_loop
bsf portc, 7 ;八位发送完毕
nop ;释放sda
nop
nop
clock
return
get_byte: ;接收一字节,sda=1
bsf portc, 7
movlw 8
movwf count
get_loop:
clock ;sda送c并在scl上产生一脉冲
rlf data_byte ;c移位至data_byte
decfsz count
goto get_loop
bcf tempp, 7 ; 发应答位
send_bit
return
polling:
start_cond ;开始条件
movf addr_byte, w ;送地址
again: call send_byte
btfsc status,c ;sda=0?(有应答吗?)
goto polling ;no
return ;yes
main:call ini ;初始化子程序
movlw b’01010000’ ; 装载从器件地址字节
movwf addr_byte
movlw b’00001000’ ;装在识别字节,对
movwf id ;eepot #2操作
movlw 2 ;写入wcr命令
movwf command
movlw b’00101011’;设置d5d4d3d2d1d0
movwf data_byte ; =1 0 1 0 1 1 b,即为43d
call interpret
movlw b’00001000’ ;重新装在识别字节
movwf id
movlw b’00001111’ ;减少15个脉冲
movwf pulses
movlw 10h ;增加/减少滑动端
movwf command
call interpret
etc ......
ini:clrf portc ;使c口为输出
bsf status, 5
clrf trisc
etc ......
end

如何选择缓冲正向转换器?
噪声来源、定义及影响
为电脑加装一块发烧级的单端甲类环绕耳机放大器 BH3854
抢先看毫米波器件发展现状及石墨烯毫米波器件优势
聚灿光电第三季度大幅度亏损,LED芯片产业迈入新阶段
数字电位器X9241与PIC单片机的接口及程序设计电路图
RC模型电池上面标注的基本参数以及该如何选择电池
自动门控制器电路图
应对危机的四大移动技术战略详解
C语言实现可以直接运行的贪吃蛇源码
俄罗斯研发出便携式腹膜透析仪
韩国批准三星在华设闪存芯片厂
人工智能技术有望成为防火墙 助力构建网络安全
档案库房环境监控系统
LCD显示器概述
晶振pF是什么?怎样去匹配电容呢?
SPMC65P2408A在电冰箱中的应用
凭借虚幻引擎和AR技术,任何人都可以将名为Dex的可爱拉布拉多带进客厅
室内小间距LED显示屏的定义及优点
如何将MCU应用到FPGA中:具体操作(3)