/******************************************************************/
/*Copyright (C), 2008-2009, 力天电子,LiTian Tech.Co.Ltd. */
/* Module Name : */
/* File Name : main.c */
/* Author : 侯长波 */
/* Create Date : 2010/4/4 */
/* Version : 1.0 */
/* Function : 采用事件管理器驱动步进电机 */
/* Description : */
/* Support : www.LT430.com */
/******************************************************************/
/*****************头文件********************/
#include "DSP281x_Device.h"
#include "System.h"
#include "DSP281x_Ev.h"
#include "DSP281x_GlobalPrototypes.h"
interrupt void CAPINT1_ISR(void);
void Init_EVA(void);
void Init_GPIO(void);
void Display(float temp);
// Uint16 number ;
Uint16 phase2;
Uint16 num;
/***************全局变量定义****************/
//interrupt void CAPINT1_ISR(void);
/****************端口宏定义*****************/
#define IN3_DAT GpioDataRegs.GPADAT.bit.GPIOA2 //PWM3
#define IN3_DIR GpioMuxRegs.GPADIR.bit.GPIOA2
#define DUAN_DIR GpioMuxRegs.GPFDIR.bit.GPIOF0
#define duan GpioDataRegs.GPFDAT.bit.GPIOF0
#define WEI_DIR GpioMuxRegs.GPFDIR.bit.GPIOF1
#define wei GpioDataRegs.GPFDAT.bit.GPIOF1
#define LED_DIR GpioMuxRegs.GPBDIR.all
#define LED_DAT GpioDataRegs.GPBDAT.all
const char LEDData[]=
{
0x003F,0x0006,0x005b,0x004f,0x0066,0x006d,0x007d,0x0007,0x007f,0x006f
};
const char weixuan[]=
{
0x0004,0x0008,0x0010,0x0020
};
/****************常量宏定义*****************/
void DelayMS(int ms)
{
unsigned char i;
while(ms--)
{
for(i=0;i<20;i++);
}
}
/*------------------------------------------*/
/*形式参数:void */
/*返回值:void */
/*函数描述:主函数 */
/*------------------------------------------*/
void main(void)
{
InitSysCtrl(); // 系统初始化子程序,在DSP28_sysctrl.c中 /99
DINT; // 关总中断
IER=0x0000; //清除所有中断
IFR=0x0000; //清除所有中断标志位
InitPieCtrl(); //初始化Pie控制寄存器
InitPieVectTable(); //初始化PIE中断向量表
InitSysCtrl(); // 系统初始化子程序,在DSP28_sysctrl.c中 /99
Init_EVA();
Init_GPIO();
EALLOW;
PieVectTable.CAPINT1=&CAPINT1_ISR;
EDIS;
PieCtrlRegs.PIEIER3.all=M_INT5; // enable interrupt 3.5 for capture1
IER|=M_INT3;//enable cpu interrupt 3. phase2/100.0
EINT;
ERTM; //open all interrupt
//EvaRegs.T2CON.bit.TENABLE=1; //enable timer1
while(1)
{
Display(EvaRegs.CAP1FBOT/100.0);
DelayMS(50);
}
}
void Init_GPIO(void)
{
EALLOW;
GpioMuxRegs.GPBMUX.all=0x0000;
GpioMuxRegs.GPFMUX.all=0x3F00;
// GpioMuxRegs.GPAMUX.all=0xFF00;
GpioMuxRegs.GPAMUX.bit.CAP1Q1_GPIOA8=1;
GpioMuxRegs.GPAMUX.bit.CAP2Q2_GPIOA9=1;
GpioMuxRegs.GPAMUX.bit.PWM3_GPIOA2=0;
// CAP1_DIR=1;
// CAP2_DIR=1;
IN3_DIR=0;
DUAN_DIR=1; //设置为输出
WEI_DIR=1;
LED_DIR=0xFFFF;
EDIS;
duan=0;
wei=0;
LED_DAT=0x0000;
}
/*------------------------------------------*/
/*形式参数:void */
/*返回值:void */
/*函数描述:初始化事件管理器A */
/*------------------------------------------*/
void Init_EVA(void)
{
//此段是用来设置引脚为复用功能
EvaRegs.T2CON.bit.TMODE=2; //连续增计数模式
EvaRegs.T2CON.bit.TPS=5; //进行64分频
EvaRegs.T2CON.bit.TENABLE=0; //暂时禁止T2的计数操作
EvaRegs.T2CON.bit.TCLKS10=0; //使用内部时钟
EvaRegs.T2PR=0xFFFF; //给T2定时器设终值
EvaRegs.T2CNT=0x0000; //设置计数初值为0
EvaRegs.CAPCONA.all=0x0000; //初始化捕获控制寄存器
EvaRegs.CAP1FIFO=0x0000; //CAP1FIFO为空
EvaRegs.CAPCONA.bit.CAP12EN=1; //使能捕获1、2功能
EvaRegs.CAPCONA.bit.CAP12TSEL=0; //设置捕获单元1的定时器
EvaRegs.CAPCONA.bit.CAP1EDGE=1; //检测上升沿
//EvaRegs.CAPCONA.bit.CAP2EDGE=1;
EvaRegs.EVAIFRC.bit.CAP1INT=1; //清除捕获单元1的捕获中断标志位
EvaRegs.EVAIMRC.bit.CAP1INT=1; //使能捕获单元1的捕获中断
//EvaRegs.EVAIFRC.bit.CAP2INT=1; //清除捕获单元2的捕获中断标志位
//EvaRegs.EVAIMRC.bit.CAP2INT=1; //使能捕获单元2的捕获中断
EvaRegs.T2CON.bit.TENABLE=1; //enable timer1
// EvaRegs.CAPCONA.bit.CAP12EN=1; //enable cap1 cap2
EvaRegs.CAPFIFOA.all=0x0200;
}
/*------------------------------------------*/
/*形式参数:void */
/*返回值:void */
/*函数描述:扫描键值 */
/********************************************/
interrupt void CAPINT1_ISR(void)
{
EvaRegs.EVAIFRC.bit.CAP1INT=1; //清除中断标志位
num=EvaRegs.CAP1FIFO;
phase2=EvaRegs.CAP1FBOT;
//EvaRegs.CAP1FIFO=0;
PieCtrlRegs.PIEACK.bit.ACK3=1; //清中断标志 以接收新的中断。
EINT; //开全局中断
// 中断返回
// Display(phase2/35000.0);
}
void Display(float d)
//数码管任意数显式,
{
int t; char i;
if (0.0<d&&d<10.0) // 0<d<1.000 {
{
t=d*1000; i=0; //t=d*1000表示小数点移位,把float类型转换成int类型,具体移动多少位有语句if (0<d&&d<10) 判断
} //i的值为小数点显示的位置。
if (10.0<d&&d<100.0)
{
t=d*100; i=1;
}
if (100.0<d&&d<1000.0)
{
t=d*10; i=2;
}
if(1000.0<d&&d<10000.0)
{
t=d*1; i=3;
}
// LED_DAT=0x00FF;
wei=1;
LED_DAT =~weixuan[0]; //while(1)中的语句为一般的数码管显示方法 故不作详细注解。
wei=0;
duan=1; //第一位数码管显示
LED_DAT = LEDData[t/1000];
duan=0;
DelayMS(50);
// LED_DAT=0x00FF;
wei=1;
LED_DAT =~weixuan[1];
wei=0;
duan=1;
LED_DAT = LEDData[t%1000/100]; //第二位数码管显示
duan=0;
DelayMS(50);
// LED_DAT=0x00FF;
wei=1;
LED_DAT =~weixuan[2];
wei=0;
duan=1;
LED_DAT = LEDData[t/10%10]; //第三位数码管显示
duan=0;
DelayMS(50);
//LED_DAT=0x00FF;
wei=1;
LED_DAT =~weixuan[3];;
wei=0;
duan=1;
LED_DAT = LEDData[t%10]; //第四位数码管显示
duan=0;
DelayMS(50);
// LED_DAT=0x00FF;
wei=1;
LED_DAT =~weixuan;
wei=0;
duan=1;
LED_DAT =0x80; // 小数 点显示
duan=0;
DelayMS(50);
}
哪位高手帮我看下这个程序 显示部分没有问题,就是CAP1中FIFO的数值读取不出来 显示不了 |