Archiv verlassen und diese Seite im Standarddesign anzeigen : klassse für adc
hallo,
ich hab n problem mit meiner klasse für den adc.
beim debuggen scheint das ganze zu funktioniern, und man kann damit arbeitn, nur dummerweise aufm controller dann nich.
ich hab die klasse zusammen mit den methoden mal in ne datei verpackt und hochgeladen.
freu mich über jede hilfe. 8-[
Du wartest auf den Interrupt, aber der ist gar nicht enabled.
Statt dessen ist folgendes besser:
inline uint8_t readADC0( void )
{
ADCSRA |= (1<<ADSC); //start conversion
// wait until conversion complete
while ( ADCSRA & (1<<ADSC) )
{
;
}
return ADCH; // 8 bit read
}
void initADC( uint8_t adcPrescaler )
{
// External VRef (2.5V), ADC Pin0, Left adjusted result (we use only 8 bits)
// hence ADCSRB doesn't need modification
ADMUX = (1<<ADLAR);
DIDR0 = (1<<ADC0D);
// prescaler 64 ( =288KHz at 18.432MHz CPU clock)
// prescaler 128( =144KHz at 18.432MHz CPU clock)--> | (1<<ADPS0)
ADCSRA = (1<<ADEN) | adcPrescaler;
}
Ich weiß zwar nicht, was bei Dir da nicht klappt, aber das hier ist misst
m_AnalogData[Channel] = ADCL; // gelesenes Signal in vor-
m_AnalogData[Channel] += ADCH;
Du mußt die zwei Bits von ADCH an die richtige Stelle schieben und nicht addieren, etwa so
m_AnalogData[Channel] = ADCL; // gelesenes Signal in vor-
m_AnalogData[Channel] += (ADCH<<8);
soweit ich weiß kann ma mit ADC beide register gleichzeitig auslesen, da muss ma sich dann keine sorgen machen :)
Wenn Du beide register willst:
uint16_t result = ADC;
Den Rest macht der Compiler.
ich lieber compiler ;) ASM is irgendwie nicht meine welt :P
naja und noch ein kleiner tipp am rande, ich weiß jetzt net ob das der compiler macht, aber maskier die obersten 6 bit aus (wenn du 10bit ADC) hast ;)
hm. danke erstmal.
also auf meim stk500 funktioniert das ganze jetzt jedenfalls.
muss ich wohl n fehler auf meiner platine haben.
danke nochmal. :)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.