Dobrý den,
chtěl bych použít u mcu ATmega16 ADC Noise Reduction Mode. Odpovídající část programu vypadá takto:
#ifndef F_CPU
#define F_CPU 1000000UL
#endif
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include "lcd.h"
#define KvantizacniKrok 0.009775171
void ADC_Config(void)
{
//Konfigurace ADC
ADCSRA |= ((1<<ADPS1)|(1<<ADPS0)); //1 000 000:8 = 125 000
ADMUX &= ~(1<<ADLAR); //Volba zarovnání bitů
ADMUX |= 1<<REFS0; //Volba napěťové reference
ADMUX |= ((1<<MUX2)|(1<<MUX1)|(1<<MUX0)); //Volba kanálu ADC7
ADCSRA |= 1<<ADIE; //Povolení přerušení od ADC
ADCSRA |= 1<<ADEN; //Zapnutí ADC
sei(); //Globální povolení přerušení
MCUCR &= ((1<<SM2)|(1<<SM1));
MCUCR |= 1<<SM0; //Nastavení módu - ADC Noise Reduction Mode
MCUCR |= 1<<SE; //Povolit spánek
sleep_mode();
}
void main(void)
{
LCD_Init(); //Inicializace LCD
ADC_Config(); //Konfigurace ADC
while(1)
{
}
}
ISR(ADC_vect) //ISR = Interrupt Service Routine, vektor přerušení pro A/D převodník - ADC_vect
{
uint8_t theLowADC = ADCL;
uint16_t theTenBitResults = ADCH<<8 | theLowADC; //Uložení 10bitů převodníku do jedné proměnné
double MeasuringSignal;
MeasuringSignal = (double)theTenBitResults*KvantizacniKrok;
NamereneNapeti(MeasuringSignal);
Vysledek(theTenBitResults);
_delay_ms(300);
}
Myslím, že program takto provede pouze první konverzi. Jak ho tedy poupravit, aby pracoval kontinuálně? Napadlo mě napsat uživatelskou funkci a volat ji na konci rutiny přerušení (po _delay_ms(300);). Nevím však jaké bity v řídících reg. A/D převodníku v té funkci nastavovat. Datasheet jsem četl a moc moudrý jsem z něj nebyl.