tut mir leid, aber ich sehe in deinem Code nur #defines.
An welcher Stelle reagierst du auf andere µC Takte, abweichend der #defines?
Falls du das vor meinen Augen versteckt machst, an welcher Stelle prüfst du ob das Ergebnis im "kHz Fenster" liegt?
#if F_CPU >= 16000000 // 16 MHz / 128 = 125 KHz
#define ADC_DEFAULT_CLOCK_PRESCALER Adc::DIV_128
Wenn F_CPU größer, oder gleich 16MHz dann Teiler 128
Das ist der größte mögliche Teiler.
Bei 20MHz sind das dann 156,x kHz ADC-Takt
Sollte diese Entscheidung nicht wahr geworden sein, folgt der nächste Test:
#elif F_CPU >= 8000000 // 8 MHz / 64 = 125 KHz
#define ADC_DEFAULT_CLOCK_PRESCALER Adc::DIV_64
Wenn F_CPU größer, oder gleich 8MHz dann Teiler 64
Bei 8MHz sind das dann 125 kHz ADC-Takt
Sollte diese Entscheidung nicht wahr geworden sein, folgt der nächste Test.
usw. bis zum Ende
So ist gewährleistet, dass der Default ADC-Takt immer zwischen 200kHz und 50kHz liegt.
Siehe : Nachtrag
Ausnahme:
Wenn die Taktfrequenz unter 100kHz liegt, ist der ADC (offiziell) nicht mehr nutzbar.
Aber da kann man sowieso nichts gegen machen.
Jetzt könnte man natürlich darüber streiten, ob die Umschaltstufen geschickt verteilt sind.
Ich haben den Code, nahezu unverändert, dem Arduino Core entnommen.
------------Nachtrag ----------
Ich sehe schon!
Die Stufen sind nicht geschickt verteilt.
Die werde ich nochmal exakt berechnen und abweichend von der Arduino Vorlage neu besetzen.
Danke, für die Inspiration.
Ist in der nächsten Version mit drin.
Besser:
#ifndef ADC_DEFAULT_CLOCK_PRESCALER
#if F_CPU > 6400000
#define ADC_DEFAULT_CLOCK_PRESCALER Adc::DIV_128
#elif F_CPU > 3200000
#define ADC_DEFAULT_CLOCK_PRESCALER Adc::DIV_64
#elif F_CPU > 1600000
#define ADC_DEFAULT_CLOCK_PRESCALER Adc::DIV_32
#elif F_CPU > 800000
#define ADC_DEFAULT_CLOCK_PRESCALER Adc::DIV_16
#elif F_CPU > 400000
#define ADC_DEFAULT_CLOCK_PRESCALER Adc::DIV_8
#elif F_CPU > 200000
#define ADC_DEFAULT_CLOCK_PRESCALER Adc::DIV_4
#else
#define ADC_DEFAULT_CLOCK_PRESCALER Adc::DIV_2
#endif
#endif
Hallo,
aja, okay, hatte übersehen das du mit > ganze Bereiche abfragst. Sorry.
Unterm Strich kommt am Ende das Gleiche raus nur mit anderen Ansatz.
Alles gut - weitermachen. ![]()
Unterm Strich kommt am Ende das Gleiche raus nur mit anderen Ansatz.
So sollte es sein!
Anregung von dir übernommen, und in meinen Code eingepasst.
Ich finde es richtig gut, dass wir das beredet haben!
Denn sonst hätte ich diesen erstaunlichen Bug im Arduino Core vermutlich nicht gefunden.
Ich habe den Code nämlich stumpf übernommen, ohne ihn zu überprüfen.
Mal abwarten, vielleicht hat ja demnächst die ganze Arduino Gemeinde was davon.....
Du hast also, obwohl du gründlich daneben gelegen hast, die Welt verbessert! ![]()
Hallo combie,
Ich finde es richtig gut, dass wir das beredet haben!
Ich auch, dass kannste glauben. ![]()