前年的邂逅 2015-05-06 08:08 采纳率: 0%
浏览 2659

颜色传感器白平衡调试问题

程序功能:AVR外部信号采集处理,使用PB0引脚口。选通不同颜色,用T2来计算PB0口256个上升沿的时间。
#ifndef COLOR_H
#define COLOR_H
#endif

#define S0 0
#define S1 1
#define S2 2
#define S3 3
#define LED 4
#define OUT 0

static volatile unsigned int timer=0;
static volatile unsigned int GC=0,BC=0,RC=0;//
static volatile char i=0;
unsigned char j=0;

volatile unsigned int rx=0,gx=0,bx=0;

//PA0 PA1 PA2 PA3 PA4 PB0
//S0 S1 S2 S3 LED OUT

//S3 S2

//0 0 红(R)
//1 1 绿(G)
//1 0 蓝(B)
//0 1 无
void Color_Mode(unsigned char color)
{
if(color=='R')//将滤波选择为红色,即S3:S2=0:0
{
PORTA &=~((1<<S3)|(1<<S2));
}
else if(color=='G')//将滤波选择为绿色,即S3:S2=1:1
{
PORTA |=(1<<S3)|(1<<S2);
}
else if(color=='B')//将滤波选择为蓝色,即S3:S2=1:0
{
PORTA |=(1<<S3);
PORTA &=~(1<<S2);
}
else if(color=='W')//将滤波选择为无色,即S3:S2=0:1
{
PORTA &=~(1<<S3);
PORTA |=(1<<S2);
}
}
void Color_IoInit()//将传感器的S0,S1,S2,S3和LED引脚设置成输出高电平形式
{ //OUT设置成带上拉电阻的输入模式
DDRA |=(1<<LED)|(1<<S3)|(1<<S2)|(1<<S1)|(1<<S0);
PORTA |=(1<<S2)|(1<<S1)|(1<<S0);//将S1和S0口设置成高电平输出
//选择输出比例因子为100%,
PORTA &=~(1<<LED);//将LED口设置成低电平输出,即点亮LED灯。
PORTA &=~(1<<S3);//S3:S2=0:1,设置成滤波类型:无

DDRB    &=~(1<<OUT);//
PORTB   |=(1<<OUT);//设置成带上拉电阻的输入

}
void Color_Timer02Init(void)
{
//将定时器0设置成外部脉冲输入模式PB0为外部脉冲输入引脚
TIMSK|=(1<<TOIE0);//T0中断使能
TCCR0|=(1<<CS02)|(1<<CS01)|(1<<CS00);//将TCCR0的第三位全部设置成1,上升沿有效
TCNT0=0;//将计数器初始化为0

//开启定时器2
//不分频,定时器自加1,需要时间:1/7.3728=0.13563368
//一个周期256*1/7.3728=34.7222222us=0.0347222ms
TCCR2|=(0<<CS22)|(0<<CS21)|(1<<CS20);
TIMSK|=(1<<TOIE2);//T2中断使能

TCNT2=0X00;//八位定时器
sei();

}

//定时器2溢出中断
ISR(TIMER2_OVF_vect)
{
timer++;

}
//计数器0计数溢出中断
ISR(TIMER0_OVF_vect)
{
if((PORTA&0X0C)==0X00)//选择滤红色
{
RC=timer*34.7222;
Color_Mode('G');//选择滤绿色波
i=0;
}
else if((PORTA&0X0C)==0X0C)//选择滤绿色
{
GC=timer*34.7222;
Color_Mode('B');//选择滤蓝色波
i=0;
}

else if((PORTA&0X0C)==0X08)//选择滤蓝色
{
BC=timer*34.7222;
Color_Mode('R');//选择滤红色波
i=1;//已经全部记录下所有256个周期长度时间
//转换完后,关闭溢出中断使能
TIMSK&=~(1<<TOIE0);
TIMSK&=~(1<<TOIE2);
TCCR0&=~(1<<CS02)|(1<<CS01)|(1<<CS00);
TCCR2&=~((1<<CS22)|(1<<CS21)|(1<<CS20));
}
else if((PORTA&0X0C)==0X04)//没有滤波,将选择滤绿色
{
Color_Mode('R');//选择滤红色波
i=0;
}
timer=0;
TCNT2=0;
TCNT0=0;
}
void Color_CatchValue()
{
if(i==1)
{
i=0;
rx=RC;
gx=GC;
bx=BC;

    printf("rx=%d\n",rx);
    printf("gx=%d\n",gx);
    printf("bx=%d\n",bx);

    TIMSK|=(1<<TOIE0);//T0中断使能
    TIMSK|=(1<<TOIE2);//T2中断使能
    TCCR0|=(1<<CS02)|(1<<CS01)|(1<<CS00);
    TCCR2|=(0<<CS22)|(0<<CS21)|(1<<CS20);
}

}

#include
#include
#include"uart.h"
#include
#include"util/delay.h"
#include"color.h"

int main(void)
{
UartInit();
Color_IoInit();
Color_Timer02Init();
printf("it is running");
while(1)
{
Color_CatchValue();
}
return 0;
}
结果显示:
gx=833
bx=659
rx=0
gx=833
bx=659
rx=0
gx=833
bx=659
rx=0
gx=833
bx=659
rx=0
gx=833
bx=659
rx=0
gx=833
bx=659
rx=0
gx=833
bx=659
rx=0
gx=833
bx=659
rx=0
gx=833

结果分析:
当T0中断产生,第一个if语句中的timer总是为0,即使改变if顺序也是如此。求解释。

  • 写回答

1条回答 默认 最新

  • 前年的邂逅 2015-05-06 09:13
    关注

    问题已解决
    ISR(TIMER0_OVF_vect)
    {
    ......
    TCCR0&=~((1<<CS02)|(1<<CS01)|(1<<CS00));
    ......
    }
    少加了一个括号

    评论

报告相同问题?

悬赏问题

  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B