我试图简单地从我的arduino Pro mini上的A0获得一个模拟读数,但我无法获得存储在adc寄存器中的值。应该发生的是,模拟信号将被放入寄存器ADCL和ADCH,然后ADC中断将被触发。我在A0上设置了一个分压器,应该只读2.5V,但我的中断没有触发,并且我无法从ADCH或ADCL获得值。我可以在arduino得到一个读数,这样我就能知道硬件是如何工作的。当我运行这个程序时,我得到一个0的连续打印到我的终端,这告诉我,低和高的值永远不会像它们在中断中应该改变的那样改变。
下面是我的代码:
# 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);
}发布于 2017-09-29 07:49:03
您应该将low和high声明为易失性,因为您是从中断和主循环访问它们的:
volatile uint8_t low;
volatile uint8_t high;否则,编译器可以自由地通过将这些变量的读数移到循环之前来优化循环。
或者,您可以尝试在循环中设置内存屏障,但这是较少人使用的方法:大多数嵌入式开发人员倾向于只使用volatile。
我没有测试你的代码,所以可能还有其他错误。
要进一步调试,您应该尝试在中断中添加low = 44;和high += 1;,以确保中断正在运行。
https://stackoverflow.com/questions/46479319
复制相似问题