好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

DSP实验二拨码开关实验.doc

6页
  • 卖家[上传人]:慢***
  • 文档编号:233023019
  • 上传时间:2022-01-01
  • 文档格式:DOC
  • 文档大小:110.50KB
  • / 6 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 实验二 拨码开关实验—、实验目的1.了解DSP开发系统的组成和结构2.了解IO的基本编程方法二、实验设备 计算机,CCS3.3版本软件,DSP仿真器,E300实验箱,2812CPU板三、实验原理 8位的数字量输入(由拨码开关产生),当拨码打到靠近LED时为低相反为高通过74LS244(可读)缓冲连接到DSP的数据总线的低8位CPU通过读指令读取到拨码开关产生的8位输出的数字量,然后CPU通过写指令把读出的8位数字量写入(0x2200)单元内,使连接到DSP的数据总线的低8位的74LS273的输出端产生高低信号,此时LED灯产生亮灭当对应LED灯点亮时说明输出为低,熄灭时为高器件74LS244和74LS273详细的介绍请参看数据手册)数字量输入输出单元的资源分配如下:基地址:2000h(当CS1为0时分配有效)数字量分配空间为数据空间地址:基地址+0x2200(低8位,只读)² 拨码开关扩展工作原理 说明:74LS244片选号、74LS273片选信号和74LS273复位信号由E300上CPLD译码产生 本实验使用DSP数据总线的低8位实验任务一:1、编写程序完成将拨码开关的信息读入DSP,然后再将该信息回写,控制led灯。

      调整"数字输入输出单元"的开关K1~K8,观察LED1~LED8灯亮灭的变化2、 本实验的程序流程框图如下:3、 输入主要程序#include "DSP281x_Device.h" // DSP281x Headerfile Include File#include "DSP281x_Examples.h" // DSP281x Examples Include Filevoid main(void){ unsigned int temp; temp = 0; DINT; InitSysCtrl(); InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); for(;;) { asm(" nop "); temp = *(int *)0x2200&0x00ff; asm(" nop "); * (int *)0x2200 = temp; asm(" nop "); }}四、实验步骤(步骤基本与实验一相同)1. 2812CPU板的JUMP1的1和2脚短接,拨码开关SW1的第二位置ON。

      2. E300板上的开关SW4的第二位置ON,其余OFF;SW5开关全部置ON;其余开关全部置OFF3. 运行Code Composer Studio (CCS)(CCS3.3需要“DEBUG→Connect” )4. 用“Project\open”打开系统项目文件路径为“c:\DSP_examep\DSP281X_examples\e300_02_switch\Example_281x_switch.pjt”双击该文件5、 输入主要程序 6、编译程序并装载7. 单击“Debug-Go Main”跳到主程序的开始;8. 单击“Debug\RUN”运行程序需要判断是高电平亮,还是低电平亮,可以使用中断调试在运行状态,在需要设置断点的位置的右边,双击,就可以产生红点表明设置了断点在view目录下,(如右边图所示:)打开watch window,(此项是用来检查和编辑变量或C表达式可以不同格式显示变量值,还可以显示数值、结构或指针等包含多个元素的变量),在本实验中观察temp变量的变化步骤:在debug目录下点run,在断点处,程序会停下来,可以观察temp变量的值也可按“F10”单步运行程序,观察temp变量的值。

      9. 任意拨动E300底板上的拨动开关,观察LED和拨动开关的对应情况LED1-LED7分别对应DSP数据总线的D0-D7)10. 单击 “Debug \ Halt” 暂停持续运行,开关将对灯失去控制.11. 关闭所有窗口,本实验完毕.实验任务二:通过修改以上程序实现:当拔开关时,下一个灯亮即:1号开关动作时,2号灯亮,2号开关动作时,3号灯亮,*****,等在第8号开关动作时,第1号灯亮include "DSP281x_Device.h" // DSP281x Headerfile Include File#include "DSP281x_Examples.h" // DSP281x Examples Include Filevoid main(void){ unsigned int temp; temp = 0; DINT; InitSysCtrl(); InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); for(;;) { asm(" nop "); temp = *(int *)0x2200&0x00ff; if(temp!=0x80) {temp=(temp<<1)&0x00ff; asm(" nop "); * (int *)0x2200 = temp; } else * (int *)0x2200 =0x01; asm(" nop "); }}实验任务三:通过修改以上程序实现:当拔开关时,上一个灯亮。

      即:1号开关动作时,8号灯亮,2号开关动作时,1号灯亮,*****,等在第8号开关动作时,第7号灯亮include "DSP281x_Device.h" // DSP281x Headerfile Include File#include "DSP281x_Examples.h" // DSP281x Examples Include Filevoid main(void){ unsigned int temp; temp = 0; DINT; InitSysCtrl(); InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); for(;;) { asm(" nop "); temp = *(int *)0x2200&0x00ff; if(temp!=0x01) {temp=(temp>>1)&0x00ff; asm(" nop "); * (int *)0x2200 = temp; } else * (int *)0x2200 =0x80; asm(" nop "); }}五、实验说明 1、实验中采用简单的一一映射关系来对数据地址进行验证,目的是使实验者能够对数据有一目了然的认识.2、读入的地址和输出的地址用的同一个地址。

      为什么呢?关键问题是:其拨码开关是通过74LS244和总线相连,灯是通过74LS273相连总线读时将273设为无效,244有效,拨码开关的数据上总线写时,244无效,273有效,将数据发送出,同时锁存需要3根控制线按时序操作对于本试验箱来讲,DSP将控制信号发给CPLD,在对一个特定地址进行读写时(0x2200),CPLD内部通过编程,实现对读写信号的不同操作在DSP读0x2200时,CPLD将244有效当DSP写0x2200时,CPLD将244无效,同时273有效,同时开关锁存一次,同时保持锁存3、 实验中相关语句说明:/*******************************头文件****************************/#include "DSP281x_Device.h" // DSP281x Headerfile Include File#include "DSP281x_Examples.h" // DSP281x Examples Include File/****************************主程序*******************************/void main(void){ unsigned int temp; temp = 0; InitSysCtrl();//初始化PLL,WatchDog,使能外围时钟,该初始化文件在"DSP281x_SysCtrl.c"中 DINT;//关闭CPU中断// Initialize PIE control registers to their default state.// The default state is all PIE interrupts disabled and flags// are cleared. InitPieCtrl(); IER = 0x0000;//关闭中断和清除所有中断标志 IFR = 0x0000;// Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR). InitPieVectTable(); for(;;) { asm(" nop "); temp = *(int *)0x2200&0x00ff; //读入0x2200地址的开关量值并赋给temp asm(" nop "); * (int *)0x2200 = temp; //temp值输出0x2200地址的LED灯 asm(" nop "); }}其中InitPieVectTable()在文件DSP281x_PieVect.c中。

      void InitPieVectTable(void){ int16 i; Uint32 *Source = (void *) &PieVectTableInit;在这里取PieVectableInit的地址, Uint32 *Dest = (void *) &PieVectTable; 在这里取PieVectTable的地址,他们都应该是全局变量 EALLOW; for(i=0; i < 128; i++) *Dest++ = *Source++; EDIS; // Enable the PIE Vector Table PieCtrlRegs.PIECRTL.bit.ENPIE = 1; 变量pieVectTableInit在文件DSP281x_PieVect.c中PieVectTable在DSP281x_PieVect.h中定义,在最后2行他们的具体地址可以由md文件来确定。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.