智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2126|回复: 4
打印 上一主题 下一主题

[编程类] 用ECT写的超声模块 ,不知道中断和溢出怎么写 ,望高手指教!!!!!

[复制链接]

1

主题

84

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1093
威望
493
贡献
310
兑换币
288
注册时间
2014-10-16
在线时间
145 小时
跳转到指定楼层
1#
发表于 2015-1-3 13:54:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
3贡献
本帖最后由 l540391821 于 2015-1-3 13:54 编辑

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

#define TRING  PORTA_PA1    //控制端   
#define ECHO   PTT_PTT7    //接收端

unsigned int edgup,edgdown,time=0,pitflag=0,timflag=0,distance,count,dis;
unsigned char buf[6]={0};

//----------------------PLL初始化------------------------//
void PLL_init(void)//24M
{
CLKSEL=0X00; // 初始化PLL前先使用外部晶振
PLLCTL_PLLON=1; // 开启 PLL
SYNR =0x00 | 0x02; // pllclock=2*osc*(1+SYNR)/(1+REFDV)=48MHz;
REFDV=0x80 | 0x01;
POSTDIV=0x00;   //fPLL=fVOC
_asm(nop); // BUS CLOCK=24M
_asm(nop);            
while(!(CRGFLG_LOCK==1)); //等待PLL稳定
CLKSEL_PLLSEL =1; //fBUS采用根据PLL频率设定
}

void PIT_init(void)
{
  PITCFLMT_PITE = 0; //关闭PIT模块
  PITCE = 0X00;      //通道0 PIT模块禁止
  PITINTE = 0x01;    //通道0 中断使能
  PITMUX = 0x00;     //16位定时通道0使用0号8位微计数器,16位定时器1使用1号微计数器
  PITMTLD0 =240-1;   //8位定时器初值设定。240分频,在24MHzBusClock下,为0.1MHz。即10us.
  PITLD0 =10000-1;   //16位定时器初值设定,即定时100ms
  PITCE = 0X01;      //通道0 PIT模块使能     
  PITCFLMT_PITE = 1;
}

void ECT_init(void)
{
   TSCR1=0x00;     //关定时器
   TSCR2=0x80;     //允许溢出中断,不分频     周期 1/24M
   TIOS=0x00;      //PT7为输入捕捉
   TCTL3=0xC0;     //输入捕捉7上升沿和下降沿均有效               
   TIE_C7I=1;      //通道7输入捕捉中断允许     
   TCNT=0x00;      //初始自由计数器
   //PACTL=0X62;   //开脉冲累加器 高电平,总线时钟64分频 允许溢出
   //TSCR1=0x80;     //使能定时器
   // PACNT=0;
}
void IO_init(void)
{
  DDRA=0x02;    // A1输出
  /********************B口输出(0、1、2、3)**********************************/
  DDRB_DDRB0=1;     
  DDRB_DDRB1=1;
  DDRB_DDRB2=1;
  DDRB_DDRB3=1;
  /********************E、T口输出(0、1、2、3)**********************************/
  DDRE_DDRE2=1;
  DDRE_DDRE3=1;
  DDRT_DDRT0=1;
  DDRT_DDRT1=1;
  DDRT_DDRT2=1;
  DDRT_DDRT3=1;
  /***************(RDR寄存器)配置I/O口驱动能力(1:为减弱;0:正常输出)********************/
  RDRT_RDRT0=0;
  RDRT_RDRT1=0;
  RDRT_RDRT2=0;
  RDRT_RDRT3=0;

  /**********************输入*****************************************/
  DDRT_DDRT4=0;
  DDRT_DDRT5=0;

  /***************内部上拉********************/
  PPST_PPST4=0;
  PPST_PPST5=0;

  /***************内部上拉使能********************/
  PERT_PERT4=1;
  PERT_PERT5=1;
}

void PORT_Update(void) //数码管输出更新
{
   PORTE_PE2=1;
   PORTE_PE3=1;
   PTT_PTT0=1;
   PTT_PTT1=1;
   PTT_PTT2=1;
   PTT_PTT3=1;
}


void delay(int z)   //延时
{
        int x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}


void main(void)
{
  /* put your own code here */
  PLL_init();
  PIT_init();
  ECT_init();
  IO_init();
        EnableInterrupts;


  for(;;)
  { //TCFLMT_PITE = 1; //打开PIT模块
    if(pitflag==10)
    {//-------------触发10us的脉冲信号---------------//
      TRING=1;
      delay(10);
      TRING=0;

      while(!ECHO)
      {
        edgup=TCNT;
      }
      while(ECHO)
      {
        edgdown=TCNT;
        count=edgdown-edgup;
        distance=((340*(count+65535*timflag)/24000000)/2)*1000;
        dis=distance;
         buf[0]=dis%10;
         buf[1]=dis/10%10;
         buf[2]=dis/100%10;
         buf[3]=dis/1000%10;
         buf[4]=dis/10000%10;
         buf[5]=dis/100000;

        //TFLG1_C7F=1;
      }     
      pitflag=0;
    }

    PORT_Update();
    PORTB=PORTB&0XF0|buf[0];
    PTT_PTT0=0;
    delay(10);


    PORT_Update();
    PORTB=PORTB&0XF0|buf[1];
    PORTE_PE3=0;
    delay(10);


    PORT_Update();
    PORTB=PORTB&0XF0|buf[2];
    PORTE_PE2=0;
    delay(10);


    PORT_Update();
    PORTB=PORTB&0XF0|buf[3];
    PTT_PTT3=0;
    delay(10);


    PORT_Update();
    PORTB=PORTB&0XF0|buf[4];
    PTT_PTT2=0;
    delay(10);


    PORT_Update();
    PORTB=PORTB&0XF0|buf[5];
    PTT_PTT1=0;
    delay(10);

  } /* loop forever */
  /* please make sure that you never leave main */
}

#pragma CODE_SEG __NEAR_SEG NON_BANKED

void interrupt VectorNumber_Vpit0  PIT0(void)   //通道0
{
pitflag++;
PITTF_PTF0=1;  //清除PIT定时器0上的超时标志位,防止该位被挂起,为下一次中断发生做准备

}


void interrupt VectorNumber_Vtimch7 TIM7(void)
{

  TFLG2_TOF=1;   
  timflag++;

}
#pragma CODE_SEG DEFAULT

回复

使用道具 举报

1

主题

84

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1093
威望
493
贡献
310
兑换币
288
注册时间
2014-10-16
在线时间
145 小时
2#
 楼主| 发表于 2015-1-3 13:58:00 | 只看该作者
想要间隔一秒利用数码管显示结果,,,,,,,坐等高手指教。。。
回复

使用道具 举报

1

主题

84

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1093
威望
493
贡献
310
兑换币
288
注册时间
2014-10-16
在线时间
145 小时
3#
 楼主| 发表于 2015-1-3 14:31:03 | 只看该作者
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

#define TRING  PORTA_PA1    //控制端   
#define ECHO   PTT_PTT7    //接收端

unsigned int edgup,edgdown,time=0,pitflag=0,timflag=0,distance,count,dis;
unsigned char buf[6]={0};

//----------------------PLL初始化------------------------//
void PLL_init(void)//24M
{
CLKSEL=0X00; // 初始化PLL前先使用外部晶振
PLLCTL_PLLON=1; // 开启 PLL
SYNR =0x00 | 0x02; // pllclock=2*osc*(1+SYNR)/(1+REFDV)=48MHz;
REFDV=0x80 | 0x01;
POSTDIV=0x00;   //fPLL=fVOC
_asm(nop); // BUS CLOCK=24M
_asm(nop);            
while(!(CRGFLG_LOCK==1)); //等待PLL稳定
CLKSEL_PLLSEL =1; //fBUS采用根据PLL频率设定
}

void PIT_init(void)
{
  PITCFLMT_PITE = 0; //关闭PIT模块
  PITCE = 0X00;      //通道0 PIT模块禁止
  PITINTE = 0x01;    //通道0 中断使能
  PITMUX = 0x00;     //16位定时通道0使用0号8位微计数器,16位定时器1使用1号微计数器
  PITMTLD0 =240-1;   //8位定时器初值设定。240分频,在24MHzBusClock下,为0.1MHz。即10us.
  PITLD0 =10000-1;   //16位定时器初值设定,即定时100ms
  PITCE = 0X01;      //通道0 PIT模块使能     
  //PITCFLMT_PITE = 1;
}

void ECT_init(void)
{
   TSCR1=0x00;     //关定时器
   TSCR2=0x80;     //允许溢出中断,不分频     周期 1/24M
   TIOS=0x00;      //PT7为输入捕捉
   TCTL3=0xC0;     //输入捕捉7上升沿和下降沿均有效               
   TIE_C7I=1;      //通道7输入捕捉中断允许     
   TCNT=0x00;      //初始自由计数器
   //PACTL=0X62;   //开脉冲累加器 高电平,总线时钟64分频 允许溢出
   //TSCR1=0x80;     //使能定时器
   // PACNT=0;
}
void IO_init(void)
{
  DDRA=0x02;    // A1输出
  /********************B口输出(0、1、2、3)**********************************/
  DDRB_DDRB0=1;     
  DDRB_DDRB1=1;
  DDRB_DDRB2=1;
  DDRB_DDRB3=1;
  /********************E、T口输出(0、1、2、3)**********************************/
  DDRE_DDRE2=1;
  DDRE_DDRE3=1;
  DDRT_DDRT0=1;
  DDRT_DDRT1=1;
  DDRT_DDRT2=1;
  DDRT_DDRT3=1;
  /***************(RDR寄存器)配置I/O口驱动能力(1:为减弱;0:正常输出)********************/
  RDRT_RDRT0=0;
  RDRT_RDRT1=0;
  RDRT_RDRT2=0;
  RDRT_RDRT3=0;

  /**********************输入*****************************************/
  DDRT_DDRT4=0;
  DDRT_DDRT5=0;

  /***************内部上拉********************/
  PPST_PPST4=0;
  PPST_PPST5=0;
  
  /***************内部上拉使能********************/
  PERT_PERT4=1;
  PERT_PERT5=1;
}

void PORT_Update(void) //数码管输出更新
{
   PORTE_PE2=1;
   PORTE_PE3=1;
   PTT_PTT0=1;
   PTT_PTT1=1;
   PTT_PTT2=1;
   PTT_PTT3=1;
}
  
  
void delay(int z)   //延时
{
        int x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}


void main(void)
{
  /* put your own code here */
  PLL_init();
  PIT_init();
  ECT_init();
  IO_init();
        EnableInterrupts;


  for(;;)
  {
    PITCFLMT_PITE = 1; //打开PIT模块
    if(pitflag==10)
    {//-------------触发10us的脉冲信号---------------//
      TRING=1;
      delay(10);
      TRING=0;
      
      while(!ECHO)
      {
        edgup=TCNT;
      }
      while(ECHO)
      {
         edgdown=TCNT;
         if(TCNT=65535)
          {
             TFLG2_TOF=1;   
             timflag++;
          }
         count=edgdown-edgup;
         distance=((340*(count+65535*timflag)/24000000))*100;
         dis=distance;
        
      }  
         buf[0]=dis%10;
         buf[1]=dis/10%10;
         buf[2]=dis/100%10;
         buf[3]=dis/1000%10;
         buf[4]=dis/10000%10;
         buf[5]=dis/100000;
       timflag=0;
      pitflag=0;  
      //PITCFLMT_PITE = 0; //关闭PIT
    }
   
    PORT_Update();
    PORTB=PORTB&0XF0|buf[0];
    PTT_PTT0=0;
    delay(10);
   
   
    PORT_Update();
    PORTB=PORTB&0XF0|buf[1];
    PORTE_PE3=0;
    delay(10);
     
   
    PORT_Update();
    PORTB=PORTB&0XF0|buf[2];
    PORTE_PE2=0;
    delay(10);
   
  
    PORT_Update();
    PORTB=PORTB&0XF0|buf[3];
    PTT_PTT3=0;
    delay(10);
   

    PORT_Update();
    PORTB=PORTB&0XF0|buf[4];
    PTT_PTT2=0;
    delay(10);
   
   
    PORT_Update();
    PORTB=PORTB&0XF0|buf[5];
    PTT_PTT1=0;
    delay(10);

  } /* loop forever */
  /* please make sure that you never leave main */
}

#pragma CODE_SEG __NEAR_SEG NON_BANKED

void interrupt VectorNumber_Vpit0  PIT0(void)   //通道0
{
pitflag++;
PITTF_PTF0=1;  //清除PIT定时器0上的超时标志位,防止该位被挂起,为下一次中断发生做准备

}


void interrupt VectorNumber_Vtimch7 TIM7(void)
{
TFLG1_C7F=1;

}
#pragma CODE_SEG DEFAULT




又改了改,,,但是溢出超时设置还是不对 ,,,,:Q:Q:Q
回复

使用道具 举报

161

主题

2047

帖子

5

精华

超级版主

岳麓山没有车神

Rank: 10Rank: 10Rank: 10

积分
14912

论坛元老奖章优秀会员奖章活跃会员奖章论坛骨干奖章在线王奖章优秀版主奖章资源大师奖章

QQ
威望
6279
贡献
5961
兑换币
2579
注册时间
2013-11-14
在线时间
1336 小时
4#
发表于 2015-1-3 14:34:35 | 只看该作者
头像挺萌的
回复

使用道具 举报

1

主题

84

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1093
威望
493
贡献
310
兑换币
288
注册时间
2014-10-16
在线时间
145 小时
5#
 楼主| 发表于 2015-1-3 16:23:53 | 只看该作者
Quixote 发表于 2015-1-3 14:34
头像挺萌的

请指点一二
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|亿加合和智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-5-28 20:15 , Processed in 0.049533 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表