- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: konfiguration analoger Pins

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    06.01.2015
    Beiträge
    10

    konfiguration analoger Pins

    Anzeige

    E-Bike
    Hallo zusammen,

    ich hoffe ich bin hier richtig mit meiner Frage. Ich versuche gerade eine Aufgabe zu lösen, wo ich aber ehrlich gesagt nicht ganz verstehe, was der Steller von mir möchte. Vielleicht kann mir einer von euch weiterhelfen?

    Aufgabe:

    Die untenstehenden Programme für die Arduino-Plattform berechnen jeweils Mittelwerte mit unterschiedlichen analogen Eingängen die jede Sekunde ausgelesen werden.
    Zukünftig sollen die zu verwendenden analogen Eingänge mit Hilfe von Konstanten konfigurierbar sein, damit man nur ein Programm benötigt:
    • Die analogen Pins A0-A3 sollen jeweils so konfiguriert werden, dass sie wahlweise in die Mittelwertrechnung eingehen oder auch nicht.
    • Bei Änderung der Konfiguration der zu verwendenden analogen Eingänge, soll der Rest des Programmes nicht geändert werden.

    ****************************
    void setup()
    {
    Serial.begin(115200);
    }

    void loop()
    {
    int a = analogRead(A0);
    int a = analogRead(A2);


    int m = (a+b)/2;
    Serial.println(m);
    delay(1000);
    }

    ************************

    void setup()
    {
    Serial.begin(115200);
    }

    void loop()
    {
    int a = analogRead(A0);
    int a = analogRead(A2);
    int a = analogRead(A3);

    int m = (a+b+c)/3;
    Serial.println(m);
    delay(1000);
    }

  2. #2
    HaWe
    Gast
    Zitat Zitat von Martorinho Beitrag anzeigen
    Hallo zusammen,

    ich hoffe ich bin hier richtig mit meiner Frage. Ich versuche gerade eine Aufgabe zu lösen, wo ich aber ehrlich gesagt nicht ganz verstehe, was der Steller von mir möchte. Vielleicht kann mir einer von euch weiterhelfen?

    Aufgabe:

    Die untenstehenden Programme für die Arduino-Plattform berechnen jeweils Mittelwerte mit unterschiedlichen analogen Eingängen die jede Sekunde ausgelesen werden.
    Zukünftig sollen die zu verwendenden analogen Eingänge mit Hilfe von Konstanten konfigurierbar sein, damit man nur ein Programm benötigt:
    • Die analogen Pins A0-A3 sollen jeweils so konfiguriert werden, dass sie wahlweise in die Mittelwertrechnung eingehen oder auch nicht.
    • Bei Änderung der Konfiguration der zu verwendenden analogen Eingänge, soll der Rest des Programmes nicht geändert werden.

    ****************************
    void setup()
    {
    Serial.begin(115200);
    }

    void loop()
    {
    int a = analogRead(A0);
    int a = analogRead(A2);


    int m = (a+b)/2;
    Serial.println(m);
    delay(1000);
    }

    ************************

    void setup()
    {
    Serial.begin(115200);
    }

    void loop()
    {
    int a = analogRead(A0);
    int a = analogRead(A2); // Fehler! b=...! <<<<<
    int a = analogRead(A3); // Fehler! c=...! <<<<<

    int m = (a+b+c)/3;
    Serial.println(m);
    delay(1000);
    }
    hallo,
    ich verstehe das als Aufgabe, jedem Pin einen "Status" zuzuordnen, also z.B.
    bool Sa0, Sa1, Sa2;

    nur wenn Sa0 true ist, wird A0 in die Summe einbezogen, sonst nicht, das lässt sich im Programm ja wahlweise auf true oder false setzen.
    Sa1 und Sa2 analog.
    Der Nenner vom Quotienten muss dann ntl von 3 auf 2 oder 1 abgeändert werden.

    Da es sich offenbar um eine Hausaufgabe handelt, verrate ich jetzt aber nicht die Lösung.

    Dein Code oben enthält 2 Fehler, ich habe sie markiert.

    HTH!

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    06.01.2015
    Beiträge
    10
    Danke für die schnelle Antwort!!! Genau bei dem Ansatz war ich mir so unsicher. Jetzt weiss ich wie ich an die Aufgabe rangehen muss

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    06.01.2015
    Beiträge
    10
    du hattest mir schon sehr mit deiner Antwort geholfen. Aber ich merke gerade, dass ich doch wieder festhänge. Ich wollte das ganze mit einem switch Befehl angehen, was aber nicht so wirklich funktioniert.

    Wäre für eine Lösung sehr dankbar. Es handelt sich übrigens nicht um eine Hausaufgabe, sondern nur um eine Aufgabe aus einer alten Klausur mit der ich unter anderm lernen möchte, aber keine Ergebnisse habe.

  5. #5
    HaWe
    Gast
    hallo,
    zeig mal deinen Code, den du jetzt hast.
    Ich muss allerdings zugeben, dass ich grundsätzlich kein Freund von switch/case bin, ich bevorzuge if... if... if... oder if...else if...else if...else

    Zunächst muss die Zahl der "true" Schalter gezählt werden;
    dann ist zunächst der Fall zu betrachten, dass alle Schalter auf false stehen, denn dann kann ja gar kein Mittelwert berechnet werden, in dem Fall muss man "ungültig" ausgeben und abbrechen;
    dann ist Schritt für Schritt die Summe der ADC Werte zu berechnen, abhängig vom Schalter State "true".
    Dann ist die Summe durch die Zahl aller Schalter States "true" zu teilen.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    06.01.2015
    Beiträge
    10
    ich glaube ich hänge immer noch beim Verständnis der Aufgabe fest.

    Wir wollen analoge Pins auslesen um dann den Mittelwert zu bilden. Dabei lesen wir aus, wieviel Volt gerade auf dem Pin ist. Jetzt soll ich die Pins mit Hilfe von konstanten konfigurierbar machen. Wie ich einen Mittelwert bilde und wie ich ne if Verschachtelung baue ist mir klar... nur verstehe ich den "Anfang" nicht.

  7. #7
    HaWe
    Gast
    ganau in der Reihenfolge, die ich hier beschrieben habe:
    Zunächst muss die Zahl der "true" Schalter gezählt werden;
    dann ist zunächst der Fall zu betrachten, dass alle Schalter auf false stehen, denn dann kann ja gar kein Mittelwert berechnet werden, in dem Fall muss man "ungültig" ausgeben und abbrechen;
    dann ist Schritt für Schritt die Summe der ADC Werte zu berechnen, abhängig vom Schalter State "true".
    Dann ist die Summe durch die Zahl aller Schalter States "true" zu teilen.
    Anfangszustand aller Schalter States laut setup() kann ja zunächst "true" sein, dann kann man das variieren.

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    897
    Der Mittelwert wird doch gebildet über:
    - Die Summe der AD-Werte aller aktiven Kanäle geteilt durch..
    - ...die Anzahl aller aktiven Kanäle.
    Dann brauchst Du doch nur für die Mittelwertbildung eine Variable "sum" und eine Variable "count"

    Vielleicht ist aber auch für den Youngster das Schwierigste, eine elegante Konfigurationsbeschreibung für die aktiven Kanäle zu finden. Mal als Ansatz dazu: Die Info "aktiv/nicht aktiv" für einen Kanal passt in ein Bit. Ein Byte hat 8 Bits, das reicht auf jeden Fall, um bitcodiert die Zustände aller vier Kanäle abzufragen. Du kannst also über eine Variable "config" die Konfiguration aller Kanäle zusammenfassen. Bit0 zeigt an, dass AD0 aktiv ist, Bit1 zeigt den Zustand von AD1, usw...
    Wie man so ein Bit abfragt, weißt Du? Klar, durch eine Bitmaske! Z.B. if (config & (0x01 << 2) != 0) gibt an, ob AD2 aktiv sein soll.

    Man kann so jetzt alle 4 Kanäle einzeln durchgehen mit:
    if (config & (0x01 << 0) != 0)
    {
    sum+= Wert von AD0;
    count+=1;
    }
    if (config & (0x01 << 1) != 0)
    {
    sum+= Wert von AD1;
    count+=1;
    }
    …(Kanäle 2 und 3 auch noch)
    Mittelwert = sum/count


    Eleganter geht's aber über ne Schleife:
    for (int i=0; i<4;i++)
    {
    if (config & (0x01 << i) != 0)
    {
    sum+= Wert von AD(i); //Achtung, prüfen: Ist A0=0, A1=1,... dann kann man auch in analogRead den Schleifenzähler i als Argument reinstecken
    count+=1;
    }
    }

    Mittelwert = sum/count

    Last but not least:
    Was passiert, wenn config=0 ist? dann gibt's eine Division durch 0 bei "Mittelwert = sum/Count". Das sollte man abfragen mit "wenn count = 0, dann Mittelwert = 0xFFFF, ansonsten Mittelwert = sum/Count".
    Rundungsfehler: Bei der Messung auf allen vier Kanälen wurde z.B. sum = 3 und Count = 4 ermittelt. Bei der Ganzzahldivision wird immer abgerundet, Obwohl der Mittelwert 0,75 näher an 1 liegt, bekommst Du das Ergebnis 0. Die Rundung kannst Du über "Mittelwert = (((2*sum)/ count)+1)/2 aufpeppen.
    Geändert von Holomino (12.07.2018 um 16:35 Uhr)

  9. #9
    HaWe
    Gast
    nein, bei count=0 ist der Mittelwert nicht Null, und auch nicht 0xFFFF, sondern undefiniert, also überhaupt nicht existent.
    Für Anfängerzwecke würde ich jedem ADC Kanal eine eigene Statusvariable zuweisen, das macht den Code lesbarer und verständlicher.
    Den Rundungsfehler kann man auch dadurch "aufpeppen", dass man die Messwerte in eine
    float sum ;
    aufaddiert, aber so weit sind wir ja noch gar nicht.
    Geändert von HaWe (13.07.2018 um 09:29 Uhr)

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    06.01.2015
    Beiträge
    10
    Danke euch, ich hab's jetzt. Auch wenn ihr mir geholfen habt, habe ich mich sehr viel mit der Aufgabe auseinander gesetzt und natürlich auch viel gelernt! Danke!

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 19.06.2018, 09:39
  2. Konfiguration Port Pins bei Powerdown (Stromsparen)
    Von Alcedo7 im Forum AVR Hardwarethemen
    Antworten: 3
    Letzter Beitrag: 29.12.2010, 01:05
  3. I2C Bus mit PIC18F252 Konfiguration
    Von Adonai im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 11
    Letzter Beitrag: 05.12.2006, 09:21
  4. Konfiguration der Pullup-Widerstände
    Von Step im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 24.08.2006, 00:16
  5. Konfiguration eines Keyboards???
    Von EDatabaseError im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 07.07.2005, 16:42

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests