一个Proteus制作元件的例子.docx
- 文档编号:5026880
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:31
- 大小:801.62KB
一个Proteus制作元件的例子.docx
《一个Proteus制作元件的例子.docx》由会员分享,可在线阅读,更多相关《一个Proteus制作元件的例子.docx(31页珍藏版)》请在冰豆网上搜索。
一个Proteus制作元件的例子
最近发现Proteus确实是个好东西,于是准备拿它来设计一些东西.不过毕竟元件库不是很全,一些新的器
件还是没有,比如说:
LBC184.恰巧我要做关于它的东西,只能自己动手做元件了.(只是做图形而已,还没有
Model,那个据说要用VC++写一段程序,改天我研究一下,再写一篇文章)
摸索了一下,发现过程很简单,主要分以下几步:
1.画元件的外形,添加注释
2.定义元件的针脚
3.定义元件的PCB封装
为了保证像我一样的初学者能够看懂,所以俺尽量多放图
首先启动ISIS,如图一所示.利用左边的矩形工具画一个元件的外形,并且调整好大小.
然后利用文字工具,在元件的内部添上元件型号,以及简单注释,如图二所示.注意尽量别写中文,因为有
的时候会是乱码.
然后利用针脚工具,画上一个针脚.单击已经画好的针脚,弹出针脚定义框,填写针脚的名称等内容.
如图三所示.
把所有的针脚都添加进去,然后右键选中所有的内容,(这一步可是很重要,否则会有错误提示,无法继续
进行)
然后选择Libary菜单下的MakeSymbol
在弹出的对话框内填写好SymbolName,Libary,Type等内容.
>
注意Type选Graphic啦.
单击OK,对话框消失,什么反映也没有.如果刚才你没有右键选中整个元件,这会儿会有错误提示.
接着选择菜单Library->MakeDevice
会弹出个对话框,填写对话框的内容,主要就是DeviceName了,其他的不懂可以不添,Next.
然后出现
定义元件封装类型的对话框,Add
再Add,选择一种封装类型,比如俺这个件选的是DIP8,双击,
一个元件可以定义多种封装类型.
回到前一窗口,这会儿你可以把原理图上没有画的针脚定义上,比如Vcc,GND什么的.
然后一路NEXT,写好元件的名称和注释,最后选择元件类别.
一路NEXT,OK完成.
最后,我们自己画的元件就出现在元件库啦.
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)||(d
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一个 Proteus 制作 元件 例子