📄 ect.c
字号:
#include "includes.h"
// 当检测到上升或下降边的时候执行的函数
void (*PAI_FUNC)(void) = NULL;
// 当PACN3溢出的时候执行的函数
void (*PAOVI_FUNC)(void) = NULL;
INT32U TimeLevel = 0;
INT32U CarDistance = 0;
//static INT16U DisNum = 0;
INT16U CurrentTime = 0;
INT16U tc1_counter = 0;
INT16U tc1_counter2 = 0;
INT16U tc1_counter3 = 0;
INT16U tc3_counter = 0;
INT16U tc3_counter2 = 0;
INT16U TimeCount3 = 40;
INT8U AngleFlag = OFF;
INT32S CarLocation = 0;
INT8U MDirect = Front;
INT8U CarStop = ON;
INT8U StopTime = 0x00;
INT32U TempLocation;
INT16U Burst = 0 ;
INT32U TimeLevel2 = 0;
INT32U TimeLevel3[100] ;
INT16U DebugAngle[800];
INT16U DebugNum = 0;
/***********************************************************************************/
/*void test_tc1_func(void) {
PORTB++;
//REV_BYTE(PORTB);
} */
void Test_PAI_FUNC() {
// 所得的值放在PACN2 & PACN3 中
PORTB = PACN3 ;
}
void Test_PAOVI_FUNC() {
PORTB = 0xAA;
}
void ECT_Func(void) {
/*************************************** //使用TC1做输出,使用中断方式
DDRB = 0xFF;
PORTB = 0xaa;
InitTC1(test_tc1_func);
StartTC1();
//Wait(2010);
//StopTC1();
****************************************/
/*************************************** //使用TC3做输入,脉冲累加,使用中断方式
DDRB = 0xFF;
PORTB = 0xA5;
PAI_FUNC = Test_PAI_FUNC;
//PAOVI_FUNC = Test_PAOVI_FUNC;
InitTC3();
****************************************/
INT8U LcdECT[] = {"Now Display the Function Of ECT "};
DDRB = 0xFF;
PORTB = 0xA5; //使用PA(也就是TC7引脚)做16bit的脉冲累加,使用中断方式,需要计算出高或者低电平的时间
PAI_FUNC = Test_PAI_FUNC;
//PAOVI_FUNC = Test_PAOVI_FUNC;
InitPA();
InitTOF();
ClearPA();
StartPA();
for(;;) {
LcdWriteAll(LcdECT); //display PWM menu
while (KeyFlag == ON) {
KeyFlag = OFF;
if (ValueKey == Exit) return; //if have exit key,go back
}
}
}
/***********************************************************************************
Timer Input Capture/Output Compare
***********************************************************************************/
/***********************************************************************************
定时器模块1 用作输出比较 产生一定周期的中断事件
************************************************************************************/
//INT16U tc1_counter = 0;
//INT16U CurrentTime = 0;
// 当时间到的时候所执行的函数指针
void (* TC1OC_FUNC)(void) = NULL;
INT8U Tc105Flag = ON;
#pragma CODE_SEG __NEAR_SEG NON_BANKED
ISR TC1_ISR(void) {// 3 * 53333 产生一个 约20ms的中断
if(++tc1_counter == 400) { //40为0.1秒 //400为1秒
tc1_counter = 0;
CurrentTime++;
}
if(++tc1_counter2 >= 40) { //40为0.1秒 //400为1秒
// DebugAngle[0] = ReadADC(0);
if (Tc105Flag == ON) { tc1_counter2 = 0;TempLocation = CarLocation ;Tc105Flag = OFF;}
else {
tc1_counter2 = 0;
if (CarLocation == TempLocation) {CarStop = ON;}
else {CarStop = OFF;}
Tc105Flag = ON;
}
}
/* if(++tc1_counter3 >= 4)
{
tc3_counter = 0;
DebugAngle[DebugNum] = ReadADC(0);
DebugNum ++;
if (DebugNum == 790) {
FOREVER();
}
} */
TFLG1_C1F = 1; // 清除标志
//TFLG2_TOF = 1;
// TC1 -= 12202;//相当于:
//TC1 = 0;
TC1 += 60000;
}
/****************************************/
#pragma CODE_SEG DEFAULT
void InitTC1(void) {
EnableInterrupts;
tc1_counter = 0;
//TC1OC_FUNC = tc1oc_func;
TIOS_IOS1 = 1;// 设为输出比较
//TCTL2_OL1 = 0;//
//TCTL2_OM1 = 0;
TFLG1_C1F = 1;// 先置标,StartTCx后在开始
TSCR1_TEN = 1;// 使能计时器
// FOREVER();
}
/*****************************************/
void StartTC1(void) {
TFLG1_C1F = 0;//清除标志
//TSCR2_TOI = 1;
TIE_C1I = 1;//使能中断
}
/***************************************/
void StopTC1(void) {
TFLG1_C1F = 1;//清除标志
TIE_C1I = 0;//禁用中断
}
/****************************************/
/******************************************************************************
hPA.c
脉冲累加计数器----8bit
******************************************************************************/
INT16U EqualAngle = 625;
INT8U EqualFlag = 0;
INT16U TempAngle1 = 0;
INT16U TempAngle2 = 0;
INT16U TempAngle3 = 0;
INT16U EqualAccess = 0;
INT16U UpFlag = 0;
//BalanceAngle 是水平值,开机检测
#pragma CODE_SEG __NEAR_SEG NON_BANKED
ISR TC3_ISR(void) {
/*if(PAI_FUNC != NULL) {
PAI_FUNC();
//if (PORTB = 0xff) PORTB = 0;
//TCTL4_EDG3A = 1; //检测下降沿
//TCTL4_EDG3B = 1;
TFLG1_C3F = 1;
} */
AngleFlag = OFF;
if(++tc3_counter >= TimeCount3) { //40为0.1秒 //400为1秒
tc3_counter = 0;
AngleFlag = ON;
}
//ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
TFLG1_C2F = 1; // 清除标志
//TFLG2_TOF = 1;
// TC1 -= 12202;//相当于:
//TC1 = 0;
TC2 = 0;
TC2 += 60000;
// FOREVER();
}
/***************************************/
#pragma CODE_SEG DEFAULT
void StartTC3(void) {
TFLG1_C2F = 0;//清除标志
//TSCR2_TOI = 1;
TIE_C2I = 1;//使能中断
}
/***************************************/
void StopTC3(void) {
TFLG1_C2F = 1;//清除标志
TIE_C2I = 0;//禁用中断
}
/******************************/
//TC3脉冲输入捕获初始化
/* 初始化脉冲累加计数器 */
void InitTC3(){
// EnableInterrupts;
/*TSCR1_TEN = 1;
TIE_C3I = 1;
TCTL4_EDG3A = 1;
TCTL4_EDG3B = 0;
ICPAR_PA3EN = 1; */
EnableInterrupts;
tc3_counter = 0;
//TC1OC_FUNC = tc1oc_func;
TIOS_IOS2 = 1;// 设为输出比较
//TCTL2_OL1 = 0;//
//TCTL2_OM1 = 0;
TFLG1_C2F = 1;// 先置标,StartTCx后在开始
TSCR1_TEN = 1;// 使能计时器
}
/************************************************************************************
PACB.c
16bit的输入捕获 使用TC7口
************************************************************************************/
INT8U PaFlag = 0 ;
INT8U NumTCNT = 0;
INT16U Temp1TCNT = 0;
INT16U Temp2TCNT = 0;
/******************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
ISR PAI_ISR(void) {
//if(PAI_FUNC != NULL) {
// PAI_FUNC();
Temp1TCNT = TCNT; //store the TCNT value immediately
if (PaFlag == 0) {PACTL_PEDGE = 1;PaFlag = 1;Temp2TCNT = Temp1TCNT; NumTCNT = 0; }
else {
PACTL_PEDGE = 0;
PaFlag = 0;
if (Temp1TCNT > Temp2TCNT) { TimeLevel = (NumTCNT * 65536 + (Temp1TCNT - Temp2TCNT));}
else if (Temp1TCNT == Temp2TCNT) { TimeLevel = NumTCNT * 65536;}
else {
NumTCNT -= 1;
TimeLevel2 = TimeLevel;
TimeLevel = (NumTCNT * 65536 + (65535 - Temp2TCNT + Temp1TCNT));
}
NumTCNT = 0;
}
//TimeLevel3[DebugNum] = TimeLevel;
// DebugNum++;
// if (DebugNum == 99) DebugNum = 0;
//if (PAC == 0xFFFF) {DisNum++;PAC = 0;}
//CarDistance = ((DisNum * 65536) + PAC) ;
//ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
/* if(SmartOver == ON)
{
//if (TimeLevel < TimeLevel2){
if (TimeLevel < 45000) {
StopMoto();
//SmartMoto(-20);
DDRB = 0xFF;
PORTB = 0xFD;
SmartOver = OFF;
}
} */
//}
//ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
CarDistance++;
if (MDirect==Front) CarLocation++;
else { CarLocation--;}
// 注意:要清楚标志位
PAFLG_PAIF = 1;
}
/******************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
ISR PAOVI_ISR(void) {
if(PAOVI_FUNC != NULL) {
PAOVI_FUNC();
}
PAFLG_PAIF = 1;
}
/******************************************/
#pragma CODE_SEG DEFAULT
/* 初始化脉冲累加计数器 */
void InitPA(){
EnableInterrupts;
// 打开默认设置的中断
PACTL = PACTL_DEFAULT;
// PACTL_PAMOD = 0;
// PACTL_PEDGE = 0;
}
/************************************************************************************
TOF.c
16bit总定时器,当TCNT溢出,发生中断
************************************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
ISR TOF_ISR(void) {
NumTCNT++;
TFLG2_TOF = 1;
}
/****************************************/
#pragma CODE_SEG DEFAULT
void InitTOF() {
TSCR1_TEN = 1;
TSCR2_TOI = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -