数字电位器x9241与pic单片机的接口及程序设计 1.docx

上传人:b****8 文档编号:10871792 上传时间:2023-02-23 格式:DOCX 页数:11 大小:239.01KB
下载 相关 举报
数字电位器x9241与pic单片机的接口及程序设计 1.docx_第1页
第1页 / 共11页
数字电位器x9241与pic单片机的接口及程序设计 1.docx_第2页
第2页 / 共11页
数字电位器x9241与pic单片机的接口及程序设计 1.docx_第3页
第3页 / 共11页
数字电位器x9241与pic单片机的接口及程序设计 1.docx_第4页
第4页 / 共11页
数字电位器x9241与pic单片机的接口及程序设计 1.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

数字电位器x9241与pic单片机的接口及程序设计 1.docx

《数字电位器x9241与pic单片机的接口及程序设计 1.docx》由会员分享,可在线阅读,更多相关《数字电位器x9241与pic单片机的接口及程序设计 1.docx(11页珍藏版)》请在冰豆网上搜索。

数字电位器x9241与pic单片机的接口及程序设计 1.docx

数字电位器x9241与pic单片机的接口及程序设计1

数字电位器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个,其格式为:

I3I2I1I0      P1P0      R1R0

 指令       电位器选择   寄存器选择

  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之间传输。

任何改变这些寄存器的操作都是非易失性的操作,将花去10ms的时间(最大)。

  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):

STATUSEQU03H;PIC16C72内部特殊

CEQU0;功能寄存器及标志位

PORTCEQU07H

TRISCEQU87H

COMMANDEQU24H

IDEQU25H;0000P1P0R1R0

ADDR_BYTEEQU26H;0101A3A2A1A0

DATA_BYTEEQU27H;CMDWD5D4D3D2D1D0

PULSESEQU28H;DIRXD5D4D3D2D1D0

CASEEQU29H

COUNTEQU2BH

TEMPPEQU2CH

CLOCKMACRO;时钟

NOP;LETSDASET-UP

BSFPORTC,6;SCL=1

NOP

NOP

NOP

BCFSTATUS,C;0送C

BTFSCPORTC,7;SDA=0?

BSFSTATUS,C;NO,1送C

BCFPORTC,6;SCL=0

ENDM

SEND_BITMACRO

BCFPORTC,7;0送SDA

BTFSCTEMPP,7;TEMPP.7=0?

BSFPORTC,7;NO,1送C

CLOCK;时钟

ENDM

START_CONDMACRO;开始条件

BSFPORTC,7;SDA=1

BSFPORTC,6;SCL=1

NOP

NOP

NOP

NOP

BCFPORTC,7;SDA=0

NOP

NOP

NOP

NOP

BCFPORTC,6;SCL=0

ENDM

STOP_CONDMACRO;终止条件

BCFPORTC,7;SDA=0

BSFPORTC,6;SCL=1

NOP

NOP

NOP

NOP

BSFPORTC,7;SDA=1

ENDM

ORG0

GOTOMAIN;转主程序

INTERPRET:

MOVFCOMMAND,W;

ADDWF2

FIRST:

CALLREAD_WCR;COMMAND‘0’

RETURN;读WCR

CALLWRITE_WCR;COMMAND’2’

RETURN;写WCR

CALLREAD_DR;COMMAND’4’

RETURN;读寄存器

CALLWRITE_DR;COMMAND’6’

RETURN;写寄存器

CALLXFR_DR;COMMAND’8’

RETURN;数据寄存器至WCR(单个)

CALLXFR_WCR;COMMAND’0AH’

RETURN;WCR至数据寄存器(单个)

CALLGXFR_DR;COMMAND’0CH’

RETURN;数据寄存器至WCR(全部)

CALLGXFR_WCR;COMMAND’0EH’

RETURN;WCR至数据寄存器(全部)

CALLINC_WIPER;COMMAND’10H’

RETURN;增加/减小指定的WCR

INSTR_GEN:

START_COND;开始条件

MOVFADDR_BYTE,W;送地址字节

CALLSEND_BYTE

MOVFID,W;送命令字

CALLSEND_BYTE

MOVFCASE,W;根据CASE值散转

ADDWF2

GOTOCASE0

GOTOCASE1

GOTOCASE2

GOTOCASE3

GOTOCASE4

GOTOCASE5

READ_WCR:

MOVLW90H;高四位为命令与ID组

IORWFID,1;合成新ID,读WCR

CLRFCASE;CASE=0

CALLINSTR_GEN

RETURN

WRITE_WCR:

MOVLW0A0H;写WCR

IORWFID,1

MOVLW1

MOVWFCASE;CASE=1

CALLINSTR_GEN

RETURN

READ_DR:

;读寄存器

MOVLW0B0H

IORWFID,1

MOVLW0;CASE=0

MOVWFCASE

CALLINSTR_GEN

RETURN

WRITE_DR:

;写寄存器

MOVLW0C0H

IORWFID,1

MOVLW2

MOVWFCASE

CALLINSTR_GEN

RETURN

XFR_DR:

;传输P1、P0、R1、R0指

MOVLW0D0H;定的寄存器中的内容至

IORWFID,1;与之相关的WCR

MOVLW3

MOVWFCASE

CALLINSTR_GEN

RETURN

XFR_WCR:

;传输由P1、P0指定的

MOVLW0E0H;WCR中的内容至R1、

IORWFID,1;R0指定的寄存器中

MOVLW4

MOVWFCASE

CALLINSTR_GEN

RETURN

GXFR_DR:

;传输由R1、R0指定的所

MOVLW10H;有的四个数据寄存器的内

IORWFID,1;容至与它们相应的WCR中

MOVLW3

MOVWFCASE

CALLINSTR_GEN

RETURN

GXFR_WCR:

;传输所有WCR中的内

MOVLW80H;容至与它们相应的由R1,

IORWFID,1;R0指定的数据寄存器中

MOVLW4

MOVWFCASE

CALLINSTR_GEN

RETURN

INC_WIPER:

;使能增加/减小由P1和

MOVLW20H;P0指定的WCR

IORWFID,1

MOVLW5

MOVWFCASE

CALLINSTR_GEN

RETURN

CASE0:

CALLGET_BYTE;接收一字节

GOTOCASE3

CASE1:

MOVFDATA_BYTE,W

CALLSEND_BYTE;发送数据字节

GOTOCASE3

CASE2:

MOVFDATA_BYTE,W

CALLSEND_BYTE

CASE4:

STOP_COND

CALLPOLLING;轮询

CASE3:

STOP_COND

RETURN

CASE5:

MOVLWB’00111111’;取出脉冲增加或减

ANDWFPULSES,W;少的个数送COUNT

MOVWFCOUNT

MOVLWB’10000000’;取出脉冲增加或减

ANDWFPULSES,W;少的方向位送TEMPP.7

MOVWFTEMPP

WIPER_LOOP:

SET_BIT;发送TEMPP.7至SDA上并

DECFSZCOUNT;产生COUNT个脉冲于SCL

GOTOWIPER_LOOP

STOP_COND;停止条件

RETURN

SEN_BYTE:

将TEMPP的内容发送出去

MOVWFTEMPP;

MOVLW8;共发送八位

MOVWFCOUNT

BIT_LOOP:

SET_BIT

NEXT_BIT:

RLFTEMPP

DECFSZCOUNT

GOTOBIT_LOOP

BSFPORTC,7;八位发送完毕

NOP;释放SDA

NOP

NOP

CLOCK

RETURN

GET_BYTE:

;接收一字节,SDA=1

BSFPORTC,7

MOVLW8

MOVWFCOUNT

GET_LOOP:

CLOCK;SDA送C并在SCL上产生一脉冲

RLFDATA_BYTE;C移位至DATA_BYTE

DECFSZCOUNT

GOTOGET_LOOP

BCFTEMPP,7;发应答位

SEND_BIT

RETURN

POLLING:

START_COND;开始条件

MOVFADDR_BYTE,W;送地址

AGAIN:

CALLSEND_BYTE

BTFSCSTATUS,C;SDA=0?

(有应答吗?

GOTOPOLLING;NO

RETURN;YES

MAIN:

CALLINI;初始化子程序

MOVLWB’01010000’;装载从器件地址字节

MOVWFADDR_BYTE

MOVLWB’00001000’;装在识别字节,对

MOVWFID;EEPOT#2操作

MOVLW2;写入WCR命令

MOVWFCOMMAND

MOVLWB’00101011’;设置D5D4D3D2D1D0

MOVWFDATA_BYTE;=101011B,即为43D

CALLINTERPRET

MOVLWB’00001000’;重新装在识别字节

MOVWFID

MOVLWB’00001111’;减少15个脉冲

MOVWFPULSES

MOVLW10H;增加/减少滑动端

MOVWFCOMMAND

CALLINTERPRET

etc......

INI:

CLRFPORTC;使C口为输出

BSFSTATUS,5

CLRFTRISC

etc......

END

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1