Hallo!
Ich habe mein erstes Programm mit dem Internen ADC Wandler des mega8 geschrieben, aber es funktioniert noch nicht ganz.
Code:#include <avr/io.h> #include <stdint.h> #define F_CPU 3686400UL #include <util/delay.h> // LEDs: // - Grün: PORT C 0 // - Gelb: PORT C 3 // - Rot: PORT C 5 // POTI an PORT B 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<<REFS1)|(1<<REFS0); // Interne Refrerenzspg ein 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+ADC; // Mittelwert bestimmen } ADCSRA&=~(1<<ADEN); // ADC ausschalten ergebnis=ergebnis/5; return ergebnis; // Ergebnis zurückgeben } //========================================================================================================= int main (void) { DDRD=0x00; DDRB=0x00; DDRC=0xff; PORTC=0x00; uint16_t wandlung; while(1) { wandlung=adc(0); if(wandlung<21845) { PORTC|=(1<<0); PORTC&=~(1<<3); PORTC&=~(1<<5); } if(wandlung>21845 && wandlung<43690) { PORTC|=(1<<3); PORTC&=~(1<<0); PORTC&=~(1<<5); } if(wandlung>43690 && wandlung<65535) { PORTC|=(1<<5); PORTC&=~(1<<0); PORTC&=~(1<<3); } else{} } } //==========================================================================================================
Wenn ich das Programm in den Controller brenne, leuchtet nur die Rote Led, d.h. es wird immer der else-Zweig im Hauptprogramm ausgeführt.
Ich glaube es liegt daran, dass ich nicht weiß, wie man dem uC sagt, dass das Poti auf PORT B ist, mit ADMUX=0 sagt man ihm ja nur, dass der ADC Pin der Pin 0 ist.
Außerdem kenn ich mich mit der Referenzspg. nicht so gut aus. Man kann also nur Spannungen von 0-2,54 Volt in den Controller schicken, das halte ich auch ein, aber ich weiß nicht, ob die Einstellungen ADMUX|=(1<<REFS1)|(1<<REFS0); stimmen.
Grüße,
Christoph
Lesezeichen