Danke, ich habe das jetzt ausgebessert. Jetzt sieht mein Programm so aus:
Code:
#include <avr/io.h>
#include <stdint.h>
#define F_CPU 3686400UL
#include <util/delay.h>
// LEDs an PORT B 3, 4, 5
// POTI an PORT C 0
//===========================================================================================================
int adc (uint8_t mux)
{ uint8_t i;
uint16_t ergebnis=0;
ADCSRA=(1<<ADEN); // ADC ein
ADCSRA=(1<<ADPS2)|(1<<ADPS0); // Frequenzteiler 32
ADMUX=(1<<REFS0); // Interne Refrerenzspg 5V
ADMUX=mux; // ADC an Pin mux
ADCSRA|=(1<<ADSC); // Dummy Load
while(ADCSRA&(1<<ADSC)) {} // Warten bis Messung fertig
for(i=0;i<5;i++) // 5 Mal messen
{ ADCSRA|=(1<<ADSC);
while(ADCSRA&(1<<ADSC)) {} // Warten bis messung fertig
ergebnis=ergebnis+ADCW; // zusammenzählen
}
ADCSRA&=~(1<<ADEN); // ADC ausschalten
ergebnis=ergebnis/5; // Mittelwert bestimmen
return ergebnis; // Ergebnis zurückgeben
}
//=========================================================================================================
int main (void)
{ uint16_t wandlung;
DDRC=0x00;
DDRB=0xff;
PORTB=0xff;
while(1)
{
wandlung=adc(0);
_delay_ms(50);
if(wandlung<341)
{ PORTB|=(1<<3);
PORTB&=~(1<<4);
PORTB&=~(1<<5);
}
if(wandlung>341 && wandlung<682)
{ PORTB|=(1<<4);
PORTB&=~(1<<3);
PORTB&=~(1<<5);
}
if(wandlung>682 && wandlung<1024)
{ PORTB|=(1<<5);
PORTB&=~(1<<3);
PORTB&=~(1<<4);
}
}
}
//==========================================================================================================
Jetzt leuchtet nur die grüne led, die auf B3 hängt, das heißt, es wird immer die erste if anweisung ausgeführt, egal wie ich das poti drehe, aber ich weiß nicht warum. Im tutorial von microcontroller.net steht, dass ADCW den wert 0-1024 annehmen kann. Diese Menge habe ich gedrittelt, und auf die 3 if anweisungen aufgeteilt.
Ich verstehe nicht ganz warum 1024, ein 16 bit Datentyp geht ja bis 2^16 = 65536. Oder hat das garnichts mit den 16 bit zu tun?
MfG
Christoph
Lesezeichen