Go Down

Topic: [Projekt] ADC in OOP (Read 1 time) previous topic - next topic

combie

#15
Sep 03, 2017, 11:24 pm Last Edit: Sep 04, 2017, 09:16 am by combie
Quote
Deswegen die einmalige Berechnung nach µC einschalten
Das kann man dem Kompiler überlassen.

Nur setzen muss man es noch:
Code: [Select]
#include <Adc.h>



Adc adc;


// Default ADC Clock Vorteiler generieren:
// (der wiring.c entnommen und leicht modifiziert)
#ifndef ADC_DEFAULT_CLOCK_PRESCALER
  #if F_CPU >= 16000000 // 16 MHz / 128 = 125 KHz
    #define ADC_DEFAULT_CLOCK_PRESCALER  Adc::DIV_128   
  #elif F_CPU >= 8000000 // 8 MHz / 64 = 125 KHz
    #define ADC_DEFAULT_CLOCK_PRESCALER  Adc::DIV_64   
  #elif F_CPU >= 4000000 // 4 MHz / 32 = 125 KHz
    #define ADC_DEFAULT_CLOCK_PRESCALER  Adc::DIV_32
  #elif F_CPU >= 2000000 // 2 MHz / 16 = 125 KHz
    #define ADC_DEFAULT_CLOCK_PRESCALER  Adc::DIV_16
  #elif F_CPU >= 1000000 // 1 MHz / 8 = 125 KHz
    #define ADC_DEFAULT_CLOCK_PRESCALER  Adc::DIV_8   
  #elif F_CPU >= 500000 // 0.5 MHz / 4 = 125 KHz
    #define ADC_DEFAULT_CLOCK_PRESCALER  Adc::DIV_4   
  #else // 128 kHz / 2 = 64 KHz -> This is the closest you can get, the prescaler is 2
    #define ADC_DEFAULT_CLOCK_PRESCALER  Adc::DIV_2   
  #endif
#endif





void  setup()
{
   Serial.begin(9600);

   adc  .enable()
        .setResolution(Adc::RES_10BIT)
        .setClockDivisor(ADC_DEFAULT_CLOCK_PRESCALER)
        .setReference(Adc::REF_VCC)
        .setSource(Adc::MUX_ADC0);

  Serial.print("ADC_DEFAULT_CLOCK_PRESCALER ");
  Serial.println(ADC_DEFAULT_CLOCK_PRESCALER);
}

void loop()
{
  Serial.println(adc());
  delay(1000);
 }


Quote
Du möchtest eine Klasse schreiben die flexibel reagieren kann.
Nein, das möchte ich nicht!
Ich möchte die vollständige Macht über den ADC!
Es soll kein Eigenleben entwickeln, welches ich nicht zu 100% unter Kontrolle habe.

Gegen die Erstellung eines Defaultwertes habe ich nichts!
Aber gegen den automatischen Festlegungszwang, auf einen Wert, egal, ob zur Laufzeit, oder zur Kompilezeit, wehre ich mich, mit allen mir zur Verfügung stehenden, Mitteln.
Der Anwender, auch ich, soll das einstellen dürfen, was ihm sinnvoll erscheint.

Bedenke, selbst du hast eben eingesehen, dass:
Quote
Unabhängig vom µC Takt muss man in einem Fenster zwischen 50 und 200kHz landen.
Keine unumstößliche Wahrheit ist:
Quote
Mit 8Bit kann man bis 1000kHz gehen.
Da ich keiner Klasse, auch dieser nicht, das Hellsehen beibringen kann, muss auch der Divisor einstellbar bleiben.


//EDIT:
Update des Anhangs, im ersten Posing.
Automatische Berechnung des default prescalers und ein Beispiel wie man ihn setzt.
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Doc_Arduino

Hallo,

ich kann deiner Logik nicht mehr folgen. Auf der einen Seite willst du eine Klasse schreiben die maximalen Komfort bieten soll und auf der anderen soll der Anwender von Hand den Prescaler raussuchen?
Unter den einstellbaren Parametern sind bestimmt unter anderen ob 10Bit oder 8 Bit Auflösung genutzt werden sollen. An Hand daran kann man den passenden Prescaler berechnen lassen. Wo ist das Problem? Den Endanwender interessiert es nicht welcher Prescaler eingestellt ist. Dem interessiert nur das der ADC mit dem richtigen Takt taktet.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

combie

Quote
Auf der einen Seite willst du eine Klasse schreiben die maximalen Komfort bieten soll
Nein, das stimmt nicht!

Das habe ich nie gesagt!
Das werde ich auch nicht sagen.
Und das meine ich auch nicht.

Es ist mir ein Rätsel, warum du darauf beharrst.....
Eben sage ich schon:
Quote
Nein, das möchte ich nicht!
Ich möchte die vollständige Macht über den ADC!
In der neuen Version, im Eingangsposting, habe ich deine Anregung, so weit es mir möglich ist aufgenommen.
Es wird dort automatisch, vom Kompiler ein Defaultwert erstellt. Welcher bei ca 125kHz ADC Takt liegt.

Diesen kann man nutzen, wenn man möchte.
Soweit konnte ich dir gerne entgegen kommen.
Habe auch extra ein Beispiel hinzugefügt, welches die Verwendung zeigt.




Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Doc_Arduino

Hallo,

das kleine Problem ist, wir sind unterschiedlicher Auffassung der Definition"flexibel". Du fragst auf feste µC Frequenzen ab. Wenn jemand mit 20 oder 12MHz oder sonstwas um die Ecke kommt, funktioniert es nicht. Aber gut, lasse dich deswegen nicht aus der Ruhe bringen, mach einfach weiter wie du es möchtest ...

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

combie

#19
Sep 05, 2017, 12:19 pm Last Edit: Sep 05, 2017, 12:27 pm by combie
Quote
Wenn jemand mit 20 oder 12MHz oder sonstwas um die Ecke kommt, funktioniert es nicht.
Wie kommst du darauf?


Natürlich funktioniert die ADC_DEFAULT_CLOCK_PRESCALER Berechnung, für alle F_CPU von 20MHz bis runter zu 100kHz, perfekt.

Es kommt immer ein ADC-Takt von 200kHz bis 50kHz dabei rum.
Egal, wie krumm F_CPU ist.
Das ist doch (fast) genau das, was du dir gewünscht hast, oder?

(Oder habe ich da was wesentliches übersehen?)

Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Doc_Arduino

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?


Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

combie

#21
Sep 05, 2017, 01:09 pm Last Edit: Sep 05, 2017, 01:54 pm by combie
Code: [Select]
 #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:
Code: [Select]
#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.




Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

combie


Besser:
Code: [Select]


#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
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Doc_Arduino

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


Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

combie

#24
Sep 05, 2017, 04:03 pm Last Edit: Sep 05, 2017, 04:13 pm by combie
Quote
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! ;)
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Doc_Arduino

Hallo combie,

Quote
Ich finde es richtig gut, dass wir das beredet haben!
Ich auch, dass kannste glauben.  :)
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Go Up