打印

Multsim MCU模块指南

[复制链接]
2776|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1 概览
本指南使用的文件随NI电路设计套件软件一起安装,位于...\samples\Getting Started中。
本指南采用Getting Started MCU.ms10,由于需要,该文件存取了LCDWorkspace文件夹中的内容。
LCD图形显示电路的例子,描述了基于Toshiba T6963C控制器和外部显示RAM的Multisim中,PIC微控制器对图形LCD显示元件的控制。为了控制LCD的显示,微控制器通过LCD数据线和控制线,将信号发送至LCD。为微控制器编写的软件程序决定了管脚电平的高低,以发送命令或数据到LCD显示。

2 关于指南
LCD U2的数据线连接到微控制器U1的RB0 – RB7管脚。LCD 的控制线连接到微控制器的RA0 – RA2管脚。MCU U1与LCD U2通过这些连线进行通信。数据并行发送到U2,控制线上的数据决定了时序和发送的数据类型(即地址或数据)。
LCD图形显示有三种操作模式:文本模式、图形模式和文本图形混合模式。该例子描述了文本图形混合模式下对LCD图形显示的控制。MCU运行的软件包含在MCU的工作空间中,在Design Toolbox中显示为LCDWorkspace。该工作空间中有一个名为project1的工程,这个工程只包含一个源代码文件main.asm。
?? 如何查看文件:
1. 在Design Toolbox中双击main.asm。在工作空间中会弹出一个名为main.asm的标签页,显示汇编程序。

?? 选择MCU/Show Line Numbers可以显示行号。
?? 仿真该电路:
1. 选择Simulate/Run。如果先前没有构建程序,将弹出一个对话框,提示结构体中不包含数据,询问是否需要建立一个程序。单击Yes。创建的结果显示在Spreadsheet View中的Result选项卡中。如果没有错误或警告,则程序创建成功。(范例程序应当没有错误)。
该程序在文本模式下显示字符串“Graphical LCD T6963C for Multisim”;然后LCD切换到图形模式,在文本的上方以点阵方式画出一个倒置的“V”。
字符串显示后,文本先向右滚动随后向左。这是通过移动LCD显示中的文本缓冲器的起始地址实现的。这同时表明了LCD中包含两个缓冲器,一个用于存储图形,另一个用于存储文本。这还显示了LCD的其他特性,例如文本闪烁、字符擦除等。周期地执行LCD显示程序,以显示所有这些效果。
?? 选择Simulate/Stop停止仿真。
.2.1 理解汇编程序
常量和数据
为了让程序便于理解,在程序的开始,采用常量对LCD显示命令和MCU中存储地址和数据的临时缓冲区进行预定义:

对某些微控制器,LCD上显示的文本存储在数据表中,但是没有PIC汇编指令允许你直接录址程序存储器中的数据,因此,可以将值装载到W寄存器,这样可以编写一个基于索引以返回字符串值的程序。RETLW指令装载一个常数到W寄存器,并在这条指令中执行RETURN。
TXPRT程序获取在LCD上显示的文本数据。LCD显示的字符代码在T6963C控制器的参考手册中有相关定义(例如:字母“G”的代码是0x27,“r”是0x52):

初始化
如下面程序段所示,初始化代码从START标签处开始。微控制器的管脚设为输出管脚,管脚状态都被复位。LCD显示元件由微控制器初始化,并设为图形文本混合模式。LCD的内部图形和文本缓冲器的起始地址分别设为0x0000和0x2941,这些地址决定了从什么地方开始显示缓冲区数据。最后,控制信号控制LCD显示信号的读写。

显示文本和图形
下面的程序通过MCU的控制线RA0到RA2向LCD发送图形显示指令,通过数据线向LCD发送图形显示数据。

例如:上面是摘自程序中主循环的一段程序,将TXPRT子程序中定义的字符串以文本模式发送到LCD进行显示。
下面的代码将LCD设为自动写模式:
MOVLW CMD_AWRON
MOVWF CMD_BUFFER
CALL CMD
从此处开始,程序开始计数,执行LOOP_READ_DATA2 循环35次。该循环调用TXPRT子程序重新获取文本数据并将其装载到W寄存器中,然后再调用子程序ADT。在ADT子程序中调用SEND_DATA,将W寄存器中的值写到端口B,等待发送到LCD的数据线上。一旦数据发送成功,微控制器端口A发送适当值至LCD的控制线,让其知道可以读数据了。所有子程序在调用完后,最终都返回至下一条指令。不断重复直至所有的35个字符都发送出去。上面程序段的最后三条指令,是在循环退出时关闭LCD的自动写模式。

下面的几条指令在图形显示模式下,画出水平线和斜线。

3 高级特性
本节逐步演示Multisim MCU模块的调试功能。重要的是,应完全按照本文顺序执行下列步骤,否则,说明将不再适用。当你理解了断点和单步执行的特性,你就可以探究高级MCU调试技巧。
4.3.1 调试视窗概览
不管是用C或者汇编来编写一个微控制器程序,都要将源代码文件(.asm, .inc, .c, .h)作为MCU工作区的一部分。反过来,这些文件都可以源代码窗口中进行编辑。
?? 进入源代码窗口:
1. 在Design Toolbox中的MCU工作空间中双击文件名(如:main.asm)。
仿真过程中,附加的调试信息可帮助理解MCU内部所发生的事件。例如,通过切换观察,你可以看到高级语言源代码的执行过程,也可以看到汇编指令代码中的事件。其中汇编指令代码还显示了正由MCU执行的指令的真实操作码。
源代码视窗无法显示所有信息。不过,电路设计中的每一个MCU元器件都有自己的Debug View,可以显示调试信息。
?? 进入调试窗口
1. 选择MCU/MCU PIC 16F84A U1/Build
注意:调试视窗只有在成功编译好代码后才可见,所以前述步骤仅须执行一次。

相关帖子

沙发
晓风残月|  楼主 | 2012-3-7 11:16 | 只看该作者
2. 选择MCU/MCU PIC 16F84A U1/Debug View
或者
在Design Toolbox的MCU工作空间中,在项目上右击相关菜单。

在原理图输入空间中打开另一个标签Degug(<MCU的参考标号>),本例中就是Debug(U1)。

采用Debug View顶部的顺序列表,选择由Multsim内部生成的反汇编指令,或选择由汇编器或者编译器生成的列表文件(列表文件的格式取决于编写代码的工具)。
在LCD图形显示的例子中,代码使用汇编语言编写并由汇编工具编译。微芯片汇编器生成一个列表文件(.lst),其中包含每一个汇编指令的所有操作码。调试列表窗口显示该列表文件的信息。Multisim采用内部的反汇编器将操作码反汇编成汇编指令。
本例中无须这种格式,因为调试列表包含了所有必需信息。当MCU工程仅装载了机器码(.hex)时,这时反汇编窗口将显示反汇编操作码指令,以便观察MCU中发生的事件。因为这种类型的MCU工程没有列表文件,所以反汇编窗口是非常有用的。
3.2 增加断点
无论仿真停止后或者正在仿真中,都可在源代码窗口中增加断点。有两种方法可增加断点:
一种是在源代码窗口中增加断点。本例中,原理图输入工作区中的main.asm是唯一可视的源代码窗口。
注意:如果MCU设计包含不止一个文件,则每一个源代码文件都有一个源代码窗口。
另一种方法是在Debug View窗口中设置断点。你可以在反汇编或调试列表窗中设置断点。但是本例中,仅使用调试列表视窗。

?? 在源代码视窗中增加断点:
1. 创建MCU工作空间。
2. 打开U1的Debug View。
3. 在Debug Toolbox中双击main.asm。
4. 滚动至START标签下的第一行语句:BCF STATUS, RP0
5. 双击main.asm窗口中BCF STATUS, RP0语句的左边第一列(灰色)。将在该位置出现一个红色圆点,表明在该行语句设置了一个断点。
6. 选择Simulate/Run。仿真在设置了断点的地方自动暂停。Simulate/View自动以黄色箭头指示MCU程序暂停的地方。
?? 删除断点:
1. 双击Debug View或main.asm源代码视窗中的的断点或选择MCU/Remove all breakpoints,删除所有断点。
注意:可以用与源代码视窗中一样的方法,在Debug View中增加和删除断点。
3.3 断点和单步执行
1.选择MCU/Remove all breakpoints删除所有断点。
2.进入电路设计视窗(即Getting Started MCU标签),然后选择Simulate/Run。图形LCD元器件上开始显示字符串“Graphical LCD T6963CC for Multisim”。
3.选择Simulate/Pause。
4.进入U1的Debug View,注意到调试列表视窗中,最左列的黄色箭头指示MCU停止执行地方的代码语句。

5. 选择MCU/MCU PIC16F84A U1/Memory View,观察微控制器U1内部的存储器当前状态。注意到IROM段程序计数器PC的值比黄色箭头指向的代码语句的地址大1。(在上图中,Debug View中的地址是192,而Memory View中的PC值是193)。
注意:当你在MCU还没有结束当前命令时就暂停仿真,则程序计数器的值将与地址值一致。
你还可以通过Memory View中的其他段来观察微控制器中存储器其他部分的值。
6. 单击Simulation工具条中的Step into按钮。
7. 执行当前指令,在下一条指令处仿真暂停。
8. 选择Simulate/Stop。
点和跳出
1. 在SEND_DATA子程序中的MOVWF PORTB处放置断点。
2. 选择Simulate/Run。仿真将在断点处暂停。
3. 单击Simulation中的Step out按钮,跳出SEND_DATA子程序。
4. 仿真继续执行SEND_DATA中所有剩下的指令,然后在调用SEND_DATA子程序的那条语句后的第一条指令处暂停。
4.3.5 断点和单步进入
1. 选择MCU/Remove all breakpoints。
2. 在调用SEND_DATA的地方(刚刚从此处跳出),就在黄色箭头的上方,放置一个断点。
3. 选择Simulate/Run。仿真将在刚才设置断点的地方暂停。
4. 单击Simulation工具条上的Step Into按钮。仿真将在SEND_DATA子程序内部暂停。
3.6 断点和单步跳过
1. 选择Simulate/Run。仿真将在前面设置的同一个断点处暂停,即调用SEND_DATA子程序的地方。
2. 单击Simulation工具条上的Step Over按钮。执行整个SEND_DATA子程序,仿真将在指令CALL SEND_DATA后的一条指令处暂停。
行到光标所在位置
1. 选择MCU/Remove all breakpoints。
2. 我们已知SEND_DATA子程序将被再次调用以发送数据到LCD显示上,所以单击该子程序内部的一条指令。
3. 单击Simulation工具条上的Run to Cursor按钮。仿真一直运行,直至MCU到达SEND_DATA子程序内部单击过的指令处。然后仿真暂停,并将黄色箭头放置在该语句处。

使用特权

评论回复
板凳
liugp25| | 2012-3-7 11:18 | 只看该作者
学习一下

使用特权

评论回复
地板
爱之翼V| | 2012-3-8 10:39 | 只看该作者
看不到图,哎

使用特权

评论回复
5
cooran| | 2012-3-8 15:25 | 只看该作者
图片看不到,楼主修改下

使用特权

评论回复
6
julien| | 2012-3-12 10:40 | 只看该作者
图片没法看呀

使用特权

评论回复
7
julien| | 2012-3-12 10:44 | 只看该作者
本帖最后由 julien 于 2012-3-12 10:45 编辑

82.gif (20.78 KB )

82.gif

使用特权

评论回复
8
julien| | 2012-3-12 10:46 | 只看该作者
需要大家自己对应了

使用特权

评论回复
9
liugp25| | 2012-3-12 11:02 | 只看该作者
谢谢补充 有心了 :) 7# julien

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

169

帖子

0

粉丝