2015-07-28 45 views
0

先生,我不知道爲什麼我的顏色傳感器的C代碼無法正常工作。我使用的是ATMEGA16微控制器,我使用的傳感器是連接到微控制器的TO引腳PB0(PORTB0)的TCS230傳感器。請幫助我,我在這裏附上我的C代碼 - 請記住,我使用20%的縮放比例,並且已經將S0和S1引腳連接到1(VCC)和0(Gnd)。顏色傳感器(TCS230)接口不適用於ATMEGA16?

#define S2 PA0 
    #define S3 PA1 
    #define F_CPU 11.0592 
    #include <util/delay.h> 
    #include<avr/io.h> 
    #include<avr/interrupt.h> 
    //Variable declarations 
    unsigned char state; 
    unsigned int counter_r,counter_g,counter_b,counter_no; 
    unsigned char i=0; //to store value of counter 
    unsigned char flag=0; 
void chkcolour(); 

int main() 
    { 
    DDRB=0x00; //PB0 and T0(counter pin) Input 
    DDRA=0xFF; //PA2(R),PA3(G) & PA4(B) for RGB LED ,PA0(S2) & PA1(S3) for RGB selection ,Output Pins 
    TCNT0=0x00; 
    TCCR0=0x07; 
    state=0; //start from 0 then 1,2,then again same 

    sei(); 

    while(1) 
    { flag=0; 
switch(state) 
{ 
    case 0: 

     PORTA=0b00000000; //For Red 
     _delay_ms(1000); 
     counter_r=TCNT0; 
     TCNT0=0x00; 
     state=1; 

    case 1:  

     PORTA=0b00000010; //For blue 
     _delay_ms(1000); 
     counter_b=TCNT0; 
     TCNT0=0x00; 
     state=2; 

    case 2: 
     PORTA=0b00000011; //For Green 
     _delay_ms(1000); 
     counter_g=TCNT0; 
     TCNT0=0x00; 
     state=3; 

    case 3: 
     PORTA=0b00000001; //No Filter 
     _delay_ms(1000); 
     counter_no=TCNT0; 
     TCNT0=0x00; 
     state=0; 
     break; 

} 


chkcolour(); 

} 

return 0; 
} 



void chkcolour() 
{ 


     if((counter_r > counter_b) && (counter_r > counter_g)) 
      { 
      PORTA=0b00000100; //Glow RED LED,Off Green LED,Off Blue LED 
      flag=1; 


      }  

     else if((counter_g > counter_r) && (counter_g > counter_b)) 
     { 
     PORTA=0b00001000; //Glow GEREEN LED,Off RED LED,Off Blue LED 
     flag=1; 


      } 

     else if((counter_b > counter_r) && (counter_b > counter_g) ) 
     { 
     PORTA=0b00010000; //Glow BLUE LED,Off RED LED,Off GREEN LED 
     flag=1; 


      } 


    else 
      { 
     PORTA=0b00000000; //0ff GEREEN LED,Off RED LED,Off Blue LED 
     flag=1; 


      } 


}  
+0

請編輯您的問題,以解釋您的意思是「不工作」。 – Blackwood

回答

0

很多問題。

1)不要忘記每個情況

2)分配到PORTA在此端口覆蓋以前的值後添加斷裂開關。即在此構造中:

 PORTA=(0<<PORTA2); //Off RED LED 
    PORTA=(1<<PORTA3); //Glow Green LED 
    PORTA=(0<<PORTA4); //off Blue LED 

您將在PORTA的所有輸出上都有一個零(最後一行)。

3)甚至,如果事情會出PORTA在chkcolour(),它將在接下來的幾微秒的覆蓋,因爲下一次迭代將被分配:

PORTA=(0<<S3) | (0<<S2) ; //For Red 

設置或清除位使用像這樣的結構:

PORTA |= (1 << bitnum); // to set a bit 
PORTA &= ~(1 << bitnum); // to clear (note bitwise negation ~ symbol) 
+0

先生,我不是在每種情況下使用中斷,因爲我想將我的'控制'發送到下一個狀態..我根據您的建議對我的代碼進行了一些更改,但它仍然無效...請幫助 –

+0

然後,爲什麼你需要使用「開關」呢?再看一遍:無論在chkcolour()中將輸出到PORTA中,它將立即被PORTA = 0b00000000覆蓋;在你的交換機中。使用PORTA =(PORTA&0b11111100)| Z Z;代替。其中zz - 0b00 0b01 0b10 0b11(每個「case」的最後兩位) – AterLux

+0

先生,請檢查這個問題,並給你的sugesstion ------- http://stackoverflow.com/questions/31730103/counting-without-反式 - 微控制器是,可能 –