Danke, ich habe das jetzt ausgebessert. Jetzt sieht mein Programm so aus:
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.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); } } } //==========================================================================================================
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







Zitieren
Lesezeichen