飞思卡尔单片机ECT问题
时间:10-02
整理:3721RD
点击:
我ECT的通道0接8赫兹的TTL电平,通道1接768赫兹的TTL电平,中断设为上升沿触发,可是通道1的sum_ut和sum_ua在interrupt 8里串口发送时变成0了,而且不给TTL电平,还是一直在发送数据,这是为什么?当我给TTL电平的时候,它不进interrupt 9的中断,这是为什么啊?
做了好长时间都不行,请各位帮帮忙,万分感谢!
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define BUS_CLOCK 32000000 //总线频率
#define OSC_CLOCK 16000000 //晶振频率
#define BAUD 9600
#define U PTT_PTT0
#define V PTT_PTT1
#define W PTT_PTT2
#define Z PTT_PTT3
unsigned int sum_ut,sum_ua,sum_zt=0,sum_za=0;
unsigned int ut[9],ua[9],angle[3];
unsigned int a=0,b=0,c=0,d=0,e=0,f=0,g=0,i,j;
unsigned char *send,data_receive;
/*************************************************************/
/* 初始化锁相环 */
/*************************************************************/
void INIT_PLL(void)
{
CRGINT = 0; //关中断
CLKSEL_PLLSEL = 0; //在未初始化PLL前不使用PLL的输出作为CPU时钟
#if(BUS_CLOCK == 40000000)
SYNR = 4;
#elif(BUS_CLOCK == 32000000)
SYNR = 3;
#elif(BUS_CLOCK == 24000000)
SYNR = 2;
#endif
REFDV = 1; //PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=64MHz ,fbus=32M
PLLCTL_PLLON = 1; //开PLL
while (CRGFLG_LOCK == 0); //等待PLL锁定频率
CLKSEL_PLLSEL = 1; //选择系统时钟由PLL产生
}
/************************************************************/
/* 初始化ECT模块 */
/************************************************************/
void initialize_ect(void)
{
TSCR1 = 0x80; // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)
TIOS = 0x00; //指定通道0为输入捕捉方式
TCTL3 = 0x00;
TCTL4 = 0x95; // 设置通道0为捕捉上升沿方式
PACTL = 0x00; // PAC2和PAC3级联,1代表级联
TIE = 0xff; // 允许通道0定时中断
TSCR2 = 0x07; // 预分频系数pr2-pr0:111,时钟周期为4us,
TFLG1 = 0xff; // 清除各IC/OC中断标志位
TFLG2 = 0xff; // 清除自由定时器中断标志位
}
/*************************************************************/
/* 初始化SCI */
/*************************************************************/
void INIT_SCI(void)
{
SCI0BD = BUS_CLOCK/16/BAUD; //设置SCI0波特率为9600
SCI0CR1 = 0x00; //设置SCI0为正常模式,八位数据位,无奇偶校验
SCI0CR2 = 0x2c; //允许发送数据,允许发送中断功能
}
/*************************************************************/
/* 串口发送函数 */
/*************************************************************/
void SCI_send(unsigned int data)
{
while(!SCI0SR1_TDRE); //等待发送数据寄存器(缓冲器)为空
SCI0DRL = data;
}
/*************************************************************/
/* 串口接收函数 */
/*************************************************************/
unsigned char SCI_receive(void)
{
while(!SCI0SR1_RDRF); //等待发送数据寄存器满
return(SCI0DRL);
}
/*************************************************************/
/* 串口中断发送字符串函数 */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 8 capture0(void)
{
TFLG1_C0F = 1;
if(a<9)
{
ut[a++]=sum_ut;
ua[b++]=sum_ua;
sum_ut=0;
sum_ua=0;
}
if(a==9)
{
for(i=1;i<9;i++)
{
SCI_send(ut[i]);
SCI_send(ua[i]);
}
a=0;
}
}
void interrupt 9 capture1(void)
{
TFLG1_C4F = 1; //速度信号
if(U==1)
sum_ut++;
if(U==0)
sum_ua++;
}
#pragma CODE_SEG DEFAULT
/*************************************************************/
/* 主函数 */
/*************************************************************/
void main(void) {
DisableInterrupts;
INIT_PLL();
INIT_SCI();
initialize_ect();
EnableInterrupts;
for(;;)
{
}
}
做了好长时间都不行,请各位帮帮忙,万分感谢!
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define BUS_CLOCK 32000000 //总线频率
#define OSC_CLOCK 16000000 //晶振频率
#define BAUD 9600
#define U PTT_PTT0
#define V PTT_PTT1
#define W PTT_PTT2
#define Z PTT_PTT3
unsigned int sum_ut,sum_ua,sum_zt=0,sum_za=0;
unsigned int ut[9],ua[9],angle[3];
unsigned int a=0,b=0,c=0,d=0,e=0,f=0,g=0,i,j;
unsigned char *send,data_receive;
/*************************************************************/
/* 初始化锁相环 */
/*************************************************************/
void INIT_PLL(void)
{
CRGINT = 0; //关中断
CLKSEL_PLLSEL = 0; //在未初始化PLL前不使用PLL的输出作为CPU时钟
#if(BUS_CLOCK == 40000000)
SYNR = 4;
#elif(BUS_CLOCK == 32000000)
SYNR = 3;
#elif(BUS_CLOCK == 24000000)
SYNR = 2;
#endif
REFDV = 1; //PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=64MHz ,fbus=32M
PLLCTL_PLLON = 1; //开PLL
while (CRGFLG_LOCK == 0); //等待PLL锁定频率
CLKSEL_PLLSEL = 1; //选择系统时钟由PLL产生
}
/************************************************************/
/* 初始化ECT模块 */
/************************************************************/
void initialize_ect(void)
{
TSCR1 = 0x80; // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)
TIOS = 0x00; //指定通道0为输入捕捉方式
TCTL3 = 0x00;
TCTL4 = 0x95; // 设置通道0为捕捉上升沿方式
PACTL = 0x00; // PAC2和PAC3级联,1代表级联
TIE = 0xff; // 允许通道0定时中断
TSCR2 = 0x07; // 预分频系数pr2-pr0:111,时钟周期为4us,
TFLG1 = 0xff; // 清除各IC/OC中断标志位
TFLG2 = 0xff; // 清除自由定时器中断标志位
}
/*************************************************************/
/* 初始化SCI */
/*************************************************************/
void INIT_SCI(void)
{
SCI0BD = BUS_CLOCK/16/BAUD; //设置SCI0波特率为9600
SCI0CR1 = 0x00; //设置SCI0为正常模式,八位数据位,无奇偶校验
SCI0CR2 = 0x2c; //允许发送数据,允许发送中断功能
}
/*************************************************************/
/* 串口发送函数 */
/*************************************************************/
void SCI_send(unsigned int data)
{
while(!SCI0SR1_TDRE); //等待发送数据寄存器(缓冲器)为空
SCI0DRL = data;
}
/*************************************************************/
/* 串口接收函数 */
/*************************************************************/
unsigned char SCI_receive(void)
{
while(!SCI0SR1_RDRF); //等待发送数据寄存器满
return(SCI0DRL);
}
/*************************************************************/
/* 串口中断发送字符串函数 */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 8 capture0(void)
{
TFLG1_C0F = 1;
if(a<9)
{
ut[a++]=sum_ut;
ua[b++]=sum_ua;
sum_ut=0;
sum_ua=0;
}
if(a==9)
{
for(i=1;i<9;i++)
{
SCI_send(ut[i]);
SCI_send(ua[i]);
}
a=0;
}
}
void interrupt 9 capture1(void)
{
TFLG1_C4F = 1; //速度信号
if(U==1)
sum_ut++;
if(U==0)
sum_ua++;
}
#pragma CODE_SEG DEFAULT
/*************************************************************/
/* 主函数 */
/*************************************************************/
void main(void) {
DisableInterrupts;
INIT_PLL();
INIT_SCI();
initialize_ect();
EnableInterrupts;
for(;;)
{
}
}
你的问题解决了吗?我也遇到同样的问题