首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

透过现象看本质,AD怎么会和PIT中断冲突呢?

透过现象看本质,AD怎么会和PIT中断冲突呢?

在MC9S12XS128中,当ad模块和PIT中断同时出现时候变异可以通过,但是下载后出现ILLEGAL_BP错误全部程序如下:
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include <MC9S12XS128.h>
#define  Ir_Pin      PTH_PTH0

#define  speed        25
int count,i,j;
void PLL_init(void);
void ad_init(void);
void delayms(int ms);

void  Ir_Get_Low(void);
void  Ir_Get_High(void);
void IO(void);
void main(void)
{
   PLL_init();
   IO();
   ad_init();                        //  将此句注释或将下面一句注释掉,程序都可以运行
   EnableInterrupts;            //将此句注释或将上面一句注释掉,程序都可以运行
                                         //当然注释掉,想要功能就不能实现了
   
while(1)
     {   
   
     }
     for(;;);
}

void PLL_init(void)    //时钟初始化
{
         //40M bus_clock
    CLKSEL=0X00;   
    PLLCTL_PLLON=1;   
    SYNR =0xc0 | 0x04;                       
    REFDV=0x80 | 0x01;
    POSTDIV=0x00;      
    _asm(nop);         
    _asm(nop);
    while(!(CRGFLG_LOCK==1));   
    CLKSEL_PLLSEL =1;         
}

void ad_init(void)    //AD初始化
  {
   ATD0CTL1=0X00;
   ATD0CTL2=0X42;
   ATD0CTL3=0Xc3;  //0Xe4为12  0xc3为8    6_3转换序列长度1100 12通道
   ATD0CTL4=0xF3;
   ATD0CTL5=0x30;
   ATD0DIEN=0x00;
   }
   
  
   void  Ir_Get_Low()
      {
     count=0;
     PITCFLMT_PITE=0; //关闭PIT   
     PITCE_PCE0=1;//使能通道0   
      //微定时器的装载寄存器
      PITMTLD0= 40-1;//8位定时器初值设定。40分频,在40MHzBusClock下,为0.01MHz,即1us     
      //定时器的装载寄存器,
      PITLD0  = 20 - 1 ;//16位定时器初值设定//定时20000*0.001ms = 20ms
      
      PITMUX_PMUX0=0;//0:相应16位定时器与微时基0连接           
      PITINTE_PINTE0=1;//PIT相应通道溢出中断使能   
      PITCFLMT_PITE=1; //使能PIT                                 ..
     while(Ir_Pin==0);   
      PITCFLMT_PITE=0; //关闭PIT  
      }
      //==============================================================
   
      
      void  Ir_Get_High(void)
      {
     count=0;
     PITCFLMT_PITE=0; //关闭PIT   
     PITCE_PCE0=1;//使能通道0   
      //微定时器的装载寄存器
      PITMTLD0= 40-1;//8位定时器初值设定。40分频,在40MHzBusClock下,为0.01MHz,即1us     
      //定时器的装载寄存器,
      PITLD0  = 20 - 1 ;//16位定时器初值设定//定时20*0.001ms = 20us   
      PITMUX_PMUX0=0;//0:相应16位定时器与微时基0连接           
      PITINTE_PINTE0=1;//PIT相应通道溢出中断使能   
      PITCFLMT_PITE=1; //使能PIT                                 ..
     while(Ir_Pin==1);  
      PITCFLMT_PITE=0; //关闭PIT   
      }

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区
void interrupt 66 PIT0(void)
{
count++;
PITTF_PTF0=0;//清中断标志位
}   


  void  IO(void)
{   
        
     DDRH_DDRH0=0;

}
void delayms(int ms)            //普通延时环节  调用1次大约1ms
{   
   int ii,jj;
   if (ms<1) ms=1;
   for(ii=0;ii<ms;ii++)
     for(jj=0;jj<3338;jj++);         
}
                        //定时器模块
返回列表