ADC kezelés

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Avatar
Giorgio
DrótVégénSzéndarab
Hozzászólások: 18
Csatlakozott: 2008. január 26. szombat, 7:00

ADC kezelés

Hozzászólás Szerző: Giorgio »

Sziasztok!

(ATmega88-hoz, STK500 tavír).
Egyszerűen nem értem: adott az alábbi program - sima 8 bites átalakítás.
Amikor csak az egyik, vagy másik ADC bemeneti függvényt futtatom, akkor minden rendben van. Azonban, amikor mindkét bemenethez tartozó ADC-t futtatom, akkor mindkét bemenet hatással van mindkét kimenetre.
Lefordítva: amikor a "poti" változóhoz tartozó bemenetet változtatom, akkor az a "motor" változót is befolyásolja.
Meg tudnátok mondani, hogy mit rontottam el? Előre is köszönöm a válaszokat.

És elnézést, de nem tudom, hogyan kell külön ablakos csatolást alkalmazni.

16. szerkesztésem: azt észrevettem, hogy egy 10ms késleltetés segít, de nem értem, hogy miért.

Kód: Egész kijelölése

int main(void)
{
	DDRB = 140;
	DDRC = 0;
	DDRD = 255;

	while(1)
	{
	CHKpoti();
        _delay_ms(10);
	CHKmotor();       
        _delay_ms(10);
	PORTD = poti;	
//	PORTD = motor;
	}
}

int CHKpoti(void)	// Poti
{
	PRR = 0;
	ADMUX = (1<<ADLAR)|(1<<MUX1)|(1<<MUX0);
	ADCSRA = (1<<ADEN)|(1<<ADSC);
	while (!(ADCSRA & (1<<ADIF)))	
	;
	poti = ADCH;
}

int CHKmotor(void)
{
	PRR = 0;
	ADMUX = (1<<ADLAR)|(1<<MUX1);	
	ADCSRA = (1<<ADEN)|(1<<ADSC);
	while (!(ADCSRA & (1<<ADIF)))	
	;	
	motor = ADCH;	
}
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Csak a partszélről:
A PRR regiszter minek?
Ebből INT-l tudsz felkelni, ez a Power reduction belső regiszter... Én nem piszkálnám....

DDRC-t nem kell piszkálni, alapban az értéke 0 (Minden láb bemenet).
ADCH értéke 0...1 lehet, mivel ez a felső bitje az ADC eredménynek!



Az ACME=1 hiányzik (ADC rész az adatlapban)
Illetve mintha nem lenne indítva a mérés.....

De aki C-ben otthon van jobban, majd kijavít....
Avatar
Giorgio
DrótVégénSzéndarab
Hozzászólások: 18
Csatlakozott: 2008. január 26. szombat, 7:00

Hozzászólás Szerző: Giorgio »

Köszönöm a gyors választ.
A PRR-t az adatlapból vettem és valahogyan benne maradt. A teszt miatt be kellett állítanom a kimeneteket. Az ACME bit-et nem értem, olyasmit olvastam, hogy analóg komparátor üzemmódban kell '1'-be lennie és az ADC-nek kikapcsolva. Bár kipróbáltam mindkét állásban, de nem használt.
ADLAR = 1 miatt használom az ADCH-t, nem kell veszett pontosnak lennie.

Amit észrevettem: az a baj, hogy nem várom meg a teljes konverziót és már előtte kiolvasom az értéket, emiatt van az, hogy két egymás utáni konvertálás után a másodiknál, jelen esetben a "motor" változóba még a nem friss ADCH érték kerül bele, hanem az előző konverzió eredménye.

Elvileg az ADIF-os sor pont ezért került bele, de nem működik rendesen.
Ha az ADIF-os sort kikapcsolom és helyette egy 10ms késleltetést (szentségtörés) teszek bele, akkor semmi gond nincs.
Avatar
Giorgio
DrótVégénSzéndarab
Hozzászólások: 18
Csatlakozott: 2008. január 26. szombat, 7:00

Hozzászólás Szerző: Giorgio »

Megtaláltam:

while (ADCSRA & (1<<ADSC));

Az ADSC tökéletes a feladatra. ;-)
Válasz küldése