OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10977|回复: 1

我的AVR资料[程序篇]输入捕获源码(源码23)

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-1-9 10:59:39 | 显示全部楼层 |阅读模式

avr捕获PD6上的ICP信号,在数码管上显示捕获结果。
#include <mega16.h>
#include <delay.h>
#define ICP PIND.6  
#define LED PORTD.2

unsigned char ov_counter;//timer1溢出次数
unsigned int rising,falling;//开始和结束的时刻记录
unsigned long pulse;//时钟记录
unsigned int res;//记录结果(Us)
interrupt [TIM1_OVF] void time1ovf(void)
{
    ov_counter++;//记录timer1 溢出次数  
}                                    
interrupt [TIM1_CAPT] void timer1capt(void)//输入捕获
{                                                   
    if(ICP)
    {
        rising=ICR1H*256+ICR1L;//读取当前寄存器数值
        TCCR1B=TCCR1B&0XBF;//改为下降沿触发
        ov_counter=0;//清除time1计数   
    }
    else
    {
        falling=ICR1H*256+ICR1L;//读取当前寄存器数值
        TCCR1B=TCCR1B|0X40;//改为上升沿触发
        pulse=(unsigned long)falling-
              (unsigned long)rising+
              (unsigned long)ov_counter*65536;
        res=pulse*2;//将结果转换为微秒
    } 
}
void display(unsigned char number,unsigned char position)//digtial show function
{  
    DDRA=0Xff;//set PORTA output
 ORTA=0XFF;//set PORTA output in high level
    switch(position)//choice the position
 {
  case 1:{PORTA&=0xf8;break;}
  case 2:{PORTA&=0xf9;break;}
  case 3:{PORTA&=0Xfa;break;}
  case 4:{PORTA&=0Xfb;break;}
  case 5:{PORTA&=0Xfc;break;}
  case 6:{PORTA&=0Xfd;break;}
  case 7:{PORTA&=0Xfe;break;}
  case 8:{PORTA&=0Xff;break;}
  } 
    switch(number)//show number
 {
  case 0:{PORTA&=0x87;break;}    //0
  case 1:{PORTA&=0x8f;break;}    //1
  case 2:{PORTA&=0x97;break;}    //2
  case 3:{PORTA&=0x9f;break;}    //3
  case 4:{PORTA&=0xa7;break;}    //4
     case 5:{PORTA&=0xaf;break;}    //5
  case 6:{PORTA&=0xb7;break;}    //6
  case 7:{PORTA&=0xbf;break;}    //7
  case 8:{PORTA&=0xc7;break;}    //8
     case 9:{PORTA&=0xcf;break;}    //9
  default:{PORTA=0xff;break;}    //null
 }       
}  
void main()
{              
    unsigned int d;
    DDRD=0X3F;
    PORTD=0XFF; 
    TCCR1B=0Xc2;//噪声抑制,8分频、上升沿触发
    TIMSK=0x24;
    #asm("sei")//开启中断
    LED=0;
    while(1)
    {                            
       
        for(d=0;d<20;d++)
        {
            display((res/10000)%10,4);delay_us(1000);
            display((res/1000)%10,5);delay_us(1000);
            display((res/100)%10,6);delay_us(1000);
            display((res/10)%10,7);delay_us(1000);
            display(res%10,8);delay_us(1000); 
        }#asm("cli")                                   
        //#asm("sei")
        //delay_us(2);
    }
}

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

27

主题

774

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1473
金钱
1473
注册时间
2013-4-12
在线时间
77 小时
发表于 2013-5-30 20:37:25 | 显示全部楼层
什么没人顶,貌似这里学AVR 的很少哦。
原子哥进中断后计的频率还对吗?
我用ICP的方法频率误差很大。
简单是多么的快乐,而快乐就因你而简单!微芯动力LTKKS
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-19 04:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表