- 前言
- 实验须知
- 概述
- 实验一 TMS320LF2407 DSP 实验开发系统及CC软件应用
- 实验二 常用指令操作实验
- 实验三 追灯式电路控制
- 实验四 按键计数器
- 实验五 键盘和 LED 发光二极管显示电路
- 实验六 模/数转换器 ADC 应用
- 实验七 串行外围接口 SPI 的应用
- 实验八 串行通信接口模块(SCI)
- 实验九 TMS320LF2407 与图形液晶显示模块接口及应用
- 实验十 I2C 串行日历时钟与 TMS320LF2407 的接口应用
- 附录一 DSP 器件仿真开发技术基础
- 附录二 TMS320LF2407 DSP 实验开发系统
- 附录三 TMS320LF2407 DSP 器件简介
- 附录四 XDS510 仿真开发系统的基本操作技术
- 附录五 程序开发平台 Code Composer
- 参考文献
实验三 追灯式电路控制
一.实验说明
输入/输出端口(简称I/O口)是DSP芯片内部电路与外部世界交换信息的通道。输入端口负责从外界接收检测信号、键盘信号等各种开关量信号;输出端口负责向外界输送由内部电路产生的处理结果、显示信息、控制命令、驱动信号等。本实验利用TMS320LF2407芯片做基本的I/O控制接口。
使用循环指令和多种送数延时循环程序,设计DSP的“追灯”控制器,是最容易和最简单的事例。如果使用查表的方式来做控制,所谓查表的方式是将一些特定的数据,在此是LED展示的变化组合数据事先存在数组中,而在程序中逐一由数组中取出个别的样本数据送往74HC273锁存以驱动LED发光二极管(SW-DIP8须置ON),便可完成“追灯”式电路展示的效果。由于展示的样本数据可以随时组合,因此以查表法来做“追灯”式电路控制的变化较多,展示效果较佳。
实验箱中的TMS320LF2407芯片的输出端口用IOPB0~IOPB7引脚,TMS320LF2407的IOPF2引脚接74HC273的CLK引脚作为74HC273的控制信号; TMS320LF2407的RESET(复位)引脚接74HC273的CLR,复位时,74HC273输出引脚为低电平。
二.实验目的
1. 熟悉基本的TMS320LF240X系列的汇编语言。
2. 了解实验开发系统的基本I/O硬件电路的控制方法。
3. 进一步熟悉设计并调试程序的基本方法。
三.实验内容
1.设计并调试用于TMS320LF2407的“追灯”控制器,要求“灯”的花样和显示次数均由软件任意设定。
2.程序要求具有多种不同的灯亮花样,能实现发光二极管左移、右移即所谓“追灯”功能。
四.实验硬件电路
图3.1 TMS320LF与40LED接口电路
五.实验参考程序清单
C程序
I/O端口作为输出(追灯)
源程序代码:
(1) 所需的复位和中断向量定义文件“vectors.asm”
.title "vectors.asm"
.ref _c_int0,_nothing
.sect ".vectors"
reset: b _c_int0
int1: b _nothing
int2: b _nothing
int3: b _nothing
int4: b _nothing
int5: b _nothing
int6: b _nothing
(2) 主程序
// 该程序用于实验演示模板上的8个LED的循环显示
#include "register.h"
initial() // 初始化子程序
{
asm(" setc SXM"); // 抑制符号位扩展
asm(" clrc OVM"); // 累加器中结果正常溢出
asm(" clrc CNF"); // B0被配置为数据存储空间
asm(" setc INTM"); // 禁止所有中断
*SCSR1=0x81FE; // CLKIN=6M,CLKOUT=4*CLKIN=24M
*WDCR=0x0E8; // 不使能看门狗,因为SCSR2中的WDOVERRIDE
// 即WD保护位复位后的缺省值为1,故可以用
// 软件禁止看门狗
*IMR=0x0000; // 禁止所有中断
*IFR=0x0FFFF; // 清除全部中断标志,"写1清0"
*MCRA=*MCRA&0x0FF; // IOPB端口配置为一般的I/O功能, TMS320LF240x的
// 端口均为8位,MCRA为16位因此控制了IOPA,
// 和IOPB的设置
*PBDATDIR=*PBDATDIR|0x0FF00; // IOPB端口设置为输出方式
*MCRC=*MCRC&0X0FBFF; // 把IOPF2端口配置为一般I/O端口
*PBDATDIR=*PBDATDIR&0x0FF00; // 熄灭全部的LED灯
*PFDATDIR=*PFDATDIR|0x0404; // IOPF2 设置为输出方式,且IOPF2=1
*PFDATDIR=*PFDATDIR&0x0FFFB; // IOPF2=0
// 以上的操作产生一个脉冲,使LED全部熄灭
}
// 主程序
main()
{
int led; // 定义一个局部变量
int i,k; // 定义其它一些临时变量
initial( ); // 系统初始化
while(1)
{
for(led=0x0080,i=0;i<8;led=led>>1,i++)
{
*PBDATDIR=*PBDATDIR&0x0FF00;// 首先屏蔽IOPB的各位
*PBDATDIR=*PBDATDIR|led; // 把需要显示的值赋给IOPB端口
*PFDATDIR=*PFDATDIR|0x0404; // IOPF2 设置为输出方式,且IOPF2=1
*PFDATDIR=*PFDATDIR&0x0FFFB;// IOPF2=0,这两句语句给一个脉冲,
// 使LED上显示IOPB端口的值
for(k=0;k<0x0ffff;k++)
k=k; // 为了保证显示时间,给一定时间的延时
}
}
}
// 直接返回中断服务程序
void interrupt nothing( )
{
return;
}
汇编程序
;I/O端口作为输出(追灯)
;(1) 主程序
IOSFT_REG .usect ".data0",1 ;要显示的数据寄存器
.include "F2407REGS.H" ;引用头部文件
.include "vector.h"
.def _c_int0
.text
_c_int0: ;相当于主程序的入口
CALL SYSINIT ;调系统初始化程序
LDP #DP_PF2 ;指向7080h~7100h区
LACL MCRA
AND #000FFH ;IOPB口配置为一般I/O功能
SACL MCRA
LACL MCRC
AND #0FBFFH ;IOPF2 配置为一般I/O功能
SACL MCRC
LACL PBDATDIR
OR #0FF00H ;IOPB口设置为输出方式
SACL PBDATDIR
LDP #5H ;指向0280h~0300h区
SPLK #01H,IOSFT_REG ;给显示的数据赋初值
LOOP: LDP #DP_PF2
LACL PFDATDIR
OR #0404H ;IOPF2 设置为输出方式,且IOPF2=1
SACL PFDATDIR ;开74HC273片选信号
LDP #5H
LACL IOSFT_REG
LDP #DP_PF2
OR #0FF00H
SACL PBDATDIR ;送要显示的数据到IOPB口
LACL PFDATDIR
AND #0FFFBH ;IOPF2=0 (应该使能显示)
SACL PFDATDIR ;关74HC273片选信号
CALL DELAY ;调延时程序
LDP #5H
LACL IOSFT_REG
SFL ;左移一位
SACL IOSFT_REG
BIT IOSFT_REG,BIT8 ;判是否循环完一次,即已点亮第8个发光二极管
BCND LOOP1, TC
B WAIT
LOOP1: LDP #5H
SPLK #01H,IOSFT_REG ;如循环完一次则显示数据赋初值
WAIT: NOP
B LOOP
;(2) 系统初始化程序
SYSINIT:
SETC INTM
CLRC SXM
CLRC OVM
CLRC CNF ;B0 被配置为数据存储空间
LDP #0E0H
SPLK #81FEH, SCSR1 ;CLKIN=6 M,CLKOUT=24 M
SPLK #0E8H,WDCR ;不使能WDT
LDP #0
SPLK #0000H,IMR ;不使能
SPLK #0FFFFH,IFR ;清全部中断标志
RET
;(3) 软件延时程序
DELAY:
MAR *, AR4
LAR AR4, #0FFFEH
LAR AR0, #00H
DELAY1: SBRK #1
NOP
CMPR 00
BCND DELAY1, NTC
RET
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论