32位CPU定时器0中断实验报告
实验报告
课程名称: 微机原理与应用 指导老师: 马钧华 成绩:
实验名称: 32位CPU定时器0中断实验 实验类型: 同组学生姓名: 一、实验目的和要求(必填) 二、实验内容和原理(必填) 三、主要仪器设备(必填) 四、操作方法和实验步骤 五、实验数据记录和处理 六、实验结果与
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
(必填) 七、讨论、心得
一、实验目的
1、通过实验熟悉TMS320F2812的定时器;
2、掌握F2812定时器的控制方法;
3、掌握F2812的中断结构和对中断的处理
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
;
4、掌握C语言中断程序
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
以及运用中断程序控制程序流程
装 二、实验原理(见实验课本P74~P76)
订
三、实验内容
线
1、完成基本的定时闪灯功能
同时,跑马灯
2、Timer:显示格式000000.00 : 秒表
3、Clock:显示格式小时-分钟-秒数: 时钟
4、按键功能设计
---------------------
8/C 小时:增加/减小
9/D 分钟:增加/减小
A/E 切换:时钟/秒表
B/F 秒表时的启动/停止
四、实验过程
打开软件,连接DSP后,导入文件:CpuTimer0.pjt。同时打开keydisplay.pjt,ADC.pjt,
找到源文件,备用。(设CpuTimer0.pjt为active)
【1】跑马灯及定时闪烁
1、编译CpuTimer0.pjt后,运行程序,发现LED22和LED23在依次闪烁,频率均为0.5HZ,程序运行正常。
【2】秒表功能
难点:秒表的精度是0.01s,所以必须修改输入时钟频率。
思路:1、修改分频语句: ConfigCpuTimer(&CpuTimer0, 150, 10000),即去掉2个0。
2、定义变量a,b,c,d,e,f,g,h分别为显示输出的8位数字,格式为Int。在中断中加入a,b,c,d,e,f,g,h的变换规则,比如:
a=a+1;
if(a>=10){
a=0;
b=b+1;
}
if(b>=10){
b=0;
c=c+1;
}
if(c>=10){
c=0;
d=d+1;
}
……
注意时钟计数的60进制和24进制,需要修改if中的条件。
3、显示输出
复制显示程序spi_intial()和gpio_init(),以及LED显示子程序LEDdisplay()。在
主程序中添加spi_intial()和gpio_inti()的初始化语句。在中断中继续添加LEDdisplay()
显示语句。注意初始化语句要卸载关闭外围中断之后:
spi_intial(); //SPI初始化子程序
gpio_init(); //GPIO初始化子程序
添加Write_LED子程序。
LEDdisplay内变量分别为:(h,g,f,e,d,c,b,a)。由于格式中第6位有小数点,查找
格式表(Write_LED程序中有):
Uint16
LEDcode[30]={0xc000,0xf900,0xA400,0xB000,0x9900,0x9200,0x8200,0xF800,
0x8000,0x9000,0x8800,0x8300,0xc600,0xa100,0x8600,0x8e00,
0x8c00,0xbf00,0xa700,0xff00,0x4000,0x7900,0x2400,0x3000,
0x1900,0x1200,0x0200,0x7800,0x0000,0x1000};//共阳字形
码0~f, P,?,L,灭,0.~9.
于是将c改为:c+20。
检查无误后编译运行。
【3】时钟功能
思路:总的来说和秒表差不多,具体操作与【4】连在一起解说。
【4】按键功能设计
难点:
1、在时钟状态下秒表不会工作,而在秒表状态下时钟需要正常运行,而不能停止。
2、秒表的归零、暂停等操作不能影响到时钟的运行。
思路:
1、新定义7个变量:aa,bb,cc,dd,ee,ff,gg,格式为Int。其中gg作为二次分频用。
2、仿照秒表,写出aa,bb,cc,dd,ee,ff的关系:
gg=gg+1;
if(gg>=100){
gg=0;
aa=aa+1;
}
if(aa>=10){
aa=0;
bb=bb+1;
}
……
3、定义秒表/时钟的切换开关为clock,1/0分别为秒表/时钟,设定初始值为0;
定义秒表的运行/暂停为flag1=1/0,设定初始值为0。
在秒表计数的程序之前添加if条件语句:
if(flag1==1){
……
}
在LEDdisplay语句外添加if条件语句:
if(clock==1){
LEDdisplay(h,g+20,f,e+20,d,c+20,b,a);
}
if(clock==0){
LEDdisplay(ee/10,ee%10,17,dd,cc,17,bb,aa);
}
4、添加归零功能:由于没有多余的按键来设置归零键,于是只能当clock==0时强制
令秒表清零。即在if(clock==0)下添加a~h的清零语句。
5、设置按键语句。
从keydisplay.pjt中复制按键命令程序,只需要复制K9~K16即可,注意复制#define
的一部分内容。再复制K9~K16的键扫描程序和键散转子程序。由于程序中有延迟命令,
所以不能加在中断语句中。于是操作如下:
for(;;){
if (Keyscan2() == 1) // 调用键扫描K9~K16子程序
{
KeyFunction2(KeyReg2);
}
}
;
6、添加命令语句
根据要求,修改内容如下:
case K9: {
ee=ee+1; //秒数加1
}
break;
case K10: {
cc=cc+1; //分钟加1
}
break;
case K11: {
clock= 0; //切换为时钟
}
break;
case K12: {
flag1 = 1; //秒表开启运转
}
break;
case K13: {
ee=ee-1; //秒数减1
}
break;
case K14: {
cc=cc-1; //分钟减1
}
break;
case K15: {
clock=1; //切换为秒表
}
break;
case K16: {
flag1=0; //秒表暂停
}
break;
7、编译完成后,点击Debug,打开Realtime模式,并在Watchwindow中添加a,b,c,d,e,f,g,aa,bb,cc,dd,ee,ff,flag1,clock作为观察对象,并打开Watchwindow中的Continues Refresh模式,并运行,通过操作键盘操作观察实验结果及数据变化情况。
五、实验记录
【1】定时闪灯及跑马灯运行正常
【2】【3】【4】中数字管的显示出现问题,无法将信号传输到数码管显示上。原因可能是数码管的输出通道与其他信号冲突导致的。不过在watchwindow上模拟出来的结果一切正常。具体程序见:cputime0.pjt。
补充:在11.14(周五)下午我们组重新调试了文件,发现了显示问题的真正原因,是Write_LED子程序中的判断语句无故删除。添加语句后恢复正常:
while(SpiaRegs.SPISTS.bit.INT_FLAG != 1){}
编译运行一切正常。由于之前的显示错误,a,b,c,d,e,f,g,等代码排序也是乱的,调整后改为了正确的顺序。原本小时数的归零是用“最高位等于2且第二位<=4时归零的,结果发现信号的延迟作用导致其无法正常归零,所以小时设置为1个值,用求余和取整的方法显示其十位和个位。重新附上程序cputime0.pjt。
附上照片: