c - atmega128中输入捕获值是双倍

标签 c embedded atmega avr-gcc

我正在使用 Atmega128 和 Atmel Studio 学习嵌入式 C。

我想编写代码来显示传感器的温度和湿度。

我正在学习输入捕获,我的第一个问题是:

我得到的 IC 值为 5000(句点),但我认为 2500 是正确的。我计算得对吗?如果是这样,你知道为什么 IC 的值是错误的吗?

16000.000/64 = 250000

1 second      250000 puls

100 ms          x = 2500

董事会信息:

avr128

16.000.000 external clock.



philips puls generator info:

Repitation 100 mili s
Duration 10 ms
5 volt

我的代码

    volatile uint32_t iccnt=0,ovfcnt=0;
    volatile uint32_t myCapt [2],lastCapt; 

//__________________________

void initTimer()
{
    TCNT1 =0;//Max=65535
    TCCR1B |= 1<<CS10 | 1<<CS11 ;
    // 1<<CS10 | 1<<CS11 ;//16000000/16=250000
    //250000/65535=3.81
    //TCCR1B |= 1<<WGM13  |1<<WGM12;
    TIMSK |= 1<<TOIE1;
    TIFR = 1<<TOV1;
    sei();
} 

void initInputCapture()
{
    // First Capture on rising edge
    TCCR1B |=1<<ICES1;
    //ic intrrupt flag enable
    TIMSK |= 1<< TICIE1;
    // set input pin to get signal

}
void initlcd()
{
    lcd_init(LCD_DISP_ON_CURSOR_BLINK);
    lcd_clrscr();
}
void ShowA(unsigned int a)
{
    char aa[11];
    if (a >32000) {
        itoa(a - 32000,aa,10);
        lcd_puts("32000+");
        lcd_puts(aa);
    } else {
        itoa(a,aa,10);
        lcd_puts(aa);
    }
}
ISR(TIMER1_OVF_vect)
{
    ovfcnt++;

}
ISR(TIMER1_CAPT_vect)
{

    iccnt++;

    myCapt[iccnt % 2] = ICR1 - lastCapt;
    lastCapt = ICR1; 

}

void ShowCaptureTime2()
{
    lcd_clrscr(); 

    ShowA (iccnt);
    lcd_puts(": \n");
    ShowA(myCapt[(iccnt - 1) % 2]);

        for (int j=0;j<(1000) ;j++)
        {
            for (int i=0;i<4000;i++)
            {

            }
        }

}

//*******************************
//*******************************
int  main(void)
{
    DDRG = 0b11111111;

    int cnt = 0;

    initlcd();
    initTimer();
    initInputCapture();

    while(1)
    {
        ShowCaptureTime2();     

    }
}

最佳答案

我昨天就能找到答案。代码没有问题。脉冲发生器工作不正确!输入错误!!!! – 萨姆软件

关于c - atmega128中输入捕获值是双倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34065075/

相关文章:

c - 将数组放在堆上而不是堆栈上,是否可以消除段错误的可能性?

c - 为什么我的 SPI 通讯不工作? (Atmega644)

c - C 中的 AVR - 将寄存器的值存储在变量中

Python CFFI - 无法在函数调用中使用格式化的 Python 字符串作为字节数组

c - 编写无阻塞connect()代码的理想方法是什么?

c - 相同类型,全部定义,类型冲突

macos - 如何在 Mac OS 上查找用于串行读取的 USB 设备的/dev/名称?

c - 带有两个变量的 switch case

linux - 强制I2C通信安全吗?

c++ - PlatformIO ATMega324P util/delay.h 不准确