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

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

程序功能: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 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable