⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ect--+

📁 Freescale XS128单片机ECT--计数器例程
💻
字号:
#include <hidef.h>      /* common defines and macros */
#include <MC9S12XS128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"

unsigned int number1=0,number2=0;
unsigned char flag=0;  //定义标志位
 
void delay(){      //延时
  unsigned int i,j;
  for(i=0;i<500;i++){
      for(j=0;j<1000;j++) ;
      }         
  }

void SetBusCLK_80M(){    //设置总线时钟

    CLKSEL=0X00;     //disengage PLL to system
    PLLCTL_PLLON=1;   //turn on PLL
    SYNR =0xc0 | 0x09;                       
    REFDV=0xc0 | 0x01;
    POSTDIV=0x00;       //Fvco=2*osc*(1+SYNDIV)/(1+REFDIV);2*16*(1+9)/(1+1)=160MHz
                        //Fpll=Fvco/2*POSTDIV,but when POSTDIV=0,Fpll=Fvco=160MHz
    _asm(nop);          //BUSCLOCK=Fpll/2 =80MHz
    _asm(nop);
    while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;
    CLKSEL_PLLSEL =1;           //engage PLL to system;   

}

void ECT_Init(void){  //计数器初始化

  TIOS=0X02;    //IOS7 IOS6 IOS5 IOS4 IOS3 IOS2 IOS1 IOS0
                // 0     0   0    0     0    0   1     0 
                // IOSn=0,n为输入捕捉(IC)通道  用于计数
                // IOSn=0,n为输出比较(OC)通道  用于定时
  TSCR1=0X80;   // TEN TSWAI TSFRZ TFFCA  PRNT  0  0  0 
                //   1   0     0     0      0   0  0  0
                // TEN=1   定时器使能  =0时禁止计时、计数
                // TSWAI=1  进入中断等待模式时 禁止计数  =0时允许
                //TSFRZ=0  冻结模式下允许计时器和计数器继续运行  =1时禁止 
                //PRNT =1  允许精确计时
  TSCR2=0X07;   //TOI 0 0 0  TCRE PR2 PR1 PR0
                // 0  0 0 0    0   1   0   0
                //TOI=0 禁止溢出中断 =1时 在TFLG2_TOF=1时发出中断请求
                //TCRE=0 禁止计数器复位,自由计数 =1时通道7成功输出后计数器被复位
                //PRn 预分频 Feci=Fbus/2^PR  这里是128分频
  TCTL4=0X0a;   //EDG3B EDG3A EDG2B EDG2A EDG1B EDG1A EDG0B EDG0A
                //  0     0     0     0     1    0     1      0   
                //EDGnB=1,EDGnA=0 仅捕捉下降沿
  TIE=0X03;      //C7I C6I C5I C4I C3I C2I C1I C0I
                 // 0   0   0   0   0   0   0   0
                 //CnI=1允许标志位引起中断 =0时禁止
  TFLG1=0X03;   //C7F~C0F
                //CnF=1说明该通道有动作。写1清除该标志位
  TC1=0x00f0;
}

void Pulse(void){    //从A口输出一定频率的脉冲
     PORTA_PA0=1;     //PA0---IOC0
     delay();
     PORTA_PA0=0;
     delay();
     PORTA_PA1=1;     //PA1---IOC1
     delay();
     delay();
     PORTA_PA1=0;
     delay();
}

void main(void) {
     DisableInterrupts;
     SetBusCLK_80M();
     ECT_Init();
     EnableInterrupts;
     DDRA=0xff;
     DDRB=0xff;
     PORTB=0xff;
     
      for(;;){
       Pulse();
       }    
 
}

#pragma TRAP_PROC SEG_NEAR_SEG NON_BANKED         //申明中断XS128

//#pragma CODE_SEG NON_BANKED、                  //申明中断DB128
void interrupt 8 count2(){     //中断优先级高
  TFLG1_C0F=1;  //清中断标志位
  number2++;
}

void interrupt 9 count1(){   //中断优先级低
  DisableInterrupts;
  TFLG1_C1F=1;   //清中断标志位
  number1++;
  if(flag==0){
    flag=1;
    PORTB=0x55;
  } 
  else{
     flag=0;
    PORTB=0xaa;
  }
 TC1=0x00f0;
 EnableInterrupts;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -