Django
April 16, 2015, 1:14pm
1
Dobrý den,
chtěl bych se zeptal, potřebuji do ATmegy16 načítat dvě napětí a dále s nimi pracovat v programu. Mám nastavené potřebné registry u ad převodníku, ale potřeboval bych tuto hodnotu uložit do proměné. Problém je s tím že mi přichází dvě takže potřebuji aby na portuA s pinu 0 mi šlo do jedné proměnné a s pinu 1 do druhé proměnné. Nevíte jak tyto hodnoty převést do intu nebo floatu? abych snimi mohl snadno pracovat.
administrator: přejmenováno z "adc avr ATmega16"
Co takhle :
[code]
unsigned int Read_ADC(unsigned char channel)
{
ADMUX &= 0xF0; // vloz cislo kanala, vymaskuj nepouzite bity
ADMUX |= channel & 0x0F;
ADCSRA |= (1 << ADSC); // start prevodu A/D
while(!(ADCSRA & (1<<ADIF))); // cekej na priznak skonceni prevodu
return ADC; // navratova hodnota - vysledek A/D prevodu
}
int main(void)
{
unsigned int adc, adc1, adc2 ;
ADMUX |= (1 << REFS0); //reference 5V + pridano ADLAR (pro rozliseni 8 bitu)
ADCSRA |= (1 << ADEN) | (1 << ADIF) | (1 <<ADPS2) | (1 <<ADPS1) | (1 <<ADPS0);
// povoleni AD prevodnika, Interrupt flag, preddelicka 128 pri frekvencii hodin 8MHz
sei(); // povol globalni preruseni
while(1)
{
adc = Read_ADC(0); // mereni napeti ADC0
adc1= Read_ADC(1); // mereni napeti ADC1
adc2= Read_ADC(2); // mereni napeti ADC2
} [/code]
Django
April 16, 2015, 4:14pm
3
Super moc děkuji to mi pomůže
Jirka2
June 25, 2015, 8:40pm
4
Já jsem se učil pracovat s A/D převodníkem atmegy na tajned.cz/2013/12/zaklady-ov … ik-1-cast/ . Je tu i spousta jiných věcí, které můžou pomoc.
AB1
(AB)
June 27, 2015, 3:38am
5
Ve funkci Read_ADC() chybí vymazání příznaku.
Já používám toto:
[code]#define REF_AVCC (1<<REFS0)
#define REF_2_56V (1<<REFS0)|(1<<REFS1)
unsigned int adc_read(unsigned char channel)
{
ADMUX = REF_AVCC | channel;
ADCSRA |= (1 << ADSC); // start prevodu
while(ADCSRA & (1<<ADSC)); // cekej na skonceni prevodu
return ADC;
}
[/code]