Gast
#595532
Hallo! Wer kann mir bei folgendem Problem helfen: Mit einem ATmega2560 will ich 16 Analog-Digital-Konverter-Kanäle nutzen. Mit der unten gezeigten Funktion AnalogPort funktioniert das bei den Kanälen 0 bis 7 sehr gut (Spannungsmessung korrekt für U=0 bis 4800 mV). Wenn ich allerdings die Kanäle 8 bis 15 benutzen will, liefert die Funktion einem stark verrauschten Wert, der sich bei Spannungen zwischen 0 und 4.8 V zwischen 3 und 4.8 V bewegt (also nur schwach von der Spannung abhängt). Das Verhalten ist identisch auf zwei verschiedenen Prozessoren, die sich auf ihrer jeweils eigenen Platine befinden. Die Zuordnung des Wertes channel auf die Register ADMUX und ADCSRB habe ich an Tabelle 129, Seite 295 des Prozessormanuals angepasst. Der Compiler ist der von WinAVR. Programmer ist AVRDude und STK200-Dongle. Hier noch die C-Schnipsel: ---------------------------------- Initialisierung: DDRF = 0b00000000; // Port F Pins (ADC1) all input DDRK = 0b00000000; // Port K Pins (ADC2) all input PCMSK2 = 0b00000000; // PCINT23:16=0 (Pin Change INTerrupt disabled) ---------------------------------- Funktion zum Auslesen des ADC mit channel=0...15: float AnalogPort(char channel) { ADMUX = 0b01000000 | (channel & 0b00000111); ADCSRA = 0b11000001; // Bit 7: Enable ADC // Bit 6: Start Conversion // Bits 2,1,0: Teilerverhältnis von 32 (Original 101) // => 131.072 kHz bei 4 MHz Prozessortakt // (muss zwischen 50 kHz und 200 kHz liegen) ADCSRB = channel & 0b00001000; // Bit ACME=0: kein Comparatorbetrieb // Bit MUX5 auf Channel-Bit 3 // wait until end of AD-Conversion while ((ADCSRA & 0b01000000) == 0b01000000); // get result return (ADC*0.0047222*1000); // Faktor zur Kalibrierung in mV } ----------------------------------- Fuse-Bits: LFUSE = 0b11111101 HFUSE = 0b11011001 EFuse = 0b11111111