Altium教程PortSwitcher 1A软件设计1A
Altium简明教程
在添加元件后通常要设定元件的编号和属性,方法有:1.在需要编辑属性的元件上单击右键,选择“Properties”。
2.双击需要编辑属性的元件。
3.在放置元件的同时按“Tab”键。
4.在“Preferences”对话框的“Graphical Editing”选项卡勾选“Double Click Run Inspect”项,在双击元件时会打开如图所示的“Inspector”对话框。
用户可在“Inspector”对话框的“Component Designator”栏内修改元件的编号。
5.如果用户在“Preferences”对话框的“Schematic”选项卡中勾选了“Enable In-PlaceEditing“项,直接在元件的编号处单击鼠标,将编号文字转为可编辑状态,就可以编辑元件的编号了。
布置导线在原理图绘制的过程中,可以使用导线将电气关系上相连的两个点连接起来。
(1)单击“Wring”工具栏中的工具按钮,或者选择主菜单中的“Place” “Wire”命令。
光标自动变成“十”字形,表示系统处于放置导线状态。
光标的具体形状与“Document Option”中的设置有关。
(2)将光标移动到欲放置导线的起点位置(一般是元件的引脚),若设置了电气栅格后,系统会自动定位到光标附近的原理图设计是指,在计算机辅助设计平台上使用原理图来表达设计者设计意图的的过程。
对于电子设计工程师来说,绘制电路原理图的主要目的是获得电路逻辑上的一种结构模型,以便于检验该设计和指导生产。
2.1DXP Schematic Editor简介DXP Schematic Editor是Protel DXP 20004的前端输入模块,用以辅助用户完成PCB板级项目设计和FPGA项目设计的前端输入工作。
用户可以在DXP Schematic Editor环境中制作、编辑、检查和打印设计项目的原理图纸。
DXP Schematic Editor特性1.层次化的设计结构DXP Schematic Editor的原理图编辑器支持由上至下的层次设计方法和多图纸的设计,项目文档由项目管理器管理,层次结构清晰明确,便于优化设计结构。
非常实用的Altium_Designer使用教程
Altium Designer使用教程创立一个新的PCB工程在Altium Designer里,一个工程包括所有文件之间的关联和设计的相关设置。
一个工程文件,例如,是一个ASCII文本文件,它包括工程里的文件和输出的相关设置,例如,打印设置和CAM设置。
与工程无关的文件被称为"自由文件"。
与原理图和目的输出相关联的文件都被参加到工程中,例如PCB,FPGA,嵌入式(VHDL)和库。
当工程被编译的时候,设计校验、仿真同步和比对都将一起进展。
任何原始原理图或者PCB的改变都将在编译的时候更新。
所有类型的工程的创立过程都是一样的。
本章以PCB工程的创立过程为例进展介绍,先创立工程文件,然后创立一个新的原理图并参加到新创立的工程中,最后创立一个新的PCB,和原理图一样参加到工程中。
作为本章的开场,先来创立一个PCB工程:图6-1 PCB工程的创立1.选择File>>New>>Project>>PCB Project,或在Files面板的内New选项中单击Blank Project (PCB)。
假如这个选项没有显示在界面上那么从System中选择Files。
也可以在Altium Designer软件的Home Page 的Pick a Task局部中选择Printed Circuit Board Design,并单击New Blank PCB Project。
2. 显示Projects面板框显示在屏幕上。
新的工程文件已经列于框中,并且不带任何文件,如图6-1所示。
3.重新命名工程文件〔用扩展名.PrjPCB〕,选择File>>Save Project As。
保存于您想存储的地方,在File Name中输入工程名B并单击Save保存。
下面我们将会创立一个原理图文件并添加到空的工程中。
这个原理图就是教程中的例子非稳态多谐振荡器。
创立一个新的电气原理图通过下面的步骤来新建电路原理图:1.选择File>>New>>Schematic,或者在Files面板内里的New选项中单击Schematic Sheet。
Altium-Designer的基本设计流程
Altium-Designer的基本设计流程1. 确定设计需求和目标在开始设计之前,需要先确定设计的需求和目标,包括电路功能、性能指标、板子的数目和大小、布局约束等等。
这一步是整个设计流程中最为重要的一步,因为它决定了设计的方向和范围。
2. 构建电路原理图在Altium Designer中,我们可以使用原理图来设计电路。
原理图是一个电路图,它由各种符号和连线组成。
我们可以在原理图中添加电阻、电容、晶体管、集成电路和其他电子元件。
在构建原理图的过程中,需要注意一些细节。
如何使用正确的元件库,如何绘制准确的电路连接,如何设置元件属性等等。
这些都需要在设计的过程中仔细考虑。
3. 设计PCB布局在完成电路原理图的设计后,接下来是进行PCB布局。
在这一步中,我们需要把电路元件布置在PCB上,同时确定它们的连接方式和走线方式。
在进行布局时,需要考虑一些因素,例如板子的大小、电路元件的数量、PCB布线的方向、板子的厚度等等。
这些都会影响到整个布局结果。
因此,在进行布局时需要认真分析电路原理图,考虑各种细节。
4. 进行走线布线在完成PCB布局后,接下来是进行走线布线。
这是整个设计中最为关键的一步,因为它决定了电路的性能和可靠性。
在进行走线布线时,需要根据电路原理图和PCB布局来决定走线的路径。
需要考虑各种因素,例如信号通路、电源分布、地面等等。
同时,还需要根据布局约束来设置DRC(Design Rule Check),以保证PCB的可靠性和良好的电气性能。
5. 进行PCB元件布置优化在完成PCB布局和走线布线后,接下来是进行PCB元件布置的优化。
这一步主要是对已有的PCB布局进行调整,以满足设计需求和目标。
在进行元件布置优化时,需要根据电路原理图和PCB布局来调整电子元件的位置和连接方式,以满足电路功能和性能指标。
需要进行反复的试验和调整,以保证结果的正确性和可靠性。
6. 进行PCB设计验证和测试在完成PCB布局和元件布置优化后,接下来是进行PCB设计验证和测试。
altiumdesigner使用教程
设计并生成PCB根据WEBENCH生成的电源原理图,就可以在AltiumDesigner中画出设计电路的原理图和PCB 图。
1.Ultra Librarian 的安装和使用1) 在TI官网下载并安装UIltral Librarian并安装,下载地址:2) 在TI官网找到要使用的芯片,在“符号和封装”项目下点击下载CAD文件(后缀为.bxl),如下图所示:3) 打开Ultral Librarian软件,首先点击“Load Data”装载刚刚下载.bxl文件,在选择"SelectTools”中的"Altium Designer”,最后点击“Export toSelected Tools”。
如下图所示:田PatemViem. TQFP.[区留Utrs Lbrarin Binsy Readsr Vericn 5.3.409stup t,Suocta ile to Load.Load Data Doy nload from websites and databasesStep 2, 50lectToolsAcoel15/FCAD20X/MimD=spe! C m 2 0 E 口 CadncaAkgo 14-151CadenceAego 15.2d1 n298G e160 C160 MmirExedicn39 ·2000gm CDX G 0CQnadCalre CI5 VS0 meAl Qrcad L4otV9crneu,MrloPAOS/PeMelggc4crnemm304C207Zu Cadt2Vasn34 Z4eCR5000 eiese|留SymbeNicm PC2.[NtHptop-3.EportocadTools Export to Selected ToolsBenefis Opions- 听i o n s / H e p txit Programof Upgrading4) 随后会生成一个.txt 文档,如下图所示。
Altium Designer课件第一章
的显卡 ? 并口 (用于连接 NanoBoard-NB1) ? USB2.0 端口(用于连接NanoBoard-NB2) ? Adobe? Reader? 8 或更高版本 ? DVD 驱动器
ALTIUM DESIGNER SUMMER 09的安装1
ALTIUM DESIGNER SUMMER 09的启动2
启动 过程
ALTIUM DESIGNER SUMMER 09的启动3
启动过程
ALTIUM DESIGNER SUMMER 09的启动4
启动 过程
ALTIUM DESIGNER SUMMER 09 的主页界面管理
①主页界面管理
ALTIUM DESIGNER 设计环境-窗口界面
Altium Designer Summer 09的安装过程非常 简单、轻松。只需双击 setup.exe 文件,即可 启动安装程序,按照提示一步一步执行下去即 可安装成功。
ALTIUM DESIGNER SUMMER 09的安装2
按照提示一步一步执行下去进行安装:
ALTIUM DESIGNER SUMMER 09的安装3 按照提示一步一步执行下去进行安装:
? 我们该如何自定义菜单---如快捷键F1呢?
? 插句话:必备软件-有道词典, PDF 阅读器,红蜻 蜓抓图,画图板等
ALTIUM DESIGNER 设计环境-用户自定义
ALTIUM DESIGNER 设计环境-用户自定义
? 建立快捷键 F1之前让我们来想想,是不是要给他 找好住处,带上一顶帽子呢?
ALTIUM DESIGNER 发展历史
? 随着电子工业的飞速发展和电子计算机技术的广泛应用,促进了 电子设计自动化技术日新月异。特别是在20世纪80年代末期,由 于电子计算机操作系统Windows的出现,引发了计算机辅助设计 (Computer Aided Design CAD)软件的一次大的变革,纷纷臣服于 Microsoft的Windows风格,并随着Windows版本的不断更新,也相 应地推出新的CAD软件产品。在电子CAD领域,Protel Technology (Altium的前身)公司在EDA软件产品的推陈出新方面扮 演了一个重要角色。
AltiumDesigner电路设计之原理图设计基础
总结词
元件库缺失是电路设计中最常见的问题 之一,它可能导致设计无法进行或无法 正确进行。
VS
பைடு நூலகம்
详细描述
当设计师在Altium Designer中找不到所 需的元件库时,可以尝试以下解决方案: 1. 检查元件库是否已经正确安装;2. 确 认元件库的路径是否正确;3. 尝试在网 上查找该元件库并下载安装;4. 如果以 上方法都无法解决问题,可以联系 Altium Designer的技术支持寻求帮助。
PROTEL
一款经典的电路设计软件 ,具有丰富的元件库和强 大的布线功能。
02 原理图设计基本元素
电路元件
电阻(Resistor)
电容(Capacitor)
表示电路中电阻的元件,用于限制电流。
表示电路中电容的元件,用于存储电荷。
电感(Inductor)
二极管(Diode)
表示电路中电感的元件,用于存储磁场能 量。
通过原理图,设计师可以清晰 地理解电路的工作原理,便于 后续的电路板设计和调试。
原理图设计通常使用专门的原 理图设计软件,如Altium Designer。
原理图设计流程
收集资料
收集相关的电路元件资料、芯 片数据手册等。
检查与修改
对绘制的原理图进行检查和修 改,确保其正确性和可实现性 。
确定设计目标
模块化设计
详细描述
层次化电路原理图设计是将整个电路按照功能划分为若干个模块,每个模块对应一个子图。这种设计方法有利于 提高电路的可读性和可维护性,便于多人协作设计和项目管理。在设计时,应遵循模块化设计原则,合理划分模 块,明确模块间的接口和信号传递关系。
实例四:混合电路原理图设计
总结词
多种元件与技术融合
AltiumDesigner软件使用教程
目录目录 (1)第一部分应用电子技术实训教学大纲,要求与实训资源简介 (4)1.1应用电子技术实训教学大纲 (4)1.2实训内容与学时分配 (5)1.3实训安排与考核方式 (7)第二部分Altium Designer10电路设计实训入门 (8)2.1 印制电路板与Protel概述 (8)2.1.1印制电路板设计流程 (9)2.2 原理图设计 (10)2.2.1 原理图设计步骤: (10)2.2.2 原理图设计具体操作流程 (11)2.3 原理图库的建立 (19)2.3.1 原理图库概述 (19)2.3.2 编辑和建立元件库 (19)2.4 创建PCB元器件封装 (25)2.4.1元器件封装概述 (25)2.4.2 创建封装库大体流程 (26)2.4.3 绘制PCB封装库具体步骤和操作 (27)2.5 PCB设计 (37)2.5.1 重要的概念和规则 (37)2.5.2 PCB设计流程 (38)2.5.3详细设计步骤和操作 (39)2.6 实训项目 (47)2.6.1 任务分析 (47)2.6.2 任务实施 (49)第三部分PCB板基础知识、布局原则、布线技巧、设计规则 (87)3.1 PCB板基础知识 (87)3.2 PCB板布局原则...............................................................................................错误!未定义书签。
3.3 PCB板布线原则 (91)3.4 Alitum Designer的PCB板布线规则 (93)第四部分自制电路板实训入门 (98)4.1 自制电路板最常用方法及工具介绍 (98)4.2 描绘法自制电路板 (102)4.3感光板法制作电路板(图解说明全过程) ...................................................错误!未定义书签。
第1章-Altium-Designer-操作入门
•第1章 Altium Designer 操作入门o 1.1 Altium Designer 7.0简介▪ 1.1.1 Altium Designer 发展历史▪ 1.1.2 Altium Designer 7.0新特性o 1.2 Altium Designer 7.0的组成▪ 1.2.1 原理图设计系统▪ 1.2.2 电路原理图仿真系统▪ 1.2.3 印制电路板设计系统▪ 1.2.4 可编程逻辑器件设计系统o 1.3 Altium Designer 7.0的安装和启动▪ 1.3.1 Altium Designer 7.0运行的系统需求▪ 1.3.2 安装过程与启动o 1.4 Altium Designer 操作环境▪ 1.4.1 工作环境▪ 1.4.2 工作面板管理▪ 1.4.3 窗口管理▪ 1.4.4 基本参数设置o 1.5 Altium Designer电路设计的基本流程▪ 1.5.1 文件系统▪ 1.5.2 绘制原理图▪ 1.5.3 绘制PCB图第1章 Altium Designer 操作入门随着电子技术的迅速发展和芯片生产工艺的不断提高,电路板的结构变得越来越复杂,从最早的单层板到常用的双层板再到复杂的多层电路板设计,电路板上的布线密度越来越高,随着DSP,ARM、FPGA 等高速逻辑器件的应用,电路板的信号完整性与抗干扰性能显得尤为重要。
这就使得电路板设计工程师们仅靠原始的手工设计方式来设计复杂的电路板变得不现实。
随着计算机辅助与仿真技术的发展,各种电路板设计与仿真软件迅速发展起来,使得复杂的电路板设计变得尤为简单,大大提高了设计者的设计效率,缩短了产品开发周期。
现在市场上常见的电路板板级设计软件有Protel、PowerPCB、Cadence、 AutoCAD等,其中Protel在国内应用最为广泛,从最早的Protel 99SE到后续的Protel DXP,再到最新版本的Altium Designer,Protel 已变得越来越强大,功能越来越完善,使得设计者们完全从枯燥无味的点与线的体力劳动中解放出来。
第2章 Altium软件设计快速入门(实例:闪烁灯单面PCB)
电阻元件的库名称 RES*(RES 1-4)
电容元件的库名称 CAP*(无极性、CAP POL*有极性)
电感元件的库名称 Inductor
二极管的库名称 Diode*(整流管、稳压管、肖特基管等)
发光二级管的名称 LED*
三极管的库名称 NPN/PNP
开关的库名称
SW-*(按键开关、 单刀双掷开关等)
连接器件库 Miscellaneous Connector.lib
连接器/排针的名称 Header(2-30Pin)
2.2.5 元件布局与参数设置(步骤3)
悬浮状态下, 按(TAB)键修改元件参数 按(空格)键元件旋转90° 按(X、Y)键水平、垂直翻转元件
说明 电阻 发光二级管 极性电容 三极管 连接器
厂家名称.IntLib
包含各厂家生产的元器件的符号和封装
2.2.4 快速查找、放置常用元件及电源端口(步骤3)
元件库面板:
元件搜索框 元器件列表
原理图 符号预览
模型元件列表
PCB 3D 模型预览
2.2.4 快速查找、放置常用元件及电源端口(步骤3)
• 请牢记常用元件的库名称:
杂项元件库 Miscellaneous Devices.lib
图2-33 创建原理图文件
2.2.1 认识原理图编辑器
点击菜单【File】(文件)→【New】(新建) →【Schematic】(原理图)命令
2.2.1 认识原理图编辑器
可在菜单栏的查看→工具条中调出相应的工具栏
Schematic Standard 原理图标准工具栏
非常实用的Altium_Designer使用教程
Altium Designer使用教程创建一个新的PCB工程在Altium Designer里,一个工程包括所有文件之间的关联和设计的相关设置。
一个工程文件,例如xxx.PrjPCB,是一个ASCII文本文件,它包括工程里的文件和输出的相关设置,例如,打印设置和CAM设置。
与工程无关的文件被称为"自由文件"。
与原理图和目标输出相关联的文件都被加入到工程中,例如PCB,FPGA,嵌入式(VHDL)和库。
当工程被编译的时候,设计校验、仿真同步和比对都将一起进行。
任何原始原理图或者PCB的改变都将在编译的时候更新。
所有类型的工程的创建过程都是一样的。
本章以PCB工程的创建过程为例进行介绍,先创建工程文件,然后创建一个新的原理图并加入到新创建的工程中,最后创建一个新的PCB,和原理图一样加入到工程中。
作为本章的开始,先来创建一个PCB工程:图6-1 PCB工程的创建1.选择File>>New>>Project>>PCB Project,或在Files面板的内New选项中单击Blank Project (PCB)。
如果这个选项没有显示在界面上则从System中选择Files。
也可以在Altium Designer软件的Home Page的Picka Task部分中选择Printed Circuit Board Design,并单击New Blank PCB Project。
2. 显示Projects面板框显示在屏幕上。
新的工程文件PCB_Project1.PrjPCB已经列于框中,并且不带任何文件,如图6-1所示。
3.重新命名工程文件(用扩展名.PrjPCB),选择File>>Save Project As。
保存于您想存储的地方,在File Name 中输入工程名Multivibrator.PrjPCB并单击Save保存。
下面我们将会创建一个原理图文件并添加到空的工程中。
Altium教程PortSwitcher 3A软件设计1A
PortSwitcher 3软件设计第一部分 原理图1.1 FPGA_Port.SchDocINPUTS[16..0]PORT_INPUTS[16..0]G eneric 17-bit Input PortInput to Output Map Multiplexer[16..0][16..0]INPUTS[16..0]PORT_INPUTS[16..0]G eneric 17-bit Input PortInput to Output Map Multiplexer[16..0][16..0]1.2FPGA_Port.PAS {..............................................................................} { Summary }{ Demo how to add, modify and delete the user parameters for components } { }{ Version 1.0 }{ Copyright (c) 2008 by PurPer Limited } {..............................................................................}{..............................................................................} ConstUserDefinedName = 'User-Defined';UserDefinedText = 'Text';{..............................................................................}{..............................................................................} Procedure AddUserDefinedParametersToComponents(SchDoc : ISch_Document);VarComponent : ISch_Component;Param : ISch_Parameter;Offset : Integer;Iterator : ISch_Iterator;Begin// Create a user defined parameter object and add it to all components.// Look for components onlyIterator := SchDoc.SchIterator_Create;Iterator.AddFilter_ObjectSet(MkSet(eSchComponent));TrySchServer.ProcessControl.PreProcess(SchDoc, '');TryComponent := Iterator.FirstSchObject;While Component <> Nil DoBegin// Add the parameter to the pin with undo stack also enabledParam := SchServer.SchObjectFactory (eParameter , eCreate_Default); := UserDefinedName;Param.ShowName := False;Param.Text := UserDefinedText;Param.IsHidden := False;// Param object is placed 0.1 Dxp Units above the component.Param.Location := Point(Component.Location.X, Component.Location.Y + DxpsToCoord(0.1));Component.AddSchObject(Param);SchServer.RobotManager.SendMessage(Component.I_ObjectAddress, c_BroadCast, SCHM_PrimitiveRegistration, Param.I_ObjectAddress);Component := Iterator.NextSchObject;End;FinallySchDoc.SchIterator_Destroy(Iterator);End;FinallySchServer.ProcessControl.PostProcess(SchDoc, '');End;End; {..............................................................................}{..............................................................................}Procedure ModifyUSerDefinedParametersOfComponents(Sheet : ISch_Document; UserDefined : String);VarComponent : ISch_Component;Parameter : ISch_Parameter;Iterator : ISch_Iterator;PIterator : ISch_Iterator;BeginIf Sheet = Nil Then Exit;// Look for components onlyIterator := Sheet.SchIterator_Create;Iterator.AddFilter_ObjectSet(MkSet(eSchComponent));// Initialize the robots in Schematic editor.SchServer.ProcessControl.PreProcess(Sheet, '');TryComponent := Iterator.FirstSchObject;While Component <> Nil DoBeginTryPIterator := Component.SchIterator_Create;PIterator.AddFilter_ObjectSet(MkSet(eParameter));Parameter := PIterator.FirstSchObject;While Parameter <> Nil DoBegin// Check for parameters that have the UserDefinedName Name.If = UserDefinedName ThenBeginSchServer.RobotManager.SendMessage(Parameter.I_ObjectAddress, c_BroadCast, SCHM_BeginModify, c_NoEventData);Parameter.Text := UserDefined;SchServer.RobotManager.SendMessage(Parameter.I_ObjectAddress, c_BroadCast, SCHM_EndModify , c_NoEventData);End;Parameter := PIterator.NextSchObject;End;FinallyComponent.SchIterator_Destroy(PIterator);End;Component := Iterator.NextSchObject;End;FinallySheet.SchIterator_Destroy(Iterator);End;// Clean up robots in Schematic editor.SchServer.ProcessControl.PostProcess(Sheet, '');// Refresh the screenSheet.GraphicallyInvalidate;End; {..............................................................................}{..............................................................................} Procedure DeleteUserDefinedParametersOfComponents(SchDoc : ISch_Document);VarComponent : ISch_Component;OldParameter : ISch_Parameter;Parameter : ISch_Parameter;Iterator : ISch_Iterator;PIterator : ISch_Iterator;I : Integer;ParameterList : TInterfaceList;Begin// Initialize the robots in Schematic editor.SchServer.ProcessControl.PreProcess(SchDoc, '');// Look for components onlyIterator := SchDoc.SchIterator_Create;Iterator.AddFilter_ObjectSet(MkSet(eSchComponent));ParameterList := TInterfaceList.Create;TryComponent := Iterator.FirstSchObject;While Component <> Nil DoBeginTryPIterator := Component.SchIterator_Create;PIterator.AddFilter_ObjectSet(MkSet(eParameter));Parameter := PIterator.FirstSchObject;While Parameter <> Nil DoBeginIf = UserDefinedName ThenParameterList.Add(Parameter);Parameter := PIterator.NextSChObject;End;FinallyComponent.SchIterator_Destroy(PIterator);End;Component := Iterator.NextSchObject;End;FinallySchDoc.SchIterator_Destroy(Iterator);End;// Remove Parameters from their componentsTryFor I := 0 to ParameterList.Count - 1 DoBeginParameter := ParameterList.items[i];// Obtain the parent object which is the component// that user defined param is part of.Component := Parameter.Container;Component.RemoveSchObject(Parameter);SchServer.RobotManager.SendMessage(Component.I_ObjectAddress,c_BroadCast,SCHM_PrimitiveRegistration,Parameter.I_ObjectAddress);End;FinallyParameterList.Free;End;// Clean up robots in Schematic editor.SchServer.ProcessControl.PostProcess(SchDoc, '');// Refresh the screenSchDoc.GraphicallyInvalidate;End; {..............................................................................}{..............................................................................}Procedure AddComponentUserParameters;VarI : Integer;CurrentSch : ISch_Document;SchDocument : IServerDocument;Project : IProject;BeginProject := GetWorkspace.DM_FocusedProject;If Project = Nil Then Exit;Project.DM_Compile;// selected or all documents within the projectFor I := 0 to Project.DM_LogicalDocumentCount - 1 DoBeginDoc := Project.DM_LogicalDocuments(I);If Doc.DM_DocumentKind = 'SCH'ThenBeginSchDocument := Client.OpenDocument('Sch', Doc.DM_FullPath);If SchDocument <> Nil ThenBeginClient.ShowDocument(SchDocument);CurrentSch := SchServer.GetCurrentSchDocument;If CurrentSch = Nil Then Exit;AddUserDefinedParametersToComponents(CurrentSch);End;End;End;End; {..............................................................................}{..............................................................................} Procedure DeleteComponentUserParameters;VarProject : IProject;Doc : IDocument;CurrentSch : ISch_Document;SchDocument : IServerDocument;BeginProject := GetWorkspace.DM_FocusedProject;If Project = Nil Then Exit;Project.DM_Compile;// selected or all documents within the projectFor I := 0 to Project.DM_LogicalDocumentCount - 1 DoBeginDoc := Project.DM_LogicalDocuments(I);If Doc.DM_DocumentKind = 'SCH'ThenBeginSchDocument := Client.OpenDocument('Sch', Doc.DM_FullPath);If SchDocument <> Nil ThenBeginClient.ShowDocument(SchDocument);CurrentSch := SchServer.GetCurrentSchDocument;If CurrentSch = Nil Then Exit;DeleteUserDefinedParametersOfComponents(CurrentSch);End;End;End;End; {..............................................................................}{..............................................................................} Procedure ModifyComponentUserParameters;VarI : Integer;Doc : IDocument;CurrentSch : ISch_Document;SchDocument : IServerDocument;Project : IProject;BeginProject := GetWorkspace.DM_FocusedProject;If Project = Nil Then Exit;Project.DM_Compile;// selected or all documents within the projectFor I := 0 to Project.DM_LogicalDocumentCount - 1 DoBeginDoc := Project.DM_LogicalDocuments(I);If Doc.DM_DocumentKind = 'SCH'ThenBeginSchDocument := Client.OpenDocument('Sch', Doc.DM_FullPath);If SchDocument <> Nil ThenBeginClient.ShowDocument(SchDocument);CurrentSch := SchServer.GetCurrentSchDocument;If CurrentSch = Nil Then Exit;ModifyUSerDefinedParametersOfComponents(CurrentSch, 'ModifiedText');End;End;End;End; {..............................................................................}{..............................................................................}(*Synopsis:1. This script has three main procedures and two string constants;AddComponentUserParametersModifyComponentUserParametersDeleteComponentUserParametersUserDefinedName = 'User-Defined';UserDefinedText = 'Text';This script uses Schematic API (for dealing with parameters of components) andWorkspace Manager API (for iterating schematics of a project)2. To use this script, load a project with a hierarchy of schematic documents thenopen a schematic from this project in PurPer Designer.3. Invoke the Run Script command from the DXP » Run Script menu.a/ Run the AddComponentUserParameters from the Select Item to Run dialog.This procedure goes through the logical documents of a focussed project.For each schematic document found, Parameters with a "User-Defined" Name and a "Text" Valueare added to all components on that document.b/ To delete these Parameters with a "User-Defined" Names, invoke the DeleteComponentUserParameters.c/ To modify these Parameters with a "User-Defined" Names, invoke the ModifyComponentUserParameters.This procedure checks for components with the "User-Defined" Names and updates the Value to 'ModifiedText' Limitations of this script:第11页 共12页1. This script does not check for existing parameters with Names of "User-Defined" so duplicates will be generatedif you run the AddComponentUserParameters repeatedly.You are free to modify this script but use this script at your risk. Please back up your designs first before using this script. *)第12页 共12页。
Altium_Designer 详细使用教程
Altium Designer详细使用教程目录第1章Altium Designer 6 简介 (1)1.1 Altium Designer 6 软件简介和安装 (1)1.1.1 系统需求 (1)1.1.2 系统安装 (2)1.1.3 软件激活 (3)1.2 Altium Designer 6的窗口界面 (5)1.2.1 Altium Designer 6软件界面简介 (5)1.2.2 Altium Designer 6的文件类型和服务组件 (7)1.3 Altium Designer 6的系统设置 (10)1.4 Altium Designer 6的界面自定义 (20)第2章原理图设计 (23)2.1 原理图设计基础 (23)2.1.1 原理图设计的一般步骤 (23)2.1.2 Altium Designer 6 原理图设计工具栏 (24)2.1.3 图样的放大与缩小 (25)2.2 原理图的图纸设置 (26)2.2.1 设置图样大小 (27)2.2.2 Parameters标签页(图纸属性设置) (30)2.3 元件库的加载 (31)2.3.1 元器件库管理器 (31)2.3.2 元件库的加载 (32)2.3.3元件查找 (33)2.4 放置、调整和编辑元件 (34)2.4.1放置元器件 (34)2.4.2 调整元件位置 (37)2.4.3编辑元件属性 (41)2.5 连接线路 (44)2.5.1连接导线 (44)2.5.2 放置线路节点 (45)2.5.3 放置网络标号 (46)2.6 其他对象的编辑及属性编辑 (47)2.6.1放置总线 (47)2.6.2 放置圆弧 (47)2.6.3放置注释文字 (48)2.6.4放置文本框 (49)2.7 层次原理图的设计 (50)2.7.1层次原理图概述 (51)2.8 创建网络表 (56)2.8.1设置网络表选项 (56)2.8.2 创建网络表 (57)2.8.3 网络表格式 (57)2.9 原理图设计进阶 (58)2.9.2 对象属性整体编辑 (60)2.9.3 原理图编译与电气规则检查 (62)2.9.4 报表生成及输出 (64)2.9.5原理图输出 (65)2.10 原理图绘制实例 (66)第3章创建原理图元器件 (76)3.1 原理图元件概述 (76)3.1.1 元件概述 (76)3.1.2 原理图元件制作过程 (77)3.2 原理图元器件编辑器 (78)3.2.1 启动原理图元件库编辑器 (78)3.2.2 绘图工具 (78)3.2.3 IEEE工具栏 (79)3.2.4 元件库编辑管理器 (79)3.3 创建分立元器件 (81)3.3.1 对原有元器件编辑修改 (81)3.3.2 绘制新元件 (84)3.4 多单元元器件制作 (87)3.4.1 制作第一个单元电路 (87)3.4.2 制作第二个单元电路 (88)3.4.3 制作其它单元电路 (89)3.4.4 放置正、负电源引脚 (89)小结 (90)习题 (90)第4章印制电路板设计 (92)4.1 PCB设计基础 (92)4.1.1 印制板分类 (92)4.1.2 印制电路板结构组成 (93)4.1.3元件封装概述 (94)4.2 PCB设计流程以及基本原则 (96)4.2.1 PCB设计流程 (96)4.2.2 PCB设计的基本原则 (97)4.3 创建和规划PCB (98)4.3.1电路板规划 (98)4.3.2 PCB工作层管理 (102)4.3.3. 印制电路板选项设置 (103)4.4 元件封装库的操作 (104)4.4.1 加载元器件封装库 (104)4.4.3 搜索元件封装 (105)4.4.4 放置元件封装 (106)4.4.5修改封装属性 (107)4.5 手工布线设计单面印制电路板 (108)4.5.1设计前的准备工作 (108)4.5.3 元件布局 (110)4.5.4 添加网络连接 (111)4.5.5 手工布线 (112)4.6 自动设计PCB双面板 (115)4.6.1 设计前准备工作 (115)4.6.2 画禁止布线区 (116)4.6.3 载入网络和元件封装 (116)4.6.4 设计规则(Design Rule) (117)4.6.5 元件布局 (125)4.6.6 添加电源网络连接 (127)4.6.7 自动布线 (128)4.7 印制电路板设计进阶 (130)4.7.1 制作PCB的后期处理 (130)4.7.2 原理图与PCB之间交叉追逐与相互更新 (137)4.7.3 PCB的3D展示 (139)4.7.4设计规则检查以及工程报表输出 (140)小结 (145)习题 (145)第5章创建元器件封装和集成库 (147)5.1 创建新的元件封装库 (147)5.1.1 元件封装制作过程 (147)5.1.2元件封装库编辑器 (147)5.2 手工制作元器件封装 (149)5.2.1 新建元件封装库文件 (149)5.2.2.元件封装库编辑环境设置 (150)5.2.3.放置焊盘 (150)5.3 利用向导工具制作元件封装 (152)5.4 集成库的生成与维护 (155)5.4.1 集成库的生成 (155)5.4.2 集成库的维护 (158)小节 (159)习题 (159)第6章电路仿真 (161)6.1 仿真的意义 (161)6.2 仿真的设置 (161)6.2.1 Altium Designer 6的仿真元件库 (161)6.2.2 初始状态的设置 (167)6.2.3 仿真器的设置 (168)6.2.4进行电路仿真的一般步骤 (177)6.3 电路仿真实例 (180)6.3.1 模拟电路仿真实例 (180)6.3.2数字电路仿真实例 (182)小结 (185)习题 (185)第1章Altium Designer 6 简介本章将介绍Altium Designer 6的基础知识,包括Altium Designer 6的安装步骤、Altium Designer 6的系列界面及环境的设置方法。
Altium教程Common 1A软件设计1A
Common 1A软件设计第一部分 原理图1.1Neb_audio_out.SchDoc1.2WB_Read_Master.Vhd-------------------------------------------------------------------------------- -- SubModule WB_READ_MASTER-- Created 22/11/2004 3:36:38 PM-------------------------------------------------------------------------------- library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_unsigned.all;use IEEE.std_logic_arith.all;entity WB_READ_MASTER is port(CLK_I : in std_logic;RST_I : in std_logic;RD_I : in std_logic;ADR_I : in std_logic_vector(31 downto 0);WB_ACK_I : in std_logic;WB_DAT_I : in std_logic_vector(31 downto 0);WB_STB_O : out std_logic;WB_CYC_O : out std_logic;WB_ADR_O : out std_logic_vector(20 downto 0); -- was 31 downto 0 WB_DAT_O : out std_logic_vector(31 downto 0);WB_SEL_O : out std_logic_vector(3 downto 0);WB_WE_O : out std_logic;WB_CLK_O : out std_logic;WB_RST_O : out std_logic;BUSY : out std_logic;DAT32_O : out std_logic_vector(31 downto 0);DAT8_O : out std_logic_vector(7 downto 0));end WB_READ_MASTER;----------------------------------------------------------------------------------------------------------------------------------------------------------------architecture structure of WB_READ_MASTER isconstant TIMEOUT_ACK : integer := 255; -- maximum number of clock cycles-- spent waiting for ACKtype SEQ_STATE_TYPE is (STOP, ARM, START, WAIT_ACK);signal SEQ_STATE: SEQ_STATE_TYPE;signal AckTimeOut : std_logic_vector(7 downto 0);begin-- static connectionsWB_ADR_O <= ADR_I(20 downto 0) AND"111111111111111111100" ; -- X"FFFFFFFC";WB_RST_O <= RST_I;WB_CLK_O <= CLK_I;WB_WE_O <= '0'; -- 'WE' is always inactive since we never write WB_DAT_O <= (others => '0'); -- we never write, so write data is irrelevant WB_SEL_O <= (others => '1'); -- read full 32 bits-- indicates read is in progressBUSY <= '0' when (SEQ_STATE = ARM) OR (SEQ_STATE = STOP) else '1';-- for debugging onlyprocess (SEQ_STATE) isbegincase SEQ_STATE iswhen STOP =>DAT32_O <= X"00000001";when ARM =>DAT32_O <= X"00000002";when START =>DAT32_O <= X"00000003";when WAIT_ACK =>DAT32_O <= X"00000004";when others =>DAT32_O <= X"00000005";end case;end process;-- read state machine-- waits for rising edge on RD_ISEQUENCER_FSM: process (Clk_I, RD_I, RST_I) is beginif(RST_I = '1') thenSEQ_STATE <= STOP;elseif(rising_edge(CLK_I)) thencase SEQ_STATE iswhen STOP =>WB_CYC_O <= '0';WB_STB_O <= '0';if(RD_I = '0') thenSEQ_STATE <= ARM;when ARM =>WB_CYC_O <= '0';WB_STB_O <= '0';if(RD_I = '1') thenSEQ_STATE <= START;end if;when START =>WB_CYC_O <= '1';WB_STB_O <= '1';AckTimeOut <= X"00";SEQ_STATE <= WAIT_ACK;when WAIT_ACK =>AckTimeOut <= AckTimeOut + X"01";if (WB_ACK_I = '1') thencase ADR_I(1 downto 0) iswhen"11" =>DAT8_O <= WB_DAT_I(7 downto 0);when"10" =>DAT8_O <= WB_DAT_I(15 downto 8);when"01" =>DAT8_O <= WB_DAT_I(23 downto 16);when"00" =>DAT8_O <= WB_DAT_I(31 downto 24);when others => NULL;end case;WB_CYC_O <= '0';WB_STB_O <= '0';SEQ_STATE <= STOP;elsif (AckTimeOut >= TIMEOUT_ACK) then SEQ_STATE <= STOP;when others =>SEQ_STATE <= STOP;end case;end if;end if;end process SEQUENCER_FSM;end structure;--------------------------------------------------------------------------------1.3hardware.h//.............................................................................. // Automatically generated header file.// Generated: 2:12:25 PM 20/01/2005// This file should not be edited.//..............................................................................#ifndef __HARDWARE_H__#define __HARDWARE_H__//.............................................................................. #define Base_RAM 0x01000000#define Size_RAM 0x00200000//..............................................................................//.............................................................................. #define Base_Audio 0xFF000000#define Size_Audio 0x00000040//..............................................................................//.............................................................................. #define Base_Serial 0xFF000100#define Size_Serial 0x00000040//..............................................................................//.............................................................................. #define Base_xrom 0x00000000#define Size_xrom 0x00010000//.............................................................................. //..............................................................................#define Base_xram 0x01008000#define Size_xram 0x00080000//..............................................................................//.............................................................................. #define Base_xcode 0x01000000#define Size_xcode 0x00008000//.............................................................................. #endif // __HARDWARE_H__。
Altium Designer 14原理图与PCB设计教程 第一章 Altium Designer使用基础
Choose Document to Open对话框
13
第1章 Altium Designer使用基础
1.2 Altium Designer文档管理
2.项目的建立、打开与关闭 (2)工程打开与关闭
要关闭一个已经打开的工程,需要在Projects标签中 用鼠标右键单击工程名。在弹出的菜单中选择Close Project命令即可关闭工程。或在Projects标签中鼠标 左键单击【Project】按钮,在弹出的菜单中选择 Close Project命令也可关闭工程,如图所示。
在弹出的菜单中选择Close Project
14
第1章 Altium Designer使用基础
1.2 Altium Designer文档管理
3.项目中的文件管理 (1)新建文件
在工程中,执行菜单命令File → New,在弹出的菜单 中可以选择需要新建的文件
Altium Designer简介
4
认识Altium Designer面板
面板显示工程中所有原理图元件之间 的连接网络和元件列表
打开一个工程文件中的原理图文件
1.1 Altium Designer简介
5
打开原理图后的Navigator面板
激活Favorites面板
认识Altium Designer面板
Choose Document to Open对话框
17
第1章 Altium Designer使用基础
1.2 Altium Designer文档管理
3.项目中的文件管理 (4)关闭文件
执行菜单命令File → Close即可关闭当前文件。或在 已打开的文件标签上单击鼠标右键,在调出的菜单 中选择Close文件名称即可关闭当前的文件,如图所 示,关闭名为Sheet1的原理图文件。
好用的altium designer 操作指南
好用的Altium Designer 操作指南一、简介Altium Designer 是一款功能强大的电子设计自动化软件,可以帮助工程师进行PCB(Printed Circuit Board,印刷电路板)设计和开发。
它具有丰富的功能和工具,能够满足复杂电路设计的需求。
本文将从基础操作到高级功能,为大家详细介绍如何使用Altium Designer 这一强大的工具。
二、基础操作1. 安装和启动我们需要下载并安装Altium Designer 软件。
安装完成后,双击图标启动软件。
在启动界面,选择新建项目或打开现有项目,开始进行设计工作。
2. 创建新项目在新建项目时,需要设置项目名称、存储路径、项目类型等信息。
可以选择根据现有模板创建或者从头开始设计。
在创建完成后,可以添加原理图、PCB 文档等。
3. 绘制原理图在绘制原理图时,可以使用Altium Designer 提供的丰富符号库,进行组件的选取和连线的绘制。
通过快捷键和鼠标操作,可以高效完成整个原理图的设计工作。
4. PCB 设计将设计好的原理图转换为PCB,进行布线和连接。
Altium Designer提供了强大的三维设计模块,可以帮助工程师更直观地进行布局和布线的设计。
5. 元件库管理Altium Designer 提供了完善的元件库管理功能,可以根据需要添加、编辑和管理元件库,方便工程师在设计中的元件选取和使用。
6. 输出制造文件设计完成后,可以通过Altium Designer 生成Gerber 文件、钻孔文件等制造文件,用于PCB 制造和组装。
三、高级功能1. 仿真和分析Altium Designer 提供了强大的仿真和分析功能,可以对电路进行性能和稳定性分析,帮助工程师进行优化设计。
2. 版本控制设计过程中可能会有多个版本的修改和更新,Altium Designer 提供了版本控制功能,可以帮助工程师进行版本的管理和比较,保证设计的完整性和一致性。
AltiumDesigner使用指南(精品)
Altium Designer快捷键2010-11-28 23:48:28PCB设计基础方格与格点的切换:View-Grids-Toggle Visible Grid Kind源点:Edit-Origin-Set边界的定义:Keep Out Layer-Utility Tools-Place Line 按TAB可定义线宽选取元件:PCB-PCB Filter-IS Component逐个放置元件:TOOLS-Component Placement-Reposition Selected Components自动布局:ToolS-Component Placement--Arrange Within Room自动布局器:ToolS-Component Placement--Auto Placer元件排列(居中居左居右等):选中元件右键Align-或Alignment Tools--元件在层之间的快速切换:拖动元件的过程按L键让焊盘放在格点上:选中元件,右键-Component Actions-Move Component Origin To Grid 移动元件的远近:"G"键选择mil刷新屏幕:键盘"END"改走线模式(5种):shift+空格键“45°线性” “45°+圆角” “90°”“ 任意角”“90°+圆弧”“圆弧”遇障碍物:右键-Options-Preferences-..."Shift+R"3种模式:推挤等布线快捷菜单“~ ”键线宽设置:“Shift+W”12.PCB设计提高b交互式布线:13.PCB设计深入a板的(螺丝)固定孔,铜柱内孔3.3mm,外孔5.0mm,Layer:Multi-layer;孔发绿修改规则:Design-Rules-HoleSize;板边5mm圆弧:Place-KeepOut-ArcCtrl+Q 切换英美单位制度;保护元器件位置:锁定双击-Lock打钩保护已锁定物体:Tools-Preference-PCB Editer-General-Protect Locked Objects 打钩;双层板过孔放置...;键盘左上角快捷键波浪号“~ ”显示布线快捷菜单;"+""-"可切换层;字体(条形码)放置:"A"-Place String;对板的定义:Designers-Board Shape-R/D;尺度标注:Place Dimension-Place Linear Dimension13.PCB设计深入b工具栏恢复原始状态:在工具栏处右键Customizing PCB Editor-Toolbar-Restore;圆形板尺度标注;填充Place Fill;复制粘贴:选中-Edit-Rubber Stamp-单击粘贴特殊形状:选中-Edit-Paste Special(圆形或阵列粘贴)第一次确定圆心,第二次确定半径;选择一组Select:“S键”-Touching Liner线/Rectangle矩形或Shift 一个个选移动Move:"M"整体移动:选中-右键-Unions-Create Union from selected object/break解脱从联合体弱小信号线包地:选中-“s”select net,Tool-Outline -Selected Objects查找相似物体:右键-Find Similar ObjectPCB测距离:Report-Measure Distance自动布线:Auto Route:Net/Net Class/Connection/Area/Room重要的一点是要先设定好布线规则。
altium设计界面操作技巧
Altium 设计界面操作技巧Altium 是一款常用的电路设计软件,其界面操作技巧对于电路设计人员来说非常重要。
本文将介绍一些常用的 Altium 设计界面操作技巧,帮助用户提高工作效率。
下面是本店铺为大家精心编写的5篇《Altium 设计界面操作技巧》,供大家借鉴与参考,希望对大家有所帮助。
《Altium 设计界面操作技巧》篇11. 界面定制Altium 的设计界面可以进行定制,根据个人喜好和需要进行设置。
可以自定义工具栏、菜单、面板、工作区等,提高工作效率。
例如,可以将经常使用的工具栏放在显眼的位置,或将不常用的工具栏隐藏起来,以减少界面的混乱和干扰。
2. 工作区布局Altium 的工作区可以进行布局,根据设计需要进行设置。
可以将不同类型的元件、导线、文本等放在不同的工作区中,以便于设计和查看。
同时,还可以将工作区进行命名,以便于管理和查找。
3. 视图控制Altium 提供了多种视图控制方式,可以使用户更加方便地查看和编辑设计。
可以放大、缩小、平移、旋转视图,以及切换不同的视图模式,如正面、反面、三维等。
还可以使用快捷键来控制视图,例如按下“Z”键可以放大视图,“X”键可以缩小视图等。
4. 选择元件在选择元件时,可以使用 Altium 提供的多种选择方式。
可以使用鼠标单击、拖动、Shift+单击等方式选择多个元件,也可以使用快捷键来选择元件,例如按下“A”键可以选择所有元件。
5. 剪贴板操作Altium 支持剪贴板操作,可以将设计内容复制到剪贴板中,再粘贴到其他位置。
可以使用快捷键“Ctrl+X”将选中内容复制到剪贴板中,“Ctrl+V”将剪贴板中的内容粘贴到选中位置。
6. 撤销/恢复操作在设计过程中,如果不小心进行了错误的操作,可以使用 Altium 的撤销/恢复操作来纠正错误。
按下“Ctrl+Z”可以撤销上一步操作,“Ctrl+Y”可以恢复上一步操作。
7. 查看设计信息Altium 提供了多种方式来查看设计信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PortSwitcher 1软件设计第一部分 原理图1.1 PortSwitcherFPGA1C_Evalboard.SchDocEs tablis h a connection us ing Windows HyperTerminalA connnection file(PortSwitcherFPGA1C_Evalboard.ht) can be found in the main directory of this example - right clicking on a SchDoc of the project from within the Project Panels and s electing the Explore command will open this directory.Port s etting- 57600 Bits per s ec - 8 Data Bits - No Parity - 1 Stop Bit- No Hardware Flow ControlASCII s etting- Echo typed characters locally- Append line feeds to incoming line endsPortSwitcher Commands - h or ? print helpus ControllerUs DAA12Y171.2portswitcher1c.c// Simple port switching controller// Control is via an RS-232 port using the TKS51A embedded serial port// A very light weight comms suite and command interpreter is implemented. // Literal strings are used in-line - usually not an efficient practice.//#define NULL 0#define FALSE 0#define TRUE 1// Buffer lengths are short to prevent the need for external RAM// Only idata is used.#define TX_BUFFER_LENGTH 16#define RX_BUFFER_LENGTH 16#define RX_CMD_TERMINATOR 0x0D // <CR>#define RX_CMD_BACKSPACE 0x08 // <CR>#define NUMBER_OF_PORTS 4#define CLK_FREQ 3U*11059200UL // about 33.178 MHz#define BAUD_RATE 57600UL// Save ram space by keeping all strings in ROM if// possible#pragma romstring// Globals - resource limited processor and simple// demonstration program. Globals are being used.// version string__rom char sVersion[] = "PrtSw Ver 1.3 ";__rom char sDate[] = __DATE__" "; // Date with appended space __rom char sTime[] = __TIME__;// RS-232 receive buffers// These buffers are quite restricted in length and so// overflow will have to be managed (it has to be managed// regardless of length, but in this instance we will// no doubt have plenty of instances of overflow).// In the first instance overflow shall be managed by// discarding characters up until the next command// terminator (v. simple).// Two buffers are provided to allow for ping-ponging// between them as one is being dealt with at the the// higher level and one is receiving characters from// the receive ISR.char rxBuffer1[RX_BUFFER_LENGTH];char rxBuffer2[RX_BUFFER_LENGTH];unsigned char rxBuffer1Length = 0;unsigned char rxBuffer2Length = 0;__bit rxBuffer1Ready = FALSE;__bit rxBuffer2Ready = FALSE;// RS-232 transmit buffers// Very limited in length to conserve// RAM space. Note that ROM-based// messages can be longer.char txBuffer[TX_BUFFER_LENGTH];unsigned char txBufferLength = 0;// ISR variablesconst char *isrTXBuf;__rom char *isrTXBufROM;// Code space is more available than RAM// so I use a separate pointer to dump// ROM-based messages. Rather than copying// the ROM messages into a RAM buffer.unsigned char isrTXLength;unsigned char isrTXIndex;__bit isrTXFromRom; // TRUE if transmitting a ROM-based messagechar *isrRXBuf;unsigned char isrRXLength;__bit isrUsingRXBuffer1;// ROM-based messaged - see also Version variables at the top__rom const char txBufferPrompt[] = "cmd>";#define PROMPT_LENGTH sizeof(txBufferPrompt)/sizeof(char)-1__rom const char txBufferCR = 0x0d;// Shadow registers// Some of the I/O ports require shadow registers for correct operation // as not all the pins are the same direction and the port out and// in busses are not hardwired together.// This demonstrates a possible difference between an embedded 8051// and a traditional chip.unsigned char P1_ShadowReg;// Forward declarations of function prototypesvoid ClearBuffer(char *cmdBuffer);_Bool DoCommand(const char *cmdBuffer); // Simple command interpreter void PrintHelp(void); // Print simple helpvoid PrintPrompt(void); // Print a small promptvoid PrintVersion(void);_Bool Transmit(const char *msg, const unsigned char length);_Bool TransmitRomMsg(__rom char * msg, unsigned char length);_Bool TransmitCR(void);_Bool TransmitPrompt(void);void Init(void);void SetupSerialPort(void);_Bool Connect(unsigned char destPort, unsigned char srcPort);_Bool SetPortState(unsigned char port, _Bool enable);_Bool GetPortState(unsigned char port);_Bool QueryPort(unsigned char port);_Bool DumpPort(unsigned char port);signed char QueryConnection(unsigned char port);unsigned char ConvertPortToIndex(unsigned char port);void delay(void){int i;for(i=0; i<0x1fff; i++){}}void main(void){Init();SetupSerialPort();TransmitCR();PrintVersion();TransmitCR();TransmitPrompt();ClearBuffer(rxBuffer1);ClearBuffer(rxBuffer2);while(1){// Simple Task Manager// Loop forever and check status of// signals from low level software.// Trigger high level tasks as required.if(rxBuffer1Ready){DoCommand(rxBuffer1);ClearBuffer(rxBuffer1);rxBuffer1Ready = FALSE; // allow ISR to use this buffer if it wishes }if(rxBuffer2Ready){DoCommand(rxBuffer2);ClearBuffer(rxBuffer2);rxBuffer2Ready = FALSE; // allow ISR to use this buffer if it wishes }}}void ClearBuffer(char *cmdBuffer){for(int i=0; i < RX_BUFFER_LENGTH; i++){cmdBuffer[i] = 0x00;}}// DoCommand is the (simple) command interpreter.// Command decoding and execution.// Assumes fixed format commands - each command handler// does its own parameter checking (though there is very// limited error handling)._Bool DoCommand(const char *cmdBuffer){_Bool bRetVal = FALSE;unsigned char i;unsigned char ch1, ch2;if(cmdBuffer != NULL){TransmitCR();switch(cmdBuffer[0]){case'?':case'H':// Dump helpPrintHelp();bRetVal = TRUE;break;case'v':case'V':// Dump versionPrintVersion();bRetVal = TRUE;break;case'e':case'E':// port enable/disable command// we expect an integer (port)// followed by another integer (1 or 0)// Subtract '1' from port to get zero based port.// Subtract '0' from integer to get 0 for '0' and 1 for '1'.// No error checking for nowch1 = ConvertPortToIndex(cmdBuffer[2]);if( ch1 == 0xff){// Parameter errorTransmitRomMsg("Invalid port", 12);}else{if( SetPortState( ch1, (cmdBuffer[4])-'0'))TransmitRomMsg("OK", 2);}else{TransmitRomMsg("Fail", 4);}}bRetVal = TRUE;break;case'm':case'M':// port mapping command// we expect an integer// followed by another integer// No error checking for now// See if we have alpha or numeric port references// Also deal with upper and lower casech1 = ConvertPortToIndex(cmdBuffer[2]);ch2 = ConvertPortToIndex(cmdBuffer[4]);if( ch1 == 0xff){// Parameter errorTransmitRomMsg("Invalid destination port", 24); }if( ch2 == 0xff){if( ch1 == 0xff){// add in <CR> if we have already printed an error messageTransmitCR();}// Parameter errorTransmitRomMsg("Invalid source port", 19);}if((ch1 != 0xff) && (ch2 != 0xff)){if( Connect(ch1, ch2)){TransmitRomMsg("OK", 2);}else{TransmitRomMsg("Fail", 4);}}bRetVal = TRUE;break;case'q':case'Q':// Query port mapping and enable state// We expect an integer giving the port to querych1 = ConvertPortToIndex(cmdBuffer[2]);if( ch1 == 0xff){// Parameter errorTransmitRomMsg("Invalid port", 12);}else if( !DumpPort(ch1)){TransmitRomMsg("Fail", 4);}bRetVal = TRUE;break;case'd':case'D':// Query port mapping and enable state for all portsfor(i=0; i<NUMBER_OF_PORTS; i++){if( !DumpPort(i)){TransmitRomMsg("Fail", 4);}TransmitCR();}bRetVal = TRUE;break;default:TransmitRomMsg("Huh?", 4);break;}TransmitCR();TransmitPrompt();}return bRetVal;}unsigned char ConvertPortToIndex(unsigned char port) {unsigned char index = port;if( (port >= '1') && (port <= '4')){index -= '1';}else if( (port >= 'a') && (port <= 'd')){index -= 'a';}else if( (port >= 'A') && (port <= 'D')){index -= 'A';}else{index = 0xff; // signal error}return index;}void PrintVersion(void){// Dump the version number and date and time.// will have to wait around for the dump to occur // as our buffers are too small to take the// full dump in one go.//// This code is not all that robust. If there is a// problem transmitting one part of the// message the rest will still be attempted - this// is probably not what is required.// Also, the wait for the TX system is infinite.// This should be a timed wait with error// recovery.TransmitRomMsg(sVersion, sizeof(sVersion)/sizeof(char)-1);TransmitRomMsg(sDate, sizeof(sDate)/sizeof(char)-1);TransmitRomMsg(sTime, sizeof(sTime)/sizeof(char)-1);}void PrintHelp(void){// Dump the help//// This code is not all that robust. If there is a// problem transmitting one part of the// message the rest will still be attempted - this// is probably not what is required.// Also, the wait for the TX system is infinite.// This should be a timed wait with error// recovery.TransmitRomMsg("v - print version", 25); TransmitCR();TransmitRomMsg("? or h - print help", 22); TransmitCR();TransmitRomMsg("e prt 1|0 - enable/disable prt (1=enable)", 41); TransmitCR();TransmitRomMsg("m dst src - drive dst outputs from src inputs", 45); TransmitCR();TransmitRomMsg("q prt - query prt connection and state" , 42); TransmitCR();TransmitRomMsg("d - dump all port connections and states", 48); TransmitCR(); }_Bool TransmitCR(void){return TransmitRomMsg(&txBufferCR, 1);}_Bool TransmitPrompt(void){return TransmitRomMsg(txBufferPrompt, PROMPT_LENGTH);}_Bool Transmit(const char * msg, unsigned char length){// This is a blocking function - it will// wait indefinitely until the serial port// is free. Not ideal but simple for now._Bool bRetVal = TRUE;// The following access of the isrTXLength variable// is atomic (byte variable) so we do not need to// disable interrupts.while(isrTXLength != 0){// Wait until the port is free.// We could put a timeout in here and return FALSE if// the TX fails.}isrTXBuf = msg; // not sure this will work on a ROM string?isrTXLength = length;isrTXIndex = 1; // we will send the 0'th character belowisrTXFromRom = FALSE;SBUF = msg[0]; // start the transmissionreturn bRetVal;}_Bool TransmitRomMsg(__rom char * msg, unsigned char length){// This is a blocking function - it will// wait indefinitely until the serial port// is free. Not ideal but simple for now._Bool bRetVal = TRUE;// The following access of the isrTXLength variable// is atomic (byte variable) so we do not need to// disable interrupts.while(isrTXLength != 0){// Wait until the port is free.// We could put a timeout in here and return FALSE if// the TX fails.}isrTXBufROM = msg; // not sure this will work on a ROM string?isrTXLength = length;isrTXIndex = 1; // we will send the 0'th character belowisrTXFromRom = TRUE;SBUF = msg[0]; // start the transmissionreturn bRetVal;}void Init(void){// Initialise ports for loopback and disabledunsigned char i;for(i=0; i<NUMBER_OF_PORTS; i++){SetPortState(i, FALSE);Connect(i, i);}}void SetupSerialPort(void){isrTXBuf = NULL;isrTXLength = 0;isrRXBuf = rxBuffer1;isrRXLength = 0;isrUsingRXBuffer1 = TRUE;SM0 = 0;SM1 = 1; // Mode 1 - 8-bit UARTSM2 = 0; // Disable multiprocessor featureTB8 = 0; // 9th bit (not used)RB8 = 0; // This is the rx stop bit.TI = 0; // Clr TX intRI = 0; // Clr RX int//Need to set up timer 1 for baud rate CLK_FREQ_MHZTR1 = 0; // stop timer 1PCON_bit(7) = 1; // SMOD = 1 -> high speed baud rate// baud rate divisorTL1 = 0; // initialise to zeroTH1 = 256U - (2 * CLK_FREQ/(12U*32U*BAUD_RATE));TMOD_bit(7) = 0; // disable GATETMOD_bit(6) = 0; // operate as timerTMOD_bit(5) = 1;TMOD_bit(4) = 0; // 8-bit timer auto-reload modeIT0 = 0;IE0 = 0;IT1 = 0;IE1 = 0;TR0 = 0; // timer 0 stoppedTF0 = 0;TR1 = 1; // timer 1 runningTF1 = 0;ES = 1;IE_bit(7) = 1;REN = 1; // enable reception}// Connect - the destination port outputs are driven from the// the inputs of the source port.// __putbit and __getbit could be used in this function.// Returns TRUE if both ports are within range, FALSE// otherwise (and no mapping change is done in this case)._Bool Connect(unsigned char destPort, unsigned char srcPort){_Bool bRetVal;// Are ports within range?if(destPort >= NUMBER_OF_PORTS || srcPort >= NUMBER_OF_PORTS){bRetVal = FALSE;}else{// first set save the current state of the dest port_Bool bSave = GetPortState(destPort);P0 &= ~(0x03 << (2*destPort)); // Clear the existing mapping for this port// This little hack only works when// NUMBER_OF_PORTS == 4!// Generally a more elaborate mechanism would// be required that cleared all the bits of// the port that control this destination port.P0 |= (srcPort << (2*destPort));SetPortState(destPort, bSave); // Restore port statebRetVal = TRUE;}return bRetVal;}// SetPortState - returns FALSE (0) if port is out of range.// returns TRUE (1) if port is within range// This function will only work correctly when// NUMBER_OF_PORTS is 8 or less._Bool SetPortState(unsigned char port, _Bool enable){_Bool bRetVal;// Do some parameter checkingif(port >= NUMBER_OF_PORTS){bRetVal = FALSE;}else{if(enable){P1_ShadowReg |= (1 << port); // OR in the correct port}else{P1_ShadowReg &= ~(1 << port); // AND out the correct port}P1 = P1_ShadowReg;bRetVal = TRUE;}return bRetVal;}// GetPortState - return FALSE (0) if port enable bit is not set or // if port is out of range (TRUE otherwise)._Bool GetPortState(unsigned char port){if(port >= NUMBER_OF_PORTS){return FALSE; // Warning - unstructured error return. }return (P1_ShadowReg & (1 << port));}_Bool DumpPort(unsigned char port){_Bool bRetVal = FALSE;signed char tmp;if(port < NUMBER_OF_PORTS){tmp = port + 'A';Transmit((const char *)&tmp, 1);TransmitRomMsg(" <- ", 4);// Extract the mappingtmp = QueryConnection(port);if(tmp >= 0 && tmp < NUMBER_OF_PORTS){tmp += 'A';Transmit((const char *)&tmp, 1);}else{// If we received an error display a question markTransmitRomMsg("?", 1);}if(GetPortState(port)){TransmitRomMsg(" enabled", 8);}else{TransmitRomMsg(" disabled", 9);}bRetVal = TRUE;}return bRetVal;}signed char QueryConnection(unsigned char port){signed char retVal = -1;if(port < NUMBER_OF_PORTS){// Extract the mappingretVal = P0;retVal >>= (2*port);retVal &= 0x03; // Only works for NUMBER_OF_PORTS = 4! }return retVal;}__interrupt(0x23) void SerialISR( void )char tempChar; // temporary variable to reduce the// amount of array dereferencing.// Is there a TX interrupt?if(TI){TI = 0; // clear int source as soon as possible to// minimise chances of missing an interrupt// send the next character (if any) out to the portif(isrTXIndex < isrTXLength){// Another char to send - determine what sort of pointer we should// use. When we are sending a ROM-based message use a// __rom char *. This saves having to copy the message into RAM.// RAM is very limited in this application - only idata.if(isrTXFromRom){// We are sending a ROM message so use the ROM pointerSBUF = isrTXBufROM[isrTXIndex++];}else{SBUF = isrTXBuf[isrTXIndex++];}}else{// signal that we have finished transmittingisrTXLength = 0;}} // end of if(TI) - transmit character handling// Is there an RX interrupt?if(RI){RI = 0; // clear int source as soon as possible to// minimise chances of missing an RX interrupttempChar = SBUF;// save this character away - if there is spaceif(isrRXLength < RX_BUFFER_LENGTH-1){// OK save itisrRXBuf[isrRXLength++] = tempChar;}else{// Lets signal something// I know! We can put the count of received chars onto// Port 2. But we will do this outside the test so it// is a useful count at all times.}// Deal with back spaces - watch for underflow of the// buffer.if(tempChar == RX_CMD_BACKSPACE){if(isrRXLength > 1){isrRXLength -= 2; // take off two to account for the just-added// backspace character}else{isrRXLength = 0; // only really useful for a signed variable}// Could print a space and then do the backspace again// but I don't want to have to deal with potential recursion in// calling the TX routines, or to possibly stuff up some outgoing// transmission by forceably inserting a character into the transmit// buffer.}// Debug ouput - Upper four bits of port 2 contain lower four bits of// tempChar and lower four bits of port 2 contains lower four bits of// isrRXLengthP2 = ((tempChar << 4) & 0xf0)|(0x0f & isrRXLength);//P2 = isrRXLength; // signal the number of received characters onto port 2// If the character was a command terminator then we need to// pass it up to the high level.if(tempChar == RX_CMD_TERMINATOR){// new command bufferif(isrUsingRXBuffer1){rxBuffer1Length = isrRXLength;// set up for further reception in the other RX bufferisrRXBuf = rxBuffer2;isrUsingRXBuffer1 = FALSE;rxBuffer1Ready = TRUE; // signal high level code }else{rxBuffer2Length = isrRXLength;isrRXBuf = rxBuffer1;isrUsingRXBuffer1 = TRUE;rxBuffer2Ready = TRUE;}isrRXLength = 0;} // end of if(tempChar == RX_CMD_TERMINATOR )} // end of if(RI) - receive character handling}。