Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 3505|回復: 1
打印 上一主題 下一主題

ping超音波使用在avr上的問題

[複製鏈接]
跳轉到指定樓層
1#
發表於 2011-11-9 01:48:48 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我將ping超音波的信號角接至PORTB.3,程式如下
//////////////////////////////////////////////////////////////////////////////////////////////////////
#include <mega16.h>
#include <alcd.h>
#include <delay.h>
unsigned long dis_cal(unsigned int timer);
void lcd_scan(unsigned long distance);
unsigned char x=0;
unsigned int pwm_1=0,timer;
double distance;
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
  if(TCCR0==0x07)                               //00000111(計時由T0腳位輸入,正緣觸發)
     {   
          TCCR0=0x06;                           //令00000110(計時由T0腳位輸入,負緣觸發)
          timer=0;
          x=1;   
     }
  else if(TCCR0==0x06)                          //00000110(計時由T0腳位輸入,負緣觸發)
     {   
          TCCR0=0x07;                           //令00000111(計時由T0腳位輸入,正緣觸發)
          x=0;   
     }
      TCNT0=0xff;                               //令初值255
}
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
     TCNT1H=0xff;
     TCNT1L=0xD8;
     pwm_1++;
     if(x==1)
     {   
       timer++;   
     }
     PORTB.3=(!PORTB.3);
}
void main(void)
{
    PORTB=0x08;
    DDRB=0x00;
    TCCR0=0x07;                                 //00000111(計時由T0腳位輸入,正緣觸發)
    TCNT0=0xff;                                 //計時器0為256
    TCCR1A=0x00;               
    TCCR1B=0x01;                                //00000001(無分頻)
    TCNT1H=0x00;
    TCNT1L=0x00;
    TIMSK=0x05;
    ACSR=0x80;
    lcd_init(16);
    #asm("sei")
while (1)
      {
       if(pwm_1>=0 && pwm_1<=500)
        {   
         PINB.3=1;   
        }
       else if(pwm_1>500 && pwm_1<=6000)
        {   
         if(pwm_1>5000)
           {   
              pwm_1=0;   
           }   
         else
           {   
             PINB.3=0;
             distance=dis_cal(timer);
             lcd_scan(distance);   
           }   
        }
      }//end while
}//end main
unsigned long dis_cal(unsigned int timer)
{
     unsigned long distance;
     float handle;
     handle=((10*timer)/2)*2257;              
     distance=handle;
     return distance;
}
void lcd_scan(unsigned long distance)
{
     lcd_clear();
     lcd_gotoxy(0,0);
     lcd_putsf("Test Distance:");
     lcd_gotoxy(0,1);
     lcd_putchar((distance/100%10)+0x30);
     lcd_gotoxy(1,1);
     lcd_putchar((distance/10%10)+0x30);
     lcd_gotoxy(2,1);         
     lcd_putchar((distance%10)+0x30);
     lcd_gotoxy(3,1);
     lcd_putsf("cm");
}

//////////////////////////////////////////////////////
但程式結果出來所量測距離在LCD上是不會改變的,不知原因在哪??
2#
 樓主| 發表於 2011-11-9 01:51:15 | 只看該作者
剛程式有點問題,這個才是。

#include <mega16.h>
#include <alcd.h>
#include <delay.h>
unsigned long dis_cal(unsigned int timer);
void lcd_scan(unsigned long distance);
unsigned char x=0;
unsigned int pwm_1=0,timer;
double distance;
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
  if(TCCR0==0x07)                               //00000111(計時由T0腳位輸入,正緣觸發)
     {   
          TCCR0=0x06;                           //令00000110(計時由T0腳位輸入,負緣觸發)
          timer=0;
          x=1;   
     }
  else if(TCCR0==0x06)                          //00000110(計時由T0腳位輸入,負緣觸發)
     {   
          TCCR0=0x07;                           //令00000111(計時由T0腳位輸入,正緣觸發)
          x=0;   
     }
      TCNT0=0xff;                               //令初值255
}
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
     TCNT1H=0xff;
     TCNT1L=0xD8;
     pwm_1++;
     if(x==1)
     {   
       timer++;   
     }
     PORTB.3=(!PORTB.3);
}
void main(void)
{
    PORTB=0x08;
    DDRB=0x00;
    TCCR0=0x07;                                 //00000111(計時由T0腳位輸入,正緣觸發)
    TCNT0=0xff;                                 //計時器0為256
    TCCR1A=0x00;               
    TCCR1B=0x01;                                //00000001(無分頻)
    TCNT1H=0x00;
    TCNT1L=0x00;
    TIMSK=0x05;
    ACSR=0x80;
    lcd_init(16);
    #asm("sei")
while (1)
      {
       if(pwm_1>=0 && pwm_1<=500)
        {   
         PINB.3=1;   
        }
       else if(pwm_1>500 && pwm_1<=6000)
        {   
         if(pwm_1>5000)
           {   
              pwm_1=0;   
           }   
         else
           {   
             PINB.3=0;
             distance=dis_cal(timer);
             lcd_scan(distance);   
           }   
        }
      }//end while
}//end main
unsigned long dis_cal(unsigned int timer)
{
     unsigned long distance;
     float handle;
     handle=(10*(float)timer)/58;              
     distance=handle;
     return distance;
}
void lcd_scan(unsigned long distance)
{
     lcd_clear();
     lcd_gotoxy(0,0);
     lcd_putsf("Test Distance:");
     lcd_gotoxy(0,1);
     lcd_putchar((distance/100%10)+0x30);
     lcd_gotoxy(1,1);
     lcd_putchar((distance/10%10)+0x30);
     lcd_gotoxy(2,1);         
     lcd_putchar((distance%10)+0x30);
     lcd_gotoxy(3,1);
     lcd_putsf("cm");
}
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-5-4 07:39 , Processed in 0.143610 second(s), 7 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表