返回介绍

实验三 追灯式电路控制

发布于 2023-05-14 20:35:30 字数 5115 浏览 0 评论 0 收藏 0

一.实验说明

输入/输出端口(简称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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文