Hi, ich nutze die unten aufgeführte Funktion für eine A/D Wandlung. Nun rufe ich diese für 2 Kanäle mit 2 mux werten auf (Kanal0,Kanal1). Wenn ich sie jedoch einmal mit Kanal1 aufgerufen habe, dann bekomme ich nur noch Werte von Kanal 1, auch wenn ich 0 übergebe, wören kann dies liegen? Dank Euch, m. uint16_t ReadChannel(uint8_t mux) { uint8_t i; uint16_t result; /* ADMUX .-----.-----.---.... |REFS1|REFS0| '-----'-----'---... | | | | | | .--. |\| | AVCC | |---------------|0 \ | '--' | | _|_ | |-------. .---------------. | | | | Internal 1.1V |--|1 / | | Reference | |/ | '---------------' | | .--. | .-------.... AREF | |---------------------------o-----| A/D Conf '--' '-------.... .---.-------.-------.-----------------------------------------------. |Nb.| REFS1 | REFS0 | Voltage Reference Selecttion (23.8.1 / P.256) | .---+-------+-------+-----------------------------------------------. | 0 | 0 | 0 | AREF, Internal VRef turned off | .---+-------+-------+-----------------------------------------------. | 1 | 0 | 1 | AVcc with external cap. at AREF | .---+-------+-------+-----------------------------------------------. | 2 | 1 | 0 | Reserverd | .---+-------+-------+-----------------------------------------------. | 3 | 1 | 1 | Int. VRef 1.1V with ext. cap. at AREF | '---'-------'-------'-----------------------------------------------' */ AD_REF_NB0; //Referenzquelle nach o.g. Tab. wählen AD_MUX_CHANNEL(mux); //Kanal waehlen ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler // setzen auf 8 (1) und ADC aktivieren (1) /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */ ADCSRA |= (1<<ADSC); // eine ADC-Wandlung while ( ADCSRA & (1<<ADSC) ) { ; // auf Abschluss der Konvertierung warten } result = ADCW; // ADCW muss einmal gelesen werden, // sonst wird Ergebnis der nächsten Wandlung // nicht übernommen. /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */ result = 0; for( i=0; i<4; i++ ) { ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while ( ADCSRA & (1<<ADSC) ) { ; // auf Abschluss der Konvertierung warten } result += ADCW; // Wandlungsergebnisse aufaddieren } ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2) result /= 4; // Summe durch vier teilen = arithm. Mittelwert /* if(result>=(last+2)) { last=result; } if(result<=(last-2)) { last=result; } */ return result; }
Zeig mal das Makro AD_MUX_CHANNEL Ich wette, es ist so geschrieben, dass es nur Bits setzen aber nicht mehr löschen kann.
Hallo Karl Heinz, ich habe den code irgendwann einfach mal hier aus dem Forum geholt, meine ich. Keine Ahnung wo das Makro liegt, muss dabei sein. Ich habe eben gegoogelt und: Beitrag "ADC Rutine vom GCC-Tutorial" das gefunden, makro ersetzt - läuft. danke. m.
ich torf: hier: #define AD_MUX_CHANNEL(y) ADMUX |= (y&0x3f) ja ja..
hab nun doch das Makro verbessert... #define AD_MUX_CHANNEL(y) ADMUX=(ADMUX&0xc0)|(y&0x3f) danke nochmal...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.