logo资料库

proteus自建元件.doc

第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
资料共14页,剩余部分请下载后查看
Proteus 自建元件库 摘自叶子的博客 一、Proteus VSM 仿真模型简介 在使用 Proteus 仿真单片机系统的过程中,经常找不到所需的元件,这就需要自己编写。Proteus VSM 的一个主要特色是使用基于 DLL 组件模型的可扩展性。这些模型分为两类:电气模型(Electrical Model)和绘图模型(Graphical Model)。电气模型实现元件的电气特性,按规定的时序接收数据 和输出数据;绘图模型实现仿真时与用户的交互,例如 LCD 的显示。一个元件可以只实现电气模型, 也可以都实现电气和绘图模型。 Proteus 为 VSM 模型提供了一些 C++抽象类接口,用户创建元件时需要在 DLL 中实现相应 的抽象类。VSM 模型和 Proteus 系统通信的原理如下图: 绘图模型接口抽象类: ICOMPONENT――ISIS 内部一个活动组件对象,为 VSM 模型提供在原理图上绘图和用户交互的服务。 IACTIVEMODEL――用户实现的 VSM 绘图模型要继承此类,并实现相应的绘图和键盘鼠标事件处理。 电气模型接口抽象类: IINSTANCE――一个 PROSPICE 仿真原始模型,为 VSM 模型提供访问属性、模拟节点和数据引脚的服 务,还允许模型通过仿真日志发出警告和错误信息。 ISPICECKT(模拟)――SPICE 拥有的模拟元件,提供的服务:访问、创建和删除节点,在稀疏矩 阵上分配空间,同时还允许模型在给定时刻强制仿真时刻点的发生和挂起仿真。 ISPICEMODEL(模拟)――用户实现的 VSM 模拟元件要继承此类,并实现相应的载入数据,在完成 的时间点处理数据等。 IDSIMCKT(数字)――DSIM 拥有的数字元件,提供的服务:访问数字系统的变量,创建回调函数 和挂起仿真。 IDSIMMODEL(数字)――用户实现的 VSM 数字元件要继承此类,并实现相应的引脚状态变化的判断 和回调事件的处理。 IDSIMPIN(数字)――数字组件的引脚,提供检测引脚状态和创建输出事务事件的服务。 IDBUSPIN(数字)――数字组件的数据或地址总线,提供检测总线状态和创建总线输出事务事件的 服务。
IMIXEDMODEL(混合)――同时继承了 ISPICEMODEL 和 IDSIMMODEL,元件既有模拟特性,又有数 字特性。 为了让 Proteus 访问用户模型中的成员函数,必须创建用户模型的一个实例。这 不能通过类的接口来实现,只能通过从 DLL 中导出几个 C 函数来实现,在用户模型中必须实现这些 C 函数,达到构造和析构用户模型实例的效果。 (1)构造和析构绘图模型实例: IACTIVEMODEL *createactivemodel (CHAR *device, ILICENCESERVER *ils) VOID deleteactivemodel (IACTIVEMODEL *model) (2)构造和析构模拟电气模型实例: ISPICEMODEL *createspicemodel (CHAR *device, ILICENCESERVER *ils) VOID deletespicemodel (ISPICEMODEL *model) (3)构造和析构数字电气模型实例: IDSIMMODEL *createdsimmodel (CHAR *device, ILICENCESERVER *ils) VOID deletedsimmodel (IDSIMMODEL *model) (4)构造和析构混合电气模型实例: IMIXEDMODEL *createmixedmodel (CHAR *device, ILICENCESERVER *ils) VOID deletemixedmodel (IDSIMMODEL *model) 二、Proteus VSM 仿真模型开发流程 1.绘制元件图形、引脚和相关符号。 2.制作元件,设置元件属性。 3.用 C++编写元件,实现电气和绘图模型,编译生成 DLL。 4.搭建电路仿真测试。 三、VSM 模型开发实例 下面以 TG19264A 点阵式液晶显示元件的开发为实例详细讲解开发过程。 1.打开 Proteus,选择菜单 查看>>Snap 10 th,选择左边绘图工具栏的 2D graphics box,绘制 如图所示的三个图形。
2.选择 2D graphics line,给出两条直线,设置 width 为 36th,颜色为灰色。选择 2D graphics circle,给四个角绘制安装孔。选择 Markers for component origin,给三个图形分别绘图符号 原点(图中红色部分)。 3.选择 Device pin,顺时针旋转 90 度,放置 20 个引脚,如图所示。GND、VCC、V0、Vee、LED+
的电气类型选择 PP-Power Pin,D/I、R/W、E、CS1、RET、CS2、CS3 的电气类型选择 IP-Input, D0~D7 的电气类型选择 IO- Bidirectional。 4.右键拖出选择框选择第一个符号,选择菜单库>>制作符号,命名为 LCD19264A_C,确定。同理, 第二和第三个分别命名为 LCD19264A_1 和 LCD19264A_0。当用户调用 drawsymbol (-1),将绘制 LCD19264A_C,调用 drawsymbol (1),将绘制 LCD19264A_1,调用 drawsymbol (0),将绘制 LCD19264A_0。
5.右键拖出选择框选择符号 LCD19264A_C,选择菜单库>>制作元件,Device Properties 设置如图, 点击 Next>。跳过封装设置,点击 Next>。组件属性设置如图,
点击 Next>。选择数据手册(可选),点击 Next>。选择器件库,点击 OK。
6.打开 VC,新建工程,选择 Win32 Dynamic-Link Library,给工程命名,建立空的 DLL 工程。从 Proteus 安装目录的 INCLUDE 文件夹中将 VSM.HPP 复制到当前工程目录,新建文件 LCD19264A.H 和 LCD19264A.CPP,编写如下代码。 CODE: /***************************************************************** * 文件:LCD19264A.H * 说明:不支持以下特性 * (1) 不支持显示开关控制 * (2) 不支持设置显示起始行 *****************************************************************/ #i nclude "vsm.hpp" (LCD_BLK_LEN*LCD_BLK_NUM) //lcd length 50 //the width of blank //the width of symbol line //lcd block number //lcd block length //lcd line number 64 //lcd width 3 64 //LCD 常量 #define LCD_BLK_NUM #define LCD_BLK_LEN #define LCD_LINE_NUM 8 #define LCD_LENGTH #define LCD_WIDTH #define BLANK_WIDTH #define SYM_LINEWIDTH 28 //LCD 命令掩码 #define CMD_MASK //LCD 命令 #define DISP_ONOFF #define SET_STARTLINE 0xc0 //设置起始行 #define SET_XADDRESS 0x80 //设置 X 地址 #define SET_YADDRESS 0x40 //设置 Y 地址 //延时常量 #define DELAY_1s #define DELAY_1ms 1000000000 #define DELAY_1us 1000000 #define DELAY_1ns 1000 #define DELAY_1ps 1 0x00 //开关背光 1000000000000 0xc0 /* LCD 元件既有数字电气特性,也有绘图特性,所以要继承 IACTIVEMODEL 和 IDSIMMODEL */ class LCD19264A : public IACTIVEMODEL,public IDSIMMODEL { public: /* 电气模型成员函数 */ //数字电路总是返回 TRUE INT isdigital (CHAR *pinname); //当创建模型实例时被调用,做初始化工作 VOID setup (IINSTANCE *inst, IDSIMCKT *dsim);
//仿真运行模式控制,交互仿真中每帧开始时被调用 VOID runctrl (RUNMODES mode); //交互仿真时用户改变按键等的状态时被调用 VOID actuate (REALTIME time, ACTIVESTATE newstate); //交互仿真时每帧结束时被调用,通过传递 ACTIVEDATA 数据与绘图模型通信,从而调用 animate() 进行绘图 BOOL indicate (REALTIME time, ACTIVEDATA *data); //当引脚状态变化时被调用,主要用来处理数据输入和输出 VOID simulate (ABSTIME time, DSIMMODES mode); //可通过 setcallback()设置在给定时间调用的回调函数 VOID callback (ABSTIME time, EVENTID eventid); //DSIM 的数字元件 /* 绘图模型成员函数 */ //当创建模型实例时被调用,做初始化工作 VOID initialize (ICOMPONENT *cpt); //被 PROSPICE 调用,返回模拟电气模型 ISPICEMODEL *getspicemodel (CHAR *device); //被 PROSPICE 调用,返回数字电气模型 IDSIMMODEL *getdsimmodel (CHAR *device); //当原理图需要重绘时被调用 VOID plot (ACTIVESTATE state); //当相应的电气模型产生活动事件时被调用,常用来更新图形 VOID animate (INT element, ACTIVEDATA *newstate); //用来处理键盘和鼠标事件 BOOL actuate (WORD key, INT x, INT y, DWORD flags); private: IINSTANCE *instance; //PROSPICE 仿真原始模型 IDSIMCKT *ckt; ICOMPONENT *component; //ISIS 内部一个活动组件对象 //引脚定义 IDSIMPIN *di; //D/I IDSIMPIN *rw; //R/W IDSIMPIN *en; //E IDSIMPIN *cs1; //CS1 IDSIMPIN *cs2; //CS2 IDSIMPIN *cs3; //CS3 IDSIMPIN *d[8]; //D0~D7 IBUSPIN *databus; //D[0..7] //LCD 参数 BYTE x_addr; //X 地址(见手册) BYTE y_addr; //Y 地址(见手册) BYTE status; //状态(见手册) BYTE cur_blk; //当前块号(总共分 3 块,见手册) BYTE DDRAM[LCD_BLK_NUM][LCD_BLK_LEN*LCD_WIDTH/8]; //LCD 显示 RAM BOOL new_flag; //新数据到达标志 //显示参数 BOX lcdarea; //LCD 显示区域
分享到:
收藏