打印

mega16超声测距程序求助,只能进一次输入捕获中断,且读不到RCR1的值

[复制链接]
1468|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
luobiyige|  楼主 | 2012-12-18 16:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <avr/io.h>
#include "lcd1602.h"
#define         F_CPU        7372800                /* 单片机主频为7.3728MHz,用于延时子程序 */
#include <util/delay.h>
#include <avr/signal.h>
/****************************

/********* 定义变量及声明****************************************/
float t=3;
unsigned int fristv,secondv;
int i=0;
#define delay_us(x)     _delay_us(x)    //AVR GCC延时函数 x(us)
#define delay_ms(x)     _delay_ms(x)    //AVR GCC延时函数 x(ms)
unsigned char flag=0xff;
#define sonar_clr        PORTD &= ~(1 << PD4);                 //RS置低
#define sonar_set         PORTD |= (1 << PD4);
/****************************************************/


/********输入捕获模式设置*****************************/
void sonar_init()
{
        TCNT1=0x10;
        TIMSK|=1<<TICIE1;  //ICP中断使能
        TCCR1A=0X00;
        TCCR1B=(1<<CS10)|(1<<CS11)|(0<<CS12)|(1<<ICES1)|(0<<WGM12)|(0<<WGM13); //外部时钟1分频,上升沿触发ICP,T1为普通模式
}
/******************************************************************************************


/**********************输入捕获模式测算距离*************************************/
SIGNAL(SIG_INPUT_CAPTURE1)
{        
        
        
        i=i+1;
        //LCD_write_char(0,0,5);
        if((i==1))                   //判断是否为第一次(上升沿)进捕获中断
        {
                fristv=ICR1;
                //flag=0X00;
                TCCR1B=0X01;     //设置为下降沿触发捕获中断,允许下降沿进入
                //LCD_write_BCD(0,0,fristv);
                TIFR=(1<<ICF1);
        }
        else if((i==2))
        {        secondv=ICR1;
                t=(secondv-fristv)*0.1417; //12Mhz的外部晶振S=T*340/2/12
                i=0;                                   //第二次进捕获中断
                TCCR1B=0X41;         //完成一次测距,重新设置为高电平触发CPI中断
        //        LCD_write_BCD(8,1,second);
        }
   //LCD_write_BCD(0,1,t);

        

}
/************************************************************************************/
int main()
{
        lcd_system_init();
        LCD_init();
        sonar_init();
        sei();
        while(1)
        {
         sonar_set;
         delay_us(15);
         sonar_clr;        
         delay_us(15);
        LCD_write_BCD(8,1,secondv);
        LCD_write_BCD(0,0,fristv);
        LCD_write_BCD(0,1,i);
        }

}

相关帖子

沙发
luobiyige|  楼主 | 2012-12-19 20:01 | 只看该作者
自己回答了,原来是在lcd1602.c文件中把ICP1也就是PD6为输出了,应该是输入的。

使用特权

评论回复
板凳
airwill| | 2012-12-19 23:10 | 只看该作者
嗯, 自己找到问题的根源, 这是最好的事情.
很多问题只是一些疏忽而已.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

5

帖子

0

粉丝