[Atmel] 用AtmelStudio6.2跑mega16例程(43)频率计

[复制链接]
1191|0
 楼主| ddllxxrr 发表于 2014-10-30 20:58 | 显示全部楼层 |阅读模式
本例T/C1工作于定时器方式,TCNT1计数脉冲由系统时钟分频繁后提供,本例系统时钟为1MHz,TCCR1B设置分频比为1,计数时钟仍为1MHz,在该计数时钟下,每1us时间TCNT1计数1次。主程序通过设置TCCR1B=_BV(ICNC1)|_BV(ICES1),设置了输入捕获嗓音消除(ICNC1=1)位和ICP上升沿触发输入捕获(ICES1 = 1)位。由于PD6(ICP)输入捕获引脚输入信号的每次上升沿都将触发捕获,在捕获中断时,中断服务程序通过计算2次所读取的ICR1的差值,即可得出相邻2次TCNT1的计数差值。
以下是Proteus仿真载图



以下是Studio6.2编译通过的截图:


程序清单:
  1. /*
  2. * GccApplication6.c
  3. *
  4. * Created: 2014-10-30 20:31:23
  5. *  Author: Administrator
  6. */

  7. #define F_CPU 1000000UL

  8. #include <avr/io.h>
  9. #include <AVR/io.h>
  10. #include <avr/interrupt.h>
  11. #include <util/delay.h>
  12. #include <stdint.h>

  13. const uint8_t SEG_CODE[]={0x3F,0x06,0x58,0x4f,0x66,0x6d,0x7d,0x07,0x7F,0x6F,0x00};
  14. uint8_t Display_Buffer[] = {0,0,0,0};
  15. uint16_t CAPi = 0,CAPj = 0;

  16. void Show_FRQ_ON_DSY()
  17. {
  18.         uint8_t i = 0;
  19.         for(i=0;i<4;i++)
  20.         {
  21.                 PORTA = 0x00;
  22.                 PORTB = ~_BV(i);
  23.                 PORTA = SEG_CODE[Display_Buffer[i]];
  24.                 if(i==0)PORTA |= 0x80;
  25.                 _delay_ms(2);
  26.         }
  27. }

  28. int main(void)
  29. {
  30.     uint8_t LastKey = 0xFF;
  31.         DDRA = 0xFF;
  32.         DDRB = 0xFF;
  33.         DDRC = 0x00; PORTC = 0xFF;
  34.         DDRD = 0x00; PORTD = 0xFF;
  35.         TCCR1B = _BV(ICNC1)|_BV(ICES1);
  36.         sei();
  37.         while(1)
  38.         {
  39.                 if(LastKey != PINC)
  40.                 {
  41.                         TIMSK = _BV(TICIE1);
  42.                         TCCR1B |= 0x01;
  43.                         LastKey = PINC;
  44.                 }
  45.                 Show_FRQ_ON_DSY();
  46.         }
  47. }

  48. ISR(TIMER1_CAPT_vect)
  49. {
  50.        
  51.          uint8_t i;
  52.          if(CAPi == 0) CAPi = ICR1;
  53.          else
  54.          {
  55.                  
  56.                  CAPj = ICR1-CAPi;
  57.                  CAPj = 1000000UL/CAPj;
  58.                  TIMSK = 0x00;
  59.                  TCCR1B &= 0xFC;
  60.                  for(i=3;i!=0xFF;i--)
  61.                  {
  62.                          Display_Buffer[i] = CAPj % 10 ;
  63.                          CAPj /= 10;
  64.                  }
  65.                  TCNT1 = CAPi = CAPj = 0;
  66.                  
  67.          }
  68. }


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2404

主题

7001

帖子

68

粉丝
快速回复 在线客服 返回列表 返回顶部