#include "tof.h"
#include "type.h"
#include "msp430f5529.h"
//ehco: p2.3 trig3 p3.7
#define Trig3(a) if(a==1) P3OUT |= BIT7; else P3OUT &= ~BIT7 // 第一路 trig1 p3.7
unsigned int cap_new = 0; // 首次捕捉的ta0r值
unsigned int cap_old = 0; // 二次捕捉的ta0r值
char cap_N = 0; // 溢出次數(shù)
char state = 0x00; // 狀態(tài)
unsigned int cap_data1 = 0; // 距離值
unsigned int HC_TRIG_Flag = 0;
void TA2_INIT(void)//TA2中斷初始化
{
TA2CCTL0 = CCIE; // 啟用TA0CCR0 中斷,當計數(shù)器的值
TA2CCR0 = 16384;
TA2CTL = TASSEL_1 + MC_1 + TACLR; // ACLK, upmode, clear TAR
}
void Hc_sr_Init(void)
{
P3OUT &= ~BIT7;//3.7接收
P3DIR |= BIT7;
P2OUT &= ~BIT3;//2.3初始化為高電平
P2DIR |= BIT3;//初始方向輸出
// P2OUT |= BIT3;
// P2SEL |=BIT3;
/*
*由于選用的是P1.2 根據(jù)端口定義可知,使用的是TA0CCR1,捕獲輸入引腳通過TA0CCTL1寄存器控制,
*-捕獲值存儲在TA0CCR1中。
*/
TA2CTL = TASSEL__SMCLK + ID__8 + MC_2 + TACLR + TAIE;//SMCLK,4mhz/8分頻,連續(xù)計數(shù)模式,清除TAR計數(shù)器,中斷使能
TA2CCTL0 = CM_2 + SCS +CAP + CCIE + CCIS_0;//在上升沿捕獲,CCR1工作于捕獲模式,上升沿觸發(fā),CCI3A輸入
}
void Hc_sr_Open(void) //生成一個持續(xù)10us的高電平
{
// P3OUT ^= BIT7;
// __delay_cycles(100);
Trig1(1);
__delay_cycles(40);//單位為us?
Trig1(0);
__delay_cycles(100);
}
#pragma vector=TIMER2_A0_VECTOR //TA1定時器中斷向量
__interrupt void TIMER2_A0_ISR(void)//聲明中斷服務程序
{
switch(__even_in_range(TA2IV,14))//中斷向量查詢
{
case 0:break; // 無中斷
case 2:break;
case 4:
{
// state = TA0CCTL2 >> 14;
TA2CCTL0 &= ~CCIFG; //清除中斷標志位
if( TA2CCTL0 & CM_1) //上升沿
{
cap_new = TA2CCR0; //上升沿的計數(shù)值
TA2CCTL0 &= ~CM_1;
TA2CCTL0 |= CM_2; //改為下降沿捕獲
}else if ( TA2CCTL0 & CM_2) //下降沿
{
cap_old = TA2CCR0; //下降沿的計數(shù)值
cap_data1 = ( cap_old - cap_new ) * 0.34;//計算出距離值
// UARTprintf("\n\ncap_data2: %u mm",cap_data);
TA2CCTL0 &= ~CM_2;
TA2CCTL0 |= CM_1; //改為上升沿捕獲
}
break; // TA0CCR2 中斷服務程序
}
case 6:
break;
case 8: break; // TA0CCR4 中斷服務程序
case 10: break; // TA0CCR5 中斷服務程序
case 12: break; // TA0CCR6 中斷服務程序
case 14:
TA2CTL &= ~TAIFG; //TAIFG中斷
if(cap_old < cap_new ){
cap_N += 1;
}
break; // overflow
default: break;
}
}
//// Timer1 A0 中斷服務函數(shù)
//#pragma vector=TIMER1_A0_VECTOR
//__interrupt void Timer1_A0(void)
//{
//
// TA1CCTL0 &= ~CCIFG;
// HC_TRIG_Flag = 1;
//
//// UARTprintf("\rcap_data1: %u mm cap_data2: %d mm cap_data3: %d mm ",cap_data1,cap_data2,cap_data3);
//
// P1OUT ^= 0x01; // P1.0 翻轉
//}
////我們選用的是P1.2, 根據(jù)端口定義,使用的是TA0CCR1,捕獲輸入引腳通過TA0CCTL1寄存器控制,捕獲值存儲在TA0CCR1中。
//// TASSEL(時鐘源選擇):SMCLK; ID分頻(下面介紹):(這里分頻系數(shù)會影響后面計算)4MHz/8 = 500k;計數(shù)模式:0 ==> 0xFFFF; 定時器清零位 ;中斷使能。
//// TA0CCTL1:上升沿捕獲 ;同步捕捉;捕獲模式;中斷使能;CCI1A輸入。
//
////這里其實就是復用P1.2口為捕獲,通過P1.3發(fā)出一個10us的高電平給超聲波TRIG口觸發(fā)進行測距,模塊內部就返回一個信號,P1.2就捕獲一個返回的高電平持續(xù)時間,再計算得出距離
////公式:s=高電平持續(xù)時間*聲速340/2(因為上面分頻采用了8分頻,因此我下面計算就不用除以2)
//
//#define Trig1(a) if(a==1) P1OUT |= BIT3; else P1OUT &= ~BIT3
//
//unsigned int cap_new = 0; // 首次捕捉的ta0r值
//unsigned int cap_old = 0; // 第二次捕捉的ta0r值
//
//char cap_N = 0; // 溢出次數(shù)
//char state = 0x00; // 狀態(tài)
//unsigned short cap_data=0 ; // 距離值,u16
//
//uint8_t HC_TRIG_Flag = 0;
//void TA1_INIT(void)
//{
// TA1CCTL0 = CCIE; // 啟用TA0CCR0 中斷,當計數(shù)器的值
// TA1CCR0 = 16384;
// TA1CTL = TASSEL_1 + MC_1 + TACLR; // ACLK, upmode, clear TAR
//}
//
//void Hc_sr_Init(void)
//{
//
// P1OUT &= ~( BIT2 + BIT3 );//1.2,1.3均設置為拉高
// P1DIR |= BIT3;
// P1SEL |= BIT2;//選中其為特殊功能
//
// TA0CTL = TASSEL__SMCLK + ID__8 + MC_2 + TACLR + TAIE;////SMCLK,4mhz/8分頻,連續(xù)計數(shù)模式,清除TAR計數(shù)器,中斷使能
// TA0CCTL1 = CM_1 + SCS +CAP + CCIE + CCIS_0;//捕獲輸入引腳通過TA0CCTL1寄存器控制,捕獲值存儲在TA0CCR1中。
//}
//
//void Hc_sr_Open(void) //生成一個持續(xù)10us的高電平
//{
//// Trig1(1);//這里就是把P1.2置1,即P1OUT |= BIT2
//// __delay_cycles(160);//這里我把系統(tǒng)時鐘升為25MHZ,因此250/25000000=10us
//// Trig1(0);//置0
// Trig1(1);
// delay_us(40);
// Trig1(0);
// delay_ms(100);
//}
//
//
//#pragma vector=TIMER0_A1_VECTOR
//__interrupt void TIMER0_A1_ISR(void)
//{
//
// switch(__even_in_range(TA0IV,14))//采用這個range函數(shù)就是為了使switch函數(shù)效率高
// {
// case 0:break; // No interrupt
// case 2:
// state = TA0CCTL1 >> 14;
// TA0CCTL1 &= ~CCIFG;//標志位清零
// if( TA0CCTL1 & CM_1){//開始捕獲高電平時間
// cap_new = TA0CCR1;
// TA0CCTL1 &= ~CM_1;
// TA0CCTL1 |= CM_2;
// }else if ( TA0CCTL1 & CM_2){
// cap_old = TA0CCR1;
// cap_data = ( cap_old - cap_new ) * 0.34/10/6.25;//計算距離公式
//// Gui_DrawFont_Num32(10,50,BLUE,GRAY0,cap_data/100);//顯示數(shù)字
//// Gui_DrawFont_Num32(37,50,BLUE,GRAY0,cap_data/10%10);
//// Gui_DrawFont_Num32(64,50,BLUE,GRAY0,cap_data%10);
//
// TA0CCTL1 &= ~CM_2;
// TA0CCTL1 |= CM_1;
// }else
// break; // CCR1 not used
// case 4: break; // CCR2 not used
// case 6: break; // reserved
// case 8: break; // reserved
// case 10: break; // reserved
// case 12: break; // reserved
// case 14:
// TA0CTL &= ~TAIFG;
// if(cap_old < cap_new ){
// cap_N += 1;
// }
// break; // overflow
// default: break;
// }
//}
|