问题描述
- 颜色传感器白平衡调试问题
-
程序功能: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 0static 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=%dn",rx); printf("gx=%dn",gx); printf("bx=%dn",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顺序也是如此。求解释。
解决方案
一起讨论,一起学习。
解决方案二:
一起讨论,一起学习。
解决方案三:
一起讨论,一起学习。
解决方案四:
问题已解决
ISR(TIMER0_OVF_vect)
{
......
TCCR0&=~((1<<CS02)|(1<<CS01)|(1<<CS00));
......
}
少加了一个括号