实验三定时器及外部中断实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三定时器及外部中断实验
一、实验目的
1)熟悉VC5416的定时器工作原理。
2)掌握VC5416定时器的编程控制方法。
3)学会使用定时器的中断方式来控制程序执行方法。
4)掌握外部中断的编程控制方法,理解DSP对于中断的响应的过程。
5)了解并学习混合编程的实现方法。
二、实验设备
1)计算机一套,DSP硬件仿真器一台,实验箱一台。
2)CCS4.1-CCS5.5软件版本。
3)源程序及链接命令文件见:D:\ EXPER\EXP3目录下的.asm 、.cmd、.C 和.lib文件。
三、实验步骤
(一)、连接仿真器,将仿真器插接到C5416的JTAG接口上,另一头插接到电脑的USB接口上,因为仿真器是金属外壳,容易和箱子内部的电路触碰造成短路,从而对实验箱造成损坏,这个要特别注意,也不允许在机箱打开电源情况下插拔仿真器。
(二)、实验箱配置及连线:C5416DSP核心板上的SW1的1-6的开始设置为off off off off on on(上电后工做于1/2分频器方式,其它实验也按照此设置不变,我试验过改为PLL*2方式仿真器就连接不上了),SW2设置为on on on on。
将DSP核心板所在试验箱引脚连线区的BCANRX(C54的XF)引脚,与指示灯连线区LAMP的L1连接起来,这样就可以通过XF控制这个L1这个方光管的亮灭了。
将DSP核心板所在试验箱引脚连线区的INT0(C54的外部中断0输入)引脚与单脉冲按键PAULSE的P-(按下输出负脉冲)连接起来,这样按下按键时,就会给DSP的INT0中断引脚发送一个负脉冲。
连线照片见程序目录中的图片文件。
(二)、打开实验箱电源开关。
(三)、使用给定的文件,按照实验一的步骤建立实验项目,
例如工作区目录为D:\ exp3 中建立一个exp3的实验项目,添加所有的给定的文件。(四)、仿真调试方法
1、通过菜单Project- Build All 对项目进行编译和链接,如下:如果有错误会出现在problem 窗口中。
2、或者直接点击--“debug”按钮完成编译、链接和下载操作,会自动切换到调试页面。观察右上窗口中各寄存器的值。
3、可将需要关心的变量添加到观察窗口,
这样就不用通过存储器地址来查看变量值了。
可在DEBUG模式下,鼠标左键双击选择待
观察变量,然后右键在弹出的菜单中选择Add
Watch Expression…,在弹出的对话框点中,可
见要添加的变量名已经自动添加进去了,击
“OK”按钮。此时在观察窗口就能看到这个
变量了,观察窗口是带选项卡的,variables,
expressions和registers只能自己切换来显示,
一般汇编程序,查看寄存器多,c程序查看表达式多,查看子程序时,局部变量会显示在variables窗口中。如下图,可见刚添加的这
个Timer_Int_Num 值是0,存在于数据存
储中,存储器地址为0x82:
可以在中断向量表程序vector.asm中如下图位置加入断点,这时当DSP响应中断,就会停止原来主循环程序,将返回地址入栈, 然后响应响应的中断,将中断向量表中的响应矢量地址加载PC,或者说程序跳转到中断向量表中相应矢量地址的代码处,即程序停止到断点处,然后再单步执行程序,观察程序之间的跳转关系。如下图:
4)实验内容
1、观察核心板上的晶振,可知晶体频率为10MHz,查看initial.asm程序,计算出中断的间隔时间,再查看exp03.c代码中的中断服务子程序interrupt void timer()程序段,由于初始化阶段已经将变量INT_Flash_Flag标志为清零了,确认PORT.asm中porta和portb 子程序的调用周期,然后再查看这连个子程序中是怎样修改LED_Flash_Flag值的,然后查看exp03.c代码中main主程序段中的while死循环部分,看看怎样通过这个标志位修改XF
输出的。这些过程可使用“断点+连续”在辅助“单步运行”的仿真调试方式进行查看。最后回答,在不按动单脉冲按钮时候,为什么L1的闪烁周期是2秒(亮1秒,灭1秒),我们暂且称这个周期为基本闪烁周期。然后单次按动单脉冲按钮,观察L1的闪烁周期变成1秒了,称这个周期为变闪烁周期。这中变化是怎样实现的。
2、根据实验书后附录3(中断向量表)完成实验报告中4)题的修改。理解并掌握中断向量的入口地址的计算方法。
四、实验报告
1)发光管L1的基本闪烁周期2秒是怎么计算出来的?
2)查实验书附录中的中断屏蔽寄存器,简述外部中断的初始化方法。
3)若将发光管的基本闪烁周期改为4秒,应如何修改源程序?都有哪些方法?给出修改的语句及响应的程序段。
4)若将采集单脉冲中断由外部中断0(INT0)改到外部中断1(INT1)时,程序中要如何进行修改?注意:电路方面要把单脉冲的P-连线由INT0调换到INT1上来。
5) 思考题:如何用c语言调用汇编子程序?如何实现不同汇编程序之间相互调用?如何在
c程序中嵌入汇编语句?若实现不论P-连接到INT0或INT1上,程序都能正常运行,那么程序又应该如何修改?
五、源程序及链接命令文件
1、主程序EXP03.C
/************************************************
* FileName: EXP03.C *
* Description: 定时器中断实验*
* Write by: lanrunze *
* Date: 2004-2-10 *
* Update: 2019-01-10 *
*************************************************/
//本实验使用单按钮产生外部中断
#include
interrupt void timer(); //定义定时器中断服务子程序
interrupt void int0c(); //定义外部中断服务子程序
extern void initial(); //定义外部初始化子程序
extern void porta(); //定义外部端口操作子程序
extern void portb();
extern void portc();
extern void portd();
extern unsigned int LED_Flash_Flag ;
extern unsigned int INT_Flash_Flag ;
int flag1=0; //端口输出标志,用于端口输出控制
int flag2=0; //端口输出标志,用于端口输出控制
interrupt void timer() //定时器中断子程序,数存单元作计数器例子
{
*(int *)0x300=*(int *)0x300+1; //时钟中断计数,使用绝对寻址方式
if( ( (*(int *) 0x300 >= 1000 )&& (INT_Flash_Flag == 0 ) ) //偶数次外部中断时计数超过 1000次
||( (*(int *) 0x300 >= 500 ) && (INT_Flash_Flag == 1 ) ) ) //奇数次外