Hi,
code könnte helfen stimmt :-)
also ich hab zwei Versionen.
Die eine auf die es mir ankommt mißt nur an einem Pin.
Die andere hab ich aus dem Example der Lib und die misst alle
AD-Eingänge.
Ich wille einen LM35 auslesen. Der ist aber im Moment noch nicht da.
Deshalb habe ich ein Potentiometer an AD0 angeschlossen. Ich hab auch
mit einem Messgerät nachgemessen. Es ist also alles richtig
angeschlossen.
Die Hauptschleife sieht so aus:
while(1)
{
rprintf("Gemessener ADC-Wert : %d \r\n",getLM35ADCValue());
//gemessene Spannung
short voltage = (short)getLM35MeasuredVoltage();
rprintf("Gemessene Spannung : %d \r\n", voltage);
//Gemessene Temperatur
short temperature = (short)getLM35MeasuredTemperature();
rprintf("Gemessene Temperatur: %d \r\n",temperature);
}
**********************************************
**Die Methoden die ich benutzte kommen hier:**
**********************************************
void initLM35(){
// turn on and initialize A/D converter
a2dInit();
// configure a2d port pin (PORTA) as input
unsigned char mask = ~(0x01 << LM35_ADC_CHANNEL);
DDRA = DDRA & mask;
// pull-up resistor off
PORTA = PORTA & mask;
//AD-Cahannel wählen
a2dSetChannel (LM35_ADC_CHANNEL);
//set prescaler
a2dSetPrescaler(ADC_PRESCALE_DIV128);
//set adc reference
a2dSetReference(ADC_REFERENCE_AVCC);
}
short getLM35ADCValue(){
short adcValue = a2dConvert10bit(LM35_ADC_CHANNEL);
return(adcValue);
}
float getLM35MeasuredVoltage(){
short adcValue = getLM35ADCValue();
float measuredVoltage = (adcValue * REFERENCE_VOLTAGE)/1024;
return(measuredVoltage);
}
float getLM35MeasuredTemperature(){
float LM35MeasuredVoltage = getLM35MeasuredVoltage();
float measuredTemperature = LM35MeasuredVoltage *
DIRECTLY_PROPORTIONAL_FACTOR;
return(measuredTemperature);
}
void a2dInit(void)
{
sbi(ADCSR, ADEN); // enable ADC (turn on ADC power)
cbi(ADCSR, ADFR); // default to single sample convert mode
a2dSetPrescaler(ADC_PRESCALE); // set default prescaler
a2dSetReference(ADC_REFERENCE); // set default reference
cbi(ADMUX, ADLAR); // set to right-adjusted result
sbi(ADCSR, ADIE); // enable ADC interrupts
a2dCompleteFlag = FALSE; // clear conversion complete flag
sei(); // turn on interrupts (if not already on)
}
// configure A2D converter clock division (prescaling)
void a2dSetPrescaler(unsigned char prescale)
{
outb(ADCSR, ((inb(ADCSR) & ~ADC_PRESCALE_MASK) | prescale));
}
// configure A2D converter voltage reference
void a2dSetReference(unsigned char ref)
{
outb(ADMUX, ((inb(ADMUX) & ~ADC_REFERENCE_MASK) | (ref<<6)));
}
// sets the a2d input channel
void a2dSetChannel(unsigned char ch)
{
outb(ADMUX, (inb(ADMUX) & ~ADC_MUX_MASK) | (ch & ADC_MUX_MASK)); //
set channel
}
// Perform a 10-bit conversion
// starts conversion, waits until conversion is done, and returns result
unsigned short a2dConvert10bit(unsigned char ch)
{
a2dCompleteFlag = FALSE; // clear conversion complete flag
outb(ADMUX, (inb(ADMUX) & ~ADC_MUX_MASK) | (ch & ADC_MUX_MASK)); //
set channel
sbi(ADCSR, ADIF); // clear hardware "conversion complete"
flag
sbi(ADCSR, ADSC); // start conversion
//while(!a2dCompleteFlag); // wait until conversion complete
//while( bit_is_clear(ADCSR, ADIF) ); // wait until conversion
complete
while( bit_is_set(ADCSR, ADSC) ); // wait until conversion complete
// CAUTION: MUST READ ADCL BEFORE ADCH!!!
return (inb(ADCL) | (inb(ADCH)<<8)); // read ADC (full 10 bits);
}
Ich hoffe das ist nicht zu unübersichtlich .....
schonmal vielen Dank
Michael