首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法触发ADC中断

无法触发ADC中断
EN

Stack Overflow用户
提问于 2017-09-29 06:43:59
回答 1查看 892关注 0票数 0

我试图简单地从我的arduino Pro mini上的A0获得一个模拟读数,但我无法获得存储在adc寄存器中的值。应该发生的是,模拟信号将被放入寄存器ADCL和ADCH,然后ADC中断将被触发。我在A0上设置了一个分压器,应该只读2.5V,但我的中断没有触发,并且我无法从ADCH或ADCL获得值。我可以在arduino得到一个读数,这样我就能知道硬件是如何工作的。当我运行这个程序时,我得到一个0的连续打印到我的终端,这告诉我,低和高的值永远不会像它们在中断中应该改变的那样改变。

下面是我的代码:

代码语言:javascript
复制
# define F_CPU 16000000L
#include "time.h"
#include <avr/io.h>
#include <math.h>
#include <util/delay.h>    // including the avr delay lib
#include <util/delay.h>     // Including the avr delay lib
#include "usart.h"
#include "usart.cpp"
#include <stdio.h>
#include <avr/interrupt.h>

uint8_t low,high;

int main(void)
{

TCCR0B = (1<<CS02) | (1<<CS00);
USART_Init(MYUBRR);

DDRC = 0x0 ;
ADCSRA = (1<<ADEN) | (0<<ADIF); //activate adc & clear ADIF
ADMUX = (0<<ADLAR); //keep right adjusted
ADMUX = (1<<REFS0) | (0<<MUX2) | (0<<MUX1) | (0<<MUX0);//set ref as vcc, input as 0
ADCSRA = (1<<ADIE)  | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);//enable adc interrupt & divide clock by 124
DIDR0 = (0<<ADC0D); 

sei();

ADCSRA = (1<<ADSC);//begin conversion



while (1) 
{
        while(ADSC==1)//wait for conversion to complete
        {
            sei();
        }

    USART_Send_int(low);
    USART_Send_int(high);
    _delay_ms(100);

    ADCSRA = (1<<ADSC);

}
}

ISR(ADC_vect) //interrupt to trigger when conversion is complete
{
low = ADCL;
high = ADCH;
//ADCSRA = (1<<ADSC);
}
EN

回答 1

Stack Overflow用户

发布于 2017-09-29 07:49:03

您应该将lowhigh声明为易失性,因为您是从中断和主循环访问它们的:

代码语言:javascript
复制
volatile uint8_t low;
volatile uint8_t high;

否则,编译器可以自由地通过将这些变量的读数移到循环之前来优化循环。

或者,您可以尝试在循环中设置内存屏障,但这是较少人使用的方法:大多数嵌入式开发人员倾向于只使用volatile

我没有测试你的代码,所以可能还有其他错误。

要进一步调试,您应该尝试在中断中添加low = 44;high += 1;,以确保中断正在运行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46479319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档