[Projekt] ADC in OOP

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. :slight_smile:

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.....

:wink: Du hast also, obwohl du gründlich daneben gelegen hast, die Welt verbessert! :wink:

Hallo combie,

Ich finde es richtig gut, dass wir das beredet haben!

Ich auch, dass kannste glauben. :slight_smile: