2014-02-24 19 views
0

HY,我有超聲波傳感器測量的距離和沒有馬瑟哪種類型是我的變量「範圍」(uint8_t,uint16_t,32,64)餘總是得到溢流,而且比傳感器從0開始again..Is有辦法,我可以限制「範圍」變量或我必須限制與脈寬更難方式...感謝測距,可變溢出

SENSOR_DDR |= (1<<TRIGGER_PIN); 
SENSOR_DDR &= ~(1<<ECHO_PIN) & ~(1<<PB3) & ~(1<<PB2) & ~(1<<PB1) & ~(1<<PB0); 
DDRD = DDRD | _BV(4); 
PORTD = PORTD | _BV(4); 
ENGINE_DDR = 0xff; 
ENGINE_PORT = 0; 

lcd_init(LCD_DISP_ON); 
lcd_clrscr(); 
lcd_puts("Something wrong..."); 


while(1) 
{ 

PORTB |= (1<<PB4); //Send Trigger 
_delay_us(10); 
PORTB &= ~(1<<PB4); //Send trigger 


timer0counter=0; 
TCNT0=0; //Clear timer 
while(bit_is_clear(PINB,5)); //Wait for rising edge 
TCCR0 |= (1<<CS02); //Select prescalar 256 
TIMSK |= (1<<TOIE0) | (1<<TOIE2); //Enable timer0 overflow interrupt 

lcd_clrscr(); 

while(bit_is_set(PINB,5) && timer0counter<9) //wait for falling edge of echo 
{ 
_delay_us(5); 
} 
TCCR0 &= ~(1<<CS02); //Stop timer 
TIMSK &= ~(1<<TOIE0); 
if(bit_is_set(PINB,5)) 
{ 
lcd_puts("No OBSTACLE"); 
} 
else 
{ 
range=(256*timer0counter+TCNT0)*32*0.017; //range conversion 

lcd_clrscr(); 
lcd_puts("Distance:"); 
lcd_puts(itoa(range,buffer,10)); 
lcd_puts_P("cm"); 
} 
if(range<15){ 
... 

ISR(TIMER0_OVF_vect) 
{ 
TIMSK &= ~(1<<TOIE0); 
TCNT0=0; 
timer0counter++; 

TIMSK |= (1<<TOIE0); 

if(timer0counter>8) 
{ 
TCCR0 &= ~(1<<CS02); 
TIMSK &= ~(1<<TOIE0); 

} 
+1

請更具體的你如何從傳感器獲得的數據。 – Kissiel

+0

現在我添加了一些代碼,我希望它能幫助你,讓你能幫助我:) – Mateo

回答

0

計算

256*timer0counter+TCNT0 

在保存臨時值「默認'size int,在AVR上是16b。所以,每當timer0counter高於256時,無論變量的最終類型如何,都會溢出。

double range_real = 256.0 * (double)timer0counter + (double)TCNT0 * 32.0 * 0.017; 
range = (int) range_real; 

顯式說明類型真的可以節省你的皮膚:

而不是做

range=(256*timer0counter+TCNT0)*32*0.017; 

與嘗試去。

+0

謝謝,我會努力 – Mateo

+0

但現在,當我再想想....我的變量timer0counter只計算,直到定時器0 TCNT0寄存器來溢出,這255 ....所以timer0counter是不能真正溢出變量... TCNT0可以,但是這是確定的,這就是爲什麼我乘溢出(timer0counter)與256(定時器0寄存器TCNT0)的數... – Mateo

+0

我不知道我是否正確理解你的問題。 我只是指出,當運行整數乘法時,結果也是一個整數,在AVR上可能存儲-32k到+ 32k之間的數字。這是不是有很多:) 你跑(256 * timer0counter + TCNT0)* 32 ......這是,如果你考慮32K是最大像,(256 * timer0counter + TCNT0)必須小於1K,這樣反過來timer0counter必須小於4 ... – Kissiel