proteus元件制作步骤及方法.docx

上传人:b****1 文档编号:11094244 上传时间:2023-05-29 格式:DOCX 页数:19 大小:401.07KB
下载 相关 举报
proteus元件制作步骤及方法.docx_第1页
第1页 / 共19页
proteus元件制作步骤及方法.docx_第2页
第2页 / 共19页
proteus元件制作步骤及方法.docx_第3页
第3页 / 共19页
proteus元件制作步骤及方法.docx_第4页
第4页 / 共19页
proteus元件制作步骤及方法.docx_第5页
第5页 / 共19页
proteus元件制作步骤及方法.docx_第6页
第6页 / 共19页
proteus元件制作步骤及方法.docx_第7页
第7页 / 共19页
proteus元件制作步骤及方法.docx_第8页
第8页 / 共19页
proteus元件制作步骤及方法.docx_第9页
第9页 / 共19页
proteus元件制作步骤及方法.docx_第10页
第10页 / 共19页
proteus元件制作步骤及方法.docx_第11页
第11页 / 共19页
proteus元件制作步骤及方法.docx_第12页
第12页 / 共19页
proteus元件制作步骤及方法.docx_第13页
第13页 / 共19页
proteus元件制作步骤及方法.docx_第14页
第14页 / 共19页
proteus元件制作步骤及方法.docx_第15页
第15页 / 共19页
proteus元件制作步骤及方法.docx_第16页
第16页 / 共19页
proteus元件制作步骤及方法.docx_第17页
第17页 / 共19页
proteus元件制作步骤及方法.docx_第18页
第18页 / 共19页
proteus元件制作步骤及方法.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

proteus元件制作步骤及方法.docx

《proteus元件制作步骤及方法.docx》由会员分享,可在线阅读,更多相关《proteus元件制作步骤及方法.docx(19页珍藏版)》请在冰点文库上搜索。

proteus元件制作步骤及方法.docx

proteus元件制作步骤及方法

一、ProteusVSM仿真模型简介

   在使用Proteus仿真单片机系统的过程中,经常找不到所需的元件,这就需要自己编写。

ProteusVSM的一个主要特色是使用基于DLL组件模型的可扩展性。

这些模型分为两类:

电气模型(ElectricalModel)和绘图模型(GraphicalModel)。

电气模型实现元件的电气特性,按规定的时序接收数据和输出数据;绘图模型实现仿真时与用户的交互,例如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)

VOIDdeleteactivemodel(IACTIVEMODEL*model)

(2)构造和析构模拟电气模型实例:

ISPICEMODEL*createspicemodel(CHAR*device,ILICENCESERVER*ils)

VOIDdeletespicemodel(ISPICEMODEL*model)

(3)构造和析构数字电气模型实例:

IDSIMMODEL*createdsimmodel(CHAR*device,ILICENCESERVER*ils)

VOIDdeletedsimmodel(IDSIMMODEL*model)

(4)构造和析构混合电气模型实例:

IMIXEDMODEL*createmixedmodel(CHAR*device,ILICENCESERVER*ils)

VOIDdeletemixedmodel(IDSIMMODEL*model)

二、ProteusVSM仿真模型开发流程

1.绘制元件图形、引脚和相关符号。

2.制作元件,设置元件属性。

3.用C++编写元件,实现电气和绘图模型,编译生成DLL。

4.搭建电路仿真测试。

三、VSM模型开发实例

下面以TG19264A点阵式液晶显示元件的开发为实例详细讲解开发过程。

1.打开Proteus,选择菜单查看>>Snap10th,选择左边绘图工具栏的2Dgraphicsbox,绘制如图所示的三个图形。

2.选择2Dgraphicsline,给出两条直线,设置width为36th,颜色为灰色。

选择2Dgraphicscircle,给四个角绘制安装孔。

选择Markersforcomponentorigin,给三个图形分别绘图符号原点(图中红色部分)。

3.选择Devicepin,顺时针旋转90度,放置20个引脚,如图所示。

GND、VCC、V0、Vee、LED+的电气类型选择PP-PowerPin,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,选择菜单库>>制作元件,DeviceProperties设置如图,

点击Next>。

跳过封装设置,点击Next>。

组件属性设置如图,

点击Next>。

选择数据手册(可选),点击Next>。

选择器件库,点击OK。

6.打开VC,新建工程,选择Win32Dynamic-LinkLibrary,给工程命名,建立空的DLL工程。

从Proteus安装目录的INCLUDE文件夹中将VSM.HPP复制到当前工程目录,新建文件LCD19264A.H和LCD19264A.CPP,编写如下代码。

CODE:

/*****************************************************************

*文件:

LCD19264A.H

*说明:

不支持以下特性

*

(1)不支持显示开关控制

*

(2)不支持设置显示起始行

*****************************************************************/

#include"vsm.hpp"

//LCD常量

#defineLCD_BLK_NUM 3 //lcdblocknumber

#defineLCD_BLK_LEN 64 //lcdblocklength

#defineLCD_LINE_NUM8 //lcdlinenumber

#defineLCD_LENGTH (LCD_BLK_LEN*LCD_BLK_NUM) //lcdlength

#defineLCD_WIDTH 64 //lcdwidth

#defineBLANK_WIDTH 50 //thewidthofblank

#defineSYM_LINEWIDTH28 //thewidthofsymbolline

//LCD命令掩码

#defineCMD_MASK 0xc0

//LCD命令

#defineDISP_ONOFF 0x00//开关背光

#defineSET_STARTLINE0xc0//设置起始行

#defineSET_XADDRESS0x80//设置X地址

#defineSET_YADDRESS0x40//设置Y地址

//延时常量

#defineDELAY_1s 1000000000000

#defineDELAY_1ms1000000000

#defineDELAY_1us1000000

#defineDELAY_1ns1000

#defineDELAY_1ps1

/*

LCD元件既有数字电气特性,也有绘图特性,所以要继承IACTIVEMODEL和IDSIMMODEL

*/

classLCD19264A:

publicIACTIVEMODEL,publicIDSIMMODEL

{

public:

/*电气模型成员函数*/

//数字电路总是返回TRUE

INTisdigital(CHAR*pinname);

//当创建模型实例时被调用,做初始化工作

VOIDsetup(IINSTANCE*inst,IDSIMCKT*dsim);

//仿真运行模式控制,交互仿真中每帧开始时被调用

VOIDrunctrl(RUNMODESmode);

//交互仿真时用户改变按键等的状态时被调用

VOIDactuate(REALTIMEtime,ACTIVESTATEnewstate);

//交互仿真时每帧结束时被调用,通过传递ACTIVEDATA数据与绘图模型通信,从而调用animate()进行绘图

BOOLindicate(REALTIMEtime,ACTIVEDATA*data);

//当引脚状态变化时被调用,主要用来处理数据输入和输出

VOIDsimulate(ABSTIMEtime,DSIMMODESmode);

//可通过setcallback()设置在给定时间调用的回调函数

VOIDcallback(ABSTIMEtime,EVENTIDeventid);

/*绘图模型成员函数*/

//当创建模型实例时被调用,做初始化工作

VOIDinitialize(ICOMPONENT*cpt);

//被PROSPICE调用,返回模拟电气模型

ISPICEMODEL*getspicemodel(CHAR*device);

//被PROSPICE调用,返回数字电气模型

IDSIMMODEL*getdsimmodel(CHAR*device);

//当原理图需要重绘时被调用

VOIDplot(ACTIVESTATEstate);

//当相应的电气模型产生活动事件时被调用,常用来更新图形

VOIDanimate(INTelement,ACTIVEDATA*newstate);

//用来处理键盘和鼠标事件

BOOLactuate(WORDkey,INTx,INTy,DWORDflags);

private:

IINSTANCE*instance;//PROSPICE仿真原始模型

IDSIMCKT*ckt;  //DSIM的数字元件

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参数

BYTEx_addr;//X地址(见手册)

BYTEy_addr;//Y地址(见手册)

BYTEstatus;//状态(见手册)

BYTEcur_blk;//当前块号(总共分3块,见手册)

BYTEDDRAM[LCD_BLK_NUM][LCD_BLK_LEN*LCD_WIDTH/8];//LCD显示RAM

BOOLnew_flag;//新数据到达标志

//显示参数

BOXlcdarea;//LCD显示区域

floatpix_width,pix_height;//每象素对应矩形的宽和高

};

CODE:

/*****************************************************************

*文件:

LCD19264A.CPP

*说明:

不支持以下特性

*

(1)不支持显示开关控制

*

(2)不支持设置显示起始行

*****************************************************************/

#include

#include"LCD19264A.h"

//----------------------------------------------------------------------------

//电气模型的实现

//构造数字电气模型实例

extern"C"IDSIMMODEL__declspec(dllexport)*createdsimmodel(CHAR*device,ILICENCESERVER*ils)

{

//授权认证

ils->authorize(0x88888888,0x69);//版本为6.9

returnnewLCD19264A;//创建模型实例

}

//析构数字电气模型实例

extern"C"VOID__declspec(dllexport)deletedsimmodel(IDSIMMODEL*model)

{

delete(LCD19264A*)model;//删除模型实例

}

//数字电路总是返回TRUE

INTLCD19264A:

:

isdigital(CHAR*pinname)

{

return1;

}

//当创建模型实例时被调用,做初始化工作

VOIDLCD19264A:

:

setup(IINSTANCE*inst,IDSIMCKT*dsim)

{

instance=inst;//PROSPICE仿真原始模型

ckt=dsim; //DSIM的数字元件

//获取引脚

di=instance->getdsimpin("D/I,d/i",true);

di->setstate(FLT);//FLOAT

rw=instance->getdsimpin("R/W,r/w",true);

rw->setstate(FLT);

en=instance->getdsimpin("E,e",true);

en->setstate(FLT);

cs1=instance->getdsimpin("CS1,cs1",true);

cs1->setstate(FLT);

cs2=instance->getdsimpin("CS2,cs2",true);

cs2->setstate(FLT);

cs3=instance->getdsimpin("CS3,cs3",true);

cs3->setstate(FLT);

d[0]=instance->getdsimpin("D0,d0",true);

d[0]->setstate(FLT);

d[1]=instance->getdsimpin("D1,d1",true);

d[1]->setstate(FLT);

d[2]=instance->getdsimpin("D2,d2",true);

d[2]->setstate(FLT);

d[3]=instance->getdsimpin("D3,d3",true);

d[3]->setstate(FLT);

d[4]=instance->getdsimpin("D4,d4",true);

d[4]->setstate(FLT);

d[5]=instance->getdsimpin("D5,d5",true);

d[5]->setstate(FLT);

d[6]=instance->getdsimpin("D6,d6",true);

d[6]->setstate(FLT);

d[7]=instance->getdsimpin("D7,d7",true);

d[7]->setstate(FLT);

//为方便操作,将D0~D7映射为8位总线

databus=instance->getbuspin("LCD_DBUS",d,8);

databus->settiming(100,100,100);//设置时间延迟

databus->setstates(SHI,SLO,FLT);//设置总线逻辑为[1,0,三态]时的驱动状态

//lcdmodel

x_addr=0;//X地址(见手册)

y_addr=0;//Y地址(见手册)

status=0;//状态(见手册)

new_flag=TRUE;//新数据到达标志

}

//仿真运行模式控制,交互仿真中每帧开始时被调用

VOIDLCD19264A:

:

runctrl(RUNMODESmode)

{

}

//交互仿真时用户改变按键等的状态时被调用

VOIDLCD19264A:

:

actuate(REALTIMEtime,ACTIVESTATEnewstate)

{

}

//交互仿真时每帧结束时被调用,通过传递ACTIVEDATA数据与绘图模型通信,从而调用animate()进行绘图

BOOLLCD19264A:

:

indicate(REALTIMEtime,ACTIVEDATA*data)

{

if(new_flag){//有新数据到达

 data->type=ADT_REAL;//callbackanimate()torefreshlcd

 data->realval=(float)time*DSIMTICK;

}

returnTRUE;

}

//当引脚状态变化时被调用,主要用来处理数据输入和输出

VOIDLCD19264A:

:

simulate(ABSTIMEtime,DSIMMODESmode)

{

BYTEdata;

if(en->isnegedge()){ //E的下降沿到达

 if((rw->istate()==SLO)||(rw->istate()==WLO)){//R/W为低表示写

  //读块选择

  if((cs1->istate()==SLO)||(cs1->istate()==WLO))

   cur_blk=0;

  elseif((cs2->istate()==SLO)||(cs2->istate()==WLO))

   cur_blk=1;

  elseif((cs3->istate()==SLO)||(cs3->istate()==WLO))

   cur_blk=2;

  else

   return;//notselectblock

  

  data=(BYTE)databus->getbusvalue();//读数据

  if((di->istate()==SHI)||(di->istate()==WHI)){//D/I为高表示数据

   DDRAM[cur_blk][x_addr*LCD_BLK_LEN+y_addr]=data;//写入数据

   new_flag=TRUE;//新数据到达标志

   y_addr=((y_addr+1)%LCD_BLK_LEN); //y地址自动加1

   if(y_addr==0)

    x_addr=((x_addr+1)%LCD_LINE_NUM);//自动换行

  }else{ //D/I为低表示命令

   switch(data&CMD_MASK)

   {

   caseDISP_ONOFF:

//开关背光

    break;

   caseSET_STARTLINE:

//设置起始行

    break;

   caseSET_XADDRESS:

//设置X地址

    x_addr=(data&0x07);//bit2~bit0

    break;

   caseSET_YADDRESS:

//设置Y地址

    y_addr=(data&0x3f);//bit5~bit0

    break;

   default:

    break;

   }

  }

 }else{ //E的下降沿到达,R/W为高表示读结束

  databus->drivetristate(time);//驱动总线为三态

 }

}elseif(en->isposedge() //E的上升沿到达

  &&((rw->istate()==SHI)||(rw->istate()==WHI))){//R/W为高表示读

 if((di->istate()==SHI)||(di->istate()==WHI)){//D/I为高表示数据

  //读块选择

  if((cs1->istate()==SLO)||(cs1->istate()==WLO))

   cur_blk=0;

  elseif((cs2->istate()==SLO)||(cs2->istate()==WLO))

   cur_blk=1;

  elseif((cs3->istate()==SLO)||(cs3->istate()==WLO))

   cur_blk=2;

  else

   return;//notselectblock

  data=DDRAM[cur_blk][x_addr*LCD_BLK_LEN+y_addr];

  databus->drivebusvalue(time,data); //输出数据

  y_addr=((y_addr+1)%LCD_BLK_LEN); //y地址自动加1

  if(y_addr==0)

   x_addr=((x_addr+1)%LCD_LINE_NUM);//自动换行

 }else{ //D/I为低表示命令

  databus->drivebusvalue(time,status);//输出状态

 }

}

}

//可通过setcallback()设置在给定时间调用的回调函数

VOIDLCD19264A:

:

callback(ABSTIMEtime,EVENTIDeventid)

{

}

//----------------------------------------------------------------------------

//绘图模型的实现

//Exportedconstructorforactivecomponentmodels.

extern"C"IACTIVEMODEL__declspec(dllexport)*createactivemodel(CHAR

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

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2