智能车制作
标题:
三个中断的问题
[打印本页]
作者:
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://dns.znczz.com/)
Powered by Discuz! X3.2