dsp实验报告 2_第1页
dsp实验报告 2_第2页
dsp实验报告 2_第3页
dsp实验报告 2_第4页
dsp实验报告 2_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 DSP实验报告 院系名称 电气与信息工程学院 专业名称 电气工程及其自动化 班 级 电气1002班 学生姓名 苏 美 龙 学 号指导老师 易 吉 良 2013年 11 月 6 日 实验一 拨码开关实验、实验目的1.了解DSP开发系统的组成和结构2.了解IO 的基本编程方法二、实验设备计算机,CCS3.1版本软件,DSP 仿真器,E300 实验箱,2812CPU板(新的)三、实验原理8位的数字量输入(由拨码开关产生),当拨码打到靠近LED时为低。相反为高。通过74LS244(可读)缓冲连接到DSP 的数据总线的低8 位。CPU 通过读指令读取到拨码开关产生的8 位输出的数字量,然后CPU通过写

2、指令把读出的8 位数字量写入(0x0200)单元内,使连接到DSP的数据总线的低8 位的74LS273的输出端产生高低信号,此时LED 灯产生亮灭。当对应LED 灯点亮时说明输出为低,熄灭时为高。(器件 74LS244和74LS273详细的介绍请参看数据手册)。数字量输入输出单元的资源分配如下:基地址:0000h(当CS0为0时分配有效)数字量分配空间为数据空间地址:基地址+0x200(低8位,只读)拨码开关扩展工作原理说明:74LS244 片选号、74LS273 片选信号和74LS273 复位信号由E300 上CPLD 译码产生。本实验使用DSP 数据总线的低8位。本实验的程序流程框图如下:

3、四、实验步骤1. 2812CPU板上的JUMP1的1和2脚短接,拨码开关SW1的第二位置ON。2.E300 板上的开关SW4 的第一位置ON,其余OFF;SW5开关全部置ON;其余开关全部置OFF。3. 运行Code Composer Studio (CCS)(ccs3.1需要“DEBUGConnect” )4. 用“ProjectOpen”打开系统项目文件e300.test normalDSP2801x_examplee300_02_swich Exampla_281_swich.pjt;5. 编译全部文件并装载normalDSP2801x_examplee300_02_swich Exam

4、pla_281_swich.out;6. 单击“Debug Go Main”跳到主程序的开始;7. 单击“Debug RUN”运行程序8.任意拨动E300 底板上的拨动开关,观察LED和拨动开关的对应情况。(LED1-LED7分别对应DSP 数据总线的D0-D7);9.单击“Debug Halt” 暂停持续运行,开关将对灯失去控制.10.关闭所有窗口,本实验完。五、实验结果设置好CCS的环境,打开本工程,编译、下载、运行。调整数字输入输出单元的开关K1K8,观察LED1LED8灯亮灭的变化为:拨动LED1LED8灯相应的开关K1K8,则对应的灯亮灭。修改后的实验原程序:#include &qu

5、ot;DSP281x_Device.h" / DSP281x Headerfile Include File#include "DSP281x_Examples.h" / DSP281x Examples Include Filevoid main(void) unsigned int temp; temp = 0; InitSysCtrl();/初始化PLL,WatchDog,使能外围时钟,该初始化文件在"DSP281x_SysCtrl.c"中DINT;/关闭CPU中断InitPieCtrl();IER = 0x0000;/关闭中断和清除所有

6、中断标志 IFR = 0x0000;InitPieVectTable(); for(;) asm(" nop ");temp = *(int *)0x2200&0x0007; /读入0x2200地址的开关量值并赋给tempswitch(temp) case 0x0000:* (int *)0x2200 = 0x00fe; break; case 0x0001:* (int *)0x2200 = 0x00fd; break; case 0x0002:* (int *)0x2200 = 0x00fb; break; case 0x0003:* (int *)0x2200

7、 = 0x00f7; break; case 0x0004:* (int *)0x2200 = 0x00ef; break;case 0x0005:* (int *)0x2200 = 0x00df; break;case 0x0006:* (int *)0x2200 = 0x00bf; break;case 0x0007:* (int *)0x2200 = 0x007f; break;default:break; asm(" nop ");asm(" nop "); 实验二 定时器实验一、实验目的1、熟悉F2812的CPU定时器;2、掌握F2812的CP

8、U定时器的控制方法;3、学会使用CUP定时器中断方式控制程序流程。二、实验设备计算机,CCS3.1版软件,DSP硬件仿真器,E300实验箱,2812CPU板。3、 实验原理说明样例实验是采用CPU定时器来定时LED亮灭的。F2812的CPU定时器不同于事件管理器(EVAEVB)中的通用定时器(GP)。F2812的CPU共有三个定时器,其中,CPU1定时器1和2被保留用作实验操作系统OS例如DSPBIOS),CPU定时器0可以供用户使用。定时器的一般操作如下:将周期寄存器PRDH:PRD中的值装入32位计数器寄存器TIMI:TIM。然后计数器寄存器以F2812x的SYSCLKLT速率递减。当计数

9、器减到0,就会产生一个定时器中断输出定时信号(一个中断脉冲)。下图为CPU定时器的内部结构:样例实验的程序如下:4、 实验步骤和内容 1、F2812CPU板的JUPMI的1和2脚短接,拨码开关SW1的第二位置ON;其余OFF。 2、E300 底板的开关SW4 的第1位置ON,其余位置OFF。其余开关设置为OFF; 3、运行CCS软件,调入样例程序,装载并运行;(进入CCS界面后需要点“Debug-Connect”); 4、加载“.e300_03cpu_timerDebugEample_281x_cpu_timer.out”;单击“Debug Animate”运行,可观察到LED1LED8的变化

10、规律: 先LED1,8点亮LED2,7D点亮LED1,8熄灭LED3,6点亮LED2,7熄灭LED4,5点亮LED3,6熄灭后LED4,5熄灭LED3,6点亮LED3,6熄灭LED2,7点亮LED2,7熄灭LED1,8点亮。6、单击“Debug Halt”,暂停程序运行,LED灯停止闪烁;单击“RUN”,LED灯又开始闪烁变化;7、 结束试验程序8、修改后的实验原程序:#include "DSP281x_Device.h" #include "DSP281x_Examples.h" interrupt void cpu_timer0_isr(void);

11、void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period);void main(void) unsigned int temp; temp = 0; InitSysCtrl(); DINT; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); EALLOW; PieVectTable.TINT0 = &cpu_timer0_isr; EDIS; InitCpuTimers(); ConfigCpuTimer(&Cpu

12、Timer0, 100, 100000); StartCpuTimer0(); IER |= M_INT1; PieCtrlRegs.PIEIER1.bit.INTx7 = 1; EINT; ERTM; for(;) temp = *(int *)0x2200&0x0001;if (temp=0) if(CpuTimer0.InterruptCount<1) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fe; *(int *)0x2200=0x007f; else if(CpuTimer0.

13、InterruptCount<2) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fe; *(int *)0x2200=0x007f; *(int *)0x2200=0x00fd; *(int *)0x2200=0x00bf; else if(CpuTimer0.InterruptCount<3) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fd; *(int *)0x2200=0x00bf; else i

14、f(CpuTimer0.InterruptCount<4) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fd; *(int *)0x2200=0x00bf; *(int *)0x2200=0x00fb; *(int *)0x2200=0x00df; else if(CpuTimer0.InterruptCount<5) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fb; *(int *)0x2200=0x

15、00df; else if(CpuTimer0.InterruptCount<6) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fb; *(int *)0x2200=0x00df; *(int *)0x2200=0x00f7; *(int *)0x2200=0x00ef; else if(CpuTimer0.InterruptCount<7) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00f7; *(int

16、 *)0x2200=0x00ef; else if(CpuTimer0.InterruptCount<8) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00ff; else if(CpuTimer0.InterruptCount<9) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fb; *(int *)0x2200=0x00df; else if(CpuTimer0.InterruptCount<10)

17、 asm(" nop "); asm(" nop "); *(int *)0x2200=0x00ff; else if(CpuTimer0.InterruptCount<11) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fd; *(int *)0x2200=0x00bf; else if(CpuTimer0.InterruptCount<12) asm(" nop "); asm(" nop "); *(int

18、*)0x2200=0x00ff; else CpuTimer0.InterruptCount = 0; else if (temp=1) if(CpuTimer0.InterruptCount<9) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fe; *(int *)0x2200=0x007f; else if(CpuTimer0.InterruptCount<8) asm(" nop "); asm(" nop "); *(int *)0x2200=0

19、x00fe; *(int *)0x2200=0x007f; *(int *)0x2200=0x00fd; *(int *)0x2200=0x00bf; else if(CpuTimer0.InterruptCount<3) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fd; *(int *)0x2200=0x00bf; else if(CpuTimer0.InterruptCount<4) asm(" nop "); asm(" nop "); *(in

20、t *)0x2200=0x00fd; *(int *)0x2200=0x00bf; *(int *)0x2200=0x00fb; *(int *)0x2200=0x00df; else if(CpuTimer0.InterruptCount<5) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fb; *(int *)0x2200=0x00df; else if(CpuTimer0.InterruptCount<6) asm(" nop "); asm(" nop &

21、quot;); *(int *)0x2200=0x00fb; *(int *)0x2200=0x00df; *(int *)0x2200=0x00f7; *(int *)0x2200=0x00ef; else if(CpuTimer0.InterruptCount<7) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00f7; *(int *)0x2200=0x00ef; else if(CpuTimer0.InterruptCount<8) asm(" nop "); asm(

22、" nop "); *(int *)0x2200=0x00ff; else if(CpuTimer0.InterruptCount<9) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fb; *(int *)0x2200=0x00df; else if(CpuTimer0.InterruptCount<10) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00ff; else if(CpuTi

23、mer0.InterruptCount<11) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fd; *(int *)0x2200=0x00bf; else if(CpuTimer0.InterruptCount<12) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00ff; else CpuTimer0.InterruptCount = 0; interrupt void cpu_timer0_isr(voi

24、d) CpuTimer0.InterruptCount+; PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;实验三 键盘接口实验(E300)、实验目的1. 了解DSP开发系统的组成和结构2. 了解键盘的基本编程方法3. 内存观察工具的使用二、实验设备计算机,CCS3.1版本软件,DSP 仿真器,E300 实验箱,2812CPU板三、实验原理本实验程序由二部分组成:1.由外部中断2产生中断信号2.键值读取程序:该部分有两种方法进行键值的判断。方法1:利用内存观察工具进行观察方法2:利用LED1-LED8 的亮灭对应显示键值。a) 外部中断2的应用参照实验二;b) 内

25、存观察键值:程序中定义了三个变量“W”“row”和“col”。“W”代表是CPLD 中键盘的扫描数值,“row”和“col”分别代表键盘的行和列,由行和列可以判定按键的位置。上述三个变量可以在观察窗口中观察的。c) 利用LED 灯显示键值原理,参看实验一。具体的LED 灯显示值以查表的形式读出,请参看“e300_codec.h”库文件。本实验的CPLD地址译码说明: 基地址:0x2000,当底板片选CS1为低时,分配有效。 CPU的数据空间:基地址+0x0200 LED灯 output8外部中断用XINT2:由CPLD分配,中断信号由键盘产生。 中断下降沿触发。KEY_DAY_REG(R):基

26、地址+0x0004;四、实验步骤和内容 1. 2812CPU板JUMP1的1和2脚短接,拨码开关SW1的第二位ON; 2.E300 板上的开关SW4 的第一位置ON,其余OFF;SW3 的第四位置ON 其余的SW 置OFF;3.运行Code Composer Studio (CCS)(ccs3.1需要“DEBUGConnect” );4.打开系统项目文件e300.test normal DSP281x_examplese300_06_key interface Example_281x_ keyled.pjt;5.编译全部文件并装载“Debug keyled.out”文件;6.单击“Debug

27、Go Main”跳到主程序的开始;7.指定位置设置断点;8. View-Watch Window 打开变量观察窗口; 将变量“w”“ row”和“ col”添加到观察窗口中,改变变量观察窗口的显示方式为HEX 显示; 点击“Debug-Animate”全速运行,然后点击E300 板上键盘按键,观察窗口中变量变化,同时LED1-LED8 灯也相应变化,指示键值。(注意程序中KEY_E和KEY_F分别代表键盘上的“*”和“#”键值。十六进制数代表的意义为:高4 位为按键的行值,低4 位为按键的列值。注意:“w”中的低八位表; 11.关闭所有窗口,本实验完毕。五、实验程序框图修改后的实验原程序:#i

28、nclude "DSP281x_Device.h" / DSP281x Headerfile Include File#include "DSP281x_Examples.h" / DSP281x Examples Include File#include "e300_codec.h"void init_xint2(void);interrupt void xint2_isr(void); /中断2中断子程序void read_data ();/读取数据子函数void conv(void);/键盘数值转换子函数interrupt vo

29、id cpu_timer0_isr(void);void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period);unsigned int row,col,w;int a=0;unsigned int temp=0;void init_xint2() XIntruptRegs.XINT2CR.all=0x0001; /低电平触发中断 interrupt void xint2_isr() /中断2中断子程序 a=1; /开总中断 PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; in

30、terrupt void cpu_timer0_isr(void) CpuTimer0.InterruptCount+;more interrupts from group 1 PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; void main(void)ClocksDSP281x_SysCtrl.c file. InitSysCtrl(); DINT;default state.disabled and flags InitPieCtrl();CPU interrupt flags: IER = 0x0000; IFR = 0x0000;to the shel

31、l Interrupt InitPieVectTable(); EALLOW; / This is needed to write to EALLOW protected registers PieVectTable.XINT2 = &xint2_isr; PieVectTable.TINT0 = &cpu_timer0_isr; EDIS; InitCpuTimers(); / For this example, only initialize the Cpu Timerssecond:uSeconds) ConfigCpuTimer(&CpuTimer0, 100,

32、 100000); StartCpuTimer0(); init_xint2(); PieCtrlRegs.PIEIER1.all = 0x0050; IER |= M_INT1 ; EINT; / Enable Global interrupt INTM ERTM; / Enable Global realtime interrupt DBGM for(;) if(a=1)/加软件断点 temp = *(int *)0x2200&0x0001;if (temp=0) if(CpuTimer0.InterruptCount<1) asm(" nop "); a

33、sm(" nop "); *(int *)0x2200=0x00fe; *(int *)0x2200=0x007f; else if(CpuTimer0.InterruptCount<2) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fe; *(int *)0x2200=0x007f; *(int *)0x2200=0x00fd; *(int *)0x2200=0x00bf; else if(CpuTimer0.InterruptCount<3) asm(" no

34、p "); asm(" nop "); *(int *)0x2200=0x00fd; *(int *)0x2200=0x00bf; else if(CpuTimer0.InterruptCount<4) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fd; *(int *)0x2200=0x00bf; *(int *)0x2200=0x00fb; *(int *)0x2200=0x00df; else if(CpuTimer0.InterruptCount<5) a

35、sm(" nop "); asm(" nop "); *(int *)0x2200=0x00fb; *(int *)0x2200=0x00df; else if(CpuTimer0.InterruptCount<6) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fb; *(int *)0x2200=0x00df; *(int *)0x2200=0x00f7; *(int *)0x2200=0x00ef; else if(CpuTimer0.InterruptC

36、ount<7) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00f7; *(int *)0x2200=0x00ef; else if(CpuTimer0.InterruptCount<8) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00ff; else if(CpuTimer0.InterruptCount<9) asm(" nop "); asm(" nop ")

37、; *(int *)0x2200=0x00fb; *(int *)0x2200=0x00df; else if(CpuTimer0.InterruptCount<10) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00ff; else if(CpuTimer0.InterruptCount<11) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fd; *(int *)0x2200=0x00bf; else if

38、(CpuTimer0.InterruptCount<12) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00ff; else CpuTimer0.InterruptCount = 0; else if (temp=1) if(CpuTimer0.InterruptCount<9) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fe; *(int *)0x2200=0x007f; else if(CpuTimer

39、0.InterruptCount<8) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fe; *(int *)0x2200=0x007f; *(int *)0x2200=0x00fd; *(int *)0x2200=0x00bf; else if(CpuTimer0.InterruptCount<3) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fd; *(int *)0x2200=0x00bf; else

40、 if(CpuTimer0.InterruptCount<4) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fd; *(int *)0x2200=0x00bf; *(int *)0x2200=0x00fb; *(int *)0x2200=0x00df; else if(CpuTimer0.InterruptCount<5) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fb; *(int *)0x2200=

41、0x00df; else if(CpuTimer0.InterruptCount<6) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fb; *(int *)0x2200=0x00df; *(int *)0x2200=0x00f7; *(int *)0x2200=0x00ef; else if(CpuTimer0.InterruptCount<7) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00f7; *(i

42、nt *)0x2200=0x00ef; else if(CpuTimer0.InterruptCount<8) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00ff; else if(CpuTimer0.InterruptCount<9) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fb; *(int *)0x2200=0x00df; else if(CpuTimer0.InterruptCount<1

43、0) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00ff; else if(CpuTimer0.InterruptCount<11) asm(" nop "); asm(" nop "); *(int *)0x2200=0x00fd; *(int *)0x2200=0x00bf; else if(CpuTimer0.InterruptCount<12) asm(" nop "); asm(" nop "); *(in

44、t *)0x2200=0x00ff; else CpuTimer0.InterruptCount = 0; read_data();/ conv(); else 6、 实验建议 本实验程序采用外部中断的方式来判断键盘是否被按下,除了这种方法外,还可以根据键盘按下标志位“KEY_FLAG”,利用查询方式来编写程序,“KEY_FLAG”是CPLD内部状态寄存器中的一个只读位.CPLD内部状态寄存器:CPLD_ST实验四 A/D转换实验(E300)一、实验目的1 了解DSP 中A/D转换模块的特点;2 了解A/D转换模块的原理结构;3 掌握A/D转换模块的使用。二、实验设备计算机,DSP仿真器,TH

45、RSC-2型实验箱各一台。三、实验原理TMS320F2812的ADC模块是一个12位分辨率、高达80ns转换时间、具有流水线结构的模数转换器。此转换器的模拟电路包括:前端模拟多路复用器(MUXs)、采样/保持电路(S/H)、转换核、电压调节器以及其他模拟支持电路。数字电路包括:可编程转换序列发生器、转换结果寄存器、模拟电路接口、设备外围总线接口以及其他片上模块接口等,可以直接用于电机或运动控制场合。四、实验内容与步骤连接好仿真器、计算机与实验箱,系统上电,实验箱电源指示灯亮,仿真器上红色指示灯亮,系统连接正常。打开CCS3.1软件。图1.6.3 实验程序流程图1图1.6.3为A/D实验程序流程

46、图:采集电位器电压。A/D用16个通道采集当前电压值,取平均值,将十六进制数转换成十进制数,并处理成电压量输出给液晶屏显示,循环上述操作。2打开实验程序dsp2812.1.6-ADC目录下的工程ADC.pjt,点 编译、下载。按“F5”运行,液晶屏显示当前DSP的ADCINA2(对应试验箱A/D转换单元的ADCINA)通道电压值,调节A/D转换单元的电位器,改变输入电压,显示随之变化,显示电压在03.3V之间。3点“Halt”,停止程序运行,恢复程序指令初始值,并保存,关闭所有窗口,实验完毕。修改后的实验原程序:#include "DSP281x_Device.h" / D

47、SP281x Headerfile Include File#include "DSP281x_Examples.h" / DSP281x Examples Include Fileinterrupt void adc_isr(void);Uint16 LoopCount;Uint16 ConversionCount; double input1256; double input2256;Uint16a4,b4;Uint16 sum1=0,sum2=0void main(void) InitSysCtrl(); EALLOW; SysCtrlRegs.PLLCR.all=0

48、x8; SysCtrlRegs.HISPCP.all = 0x3; / HSPCLK = SYSCLKOUT/6 EDIS; DINT; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); EALLOW; / This is needed to write to EALLOW protected register PieVectTable.ADCINT = &adc_isr; EDIS; / This is needed to disable write to EALLOW protected registers InitAdc(); / For this example, init the ADC PieCtrlRegs.PIEIER1.bit.INTx6 = 1; IER |= M_INT1; / Enable CPU Interru

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论