Mam taki fragment kodu:
volatile float d = 0;
volatile bool myFlag = false;
void adcInit()
{
ADMUX |= (1 << REFS0) | (1 << REFS1) | (1 << MUX2) | (1 << MUX0);
ADCSRA |= (1 << ADEN) | (1 << ADIE) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
}
int main(void)
{
uartInit();
adcInit();
sei();
DDRC &= ~(1 << PC5);
while (1)
{
MCUCR |= (1 << SM0) | (1 << SE);
ADCSRA |= (1 << ADSC);
MCUCR = 0x00000000;
if (myFlag)
{
char str[8] = {0};
sprintf(str, "%d.%02u", (int)d, (int)((d - (int)d) * 10000));
for (int i = 0; i < 8; i++)
{
print_char(str[i]);
}
d = 0;
print_newLine();
myFlag = false;
}
_delay_ms(1000);
}
}
ISR(ADC_vect)
{
d = 0.002490234375 * ADC;
//d = (ADCH * 256 + ADCL) * 2.56 / 1024;
myFlag = true;
}
Napięcie które mierze ma 1,582V (zmierzone miernikiem, napięcie biorę z dzielnika napięcia, który jest podłączony do zasilania (5V) i masy układu), natomiast na terminalu pojawia się wartość w okolicach 1,2 - 1,3V i ciągle skacze nawet +- 0,2V i po prostu się nie zgadza z tym co jest w rzeczywistości. Kondensatory i dławik mam podpięte wg. datasheetu, dodatkowo zewnętrzny kwarc. Ponadto gdy zakomentuję linię w przerwaniu i odkomentuję w ten sposób:
//d = 0.002490234375 * ADC;
d = (ADCH * 256 + ADCL) * 2.56 / 1024;
To wyświetla się jedna wartość cały czas i nawet jak wejście ADC podepnę do masy to dalej ta wartość się pojawia, jakby ADC się zawieszał.
W czym jest problem, że pomiar tak skacze i się nie zgadza, a w drugim przypadku w ogóle się "zawiesza"?