智能车制作

标题: 三个中断的问题 [打印本页]

作者: justing88    时间: 2010-4-6 22:12
标题: 三个中断的问题
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

void ccd_init(void);
void pll_init(void);          ///倍频
void IC_init(void);
void IRQ_init(void);
void ad_init(void);
unsigned char ad_i,ad_j;  //ad模块计数器
int ad_p,ad_q;             //
unsigned  char ima[65][60]; //图像存储区,每行采集到60个点,一共有65行
unsigned char ima_m=0, line_i=0,ima_num=62; //图像标志  从第二幅图像开始计算第一个中点值 ; 一副图像采集完标志 第几幅图像计数器
///////////////////////////////////////////////////////
void pll_init(void)
{  
    CLKSEL=0X00;    //disengage PLL to system
    PLLCTL_PLLON=1;   //turn on PLL
    SYNR=3;         
    REFDV=1;          //pllclock=2*osc*(1+SYNR)/(1+REFDV)=64MHz;
    _asm(nop);          //BUS CLOCK=32M
    _asm(nop);
    while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;
    CLKSEL_PLLSEL =1;          //engage PLL to system;
}

void IRQ_init()
{
   INTCR_IRQE=1;                          //下降沿触发,0的话就是电平触                             
                //下降沿触发或低电平触发,否则要用反相器)
   INTCR_IRQEN=1;             //初始化开启(ENABLE)
                       
}

void IC_init(void){
  TIOS=0X00;      //输入捕捉
  TSCR1=0X80;     //定时器开始工作
  TSCR2=0X07;     //禁止定时器溢出中断,仅仅提供数据.2分频
  TCTL3=0X02;    //仅捕捉下降沿
  TIE=0X10;      //输入捕捉中断使能
  TFLG1=0X10;    //定时器中断标志寄存器2自动清零,对应于输入捕捉4口1;
}

void ad_init(void){
asm sei ;
  ATD0CTL2=0XC0;            //启动AD  自动清标志位  外部触发禁止
  ATD0CTL3=0X08;            //结果存放在ATDDR0  转换序列为1 右对齐
  ATD0CTL4=0X87;            //128分频 采样时间二倍采样周期
  ATD0CTL5=0XA4;            //单通道转换  连续转换 通道4
  ATD0DIEN=0X00;            //禁止数字输入
asm cli;
}

void main(void) {
  /* put your own code here */
  DDRB=0XFF;
  PORTB=0X0F;
  IC_init();
  IRQ_init();
  pll_init();
  ad_init();                              
  EnableInterrupts;

   for(;;)
   {   
    _FEED_COP();
   }
  /* wait forever */
  /* please make sure that you never leave this function */
}


#pragma CODE_SEG NON_BANKED         
void interrupt 6 line_int(void)
{
     ATD0CTL2_ASCIE=0;          //ad转化完成后,不进行中断
     if((++ad_p)>23)           //行中断了24次,废弃前面的行中断
     {            
       ad_q++;                 //行中断计数器
     }
     if(ad_q%3==1)
     {                        //之后,每隔三个行中断,进行一次AD转化
       ad_j=0;
       ad_i++;
       ATD0CTL2_ASCIE=1;       //开中断
     }
}

     
void interrupt 12 row_int(void){    //场中断
    TFLG1_C4F=1;                   //清中断标志位
    ad_i=0;                       //行重新开始
    ad_q=0;
    ad_p=0;
    ima_m++;                      //变成了新的一副图片
   }      
void interrupt 22 ad_int(void){  // AD转化好了之后,产生中断,将转化好的存起来
      while(ATD0CTL2_ASCIF==0);
      ima[ad_i][ad_j]=ATD0DR0L;  //存储结果
      ad_j++;                    //列数加1
   }
#pragma CODE_SEG DEFAULT
作者: justing88    时间: 2010-4-6 22:15
问题:
void interrupt 6 line_int(void)
{
     ATD0CTL2_ASCIE=0;          //ad转化完成后,不进行中断
     if((++ad_p)>23)           //行中断了24次,废弃前面的行中断
     {            
       ad_q++;                 //行中断计数器
     }
     if(ad_q%3==1)
     {                        //之后,每隔三个行中断,进行一次AD转化
       ad_j=0;
       ad_i++;
       ATD0CTL2_ASCIE=1;       //开中断
     }
}
中如果将ATD0CTL2_ASCIE=1和ATD0CTL2_ASCIE=0两条语句去掉的话,那么ima[][]这个数组就能存入数值,也就是说有数,但是,当这两语句加入后,数组的值就为0了。这两条语句不是控制AD转化后是否中断的吗????
作者: justing88    时间: 2010-4-6 22:17
如果将两条去掉的话,就达不到我要求的目的了:即行中断进入后,AD采集,然后转化完毕发生中断,一直到第二次行中断的到来。难道跟中断优先级设置有关???怎么设置呢??网上资料没多少,牛人解答下!!!十分感谢!!!
作者: justing88    时间: 2010-4-8 21:29
这个问题我自己解决了,硬件与软件的延时问题!!硬件跟不上软件速度,所以,开关AD时,硬件根本来不及反应,而行中断已经早过去了。哈哈,谢谢观看,不好意思
作者: witbas    时间: 2010-12-11 16:01
我看见你自言自语结束!




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2