if ODER ODER ODER Abfrage aus EEprom

Hallo zusammen ..

Ich steh gerade etwas auf dem Schlauch. Warum funktioniert angehängte If Abfrage wohl nicht ? Sollte doch eigentlich, oder?

byte  att_dB, range ;

void setup()
{

 // EEprom Werte einlesen
 range = EEPROM.read(0);
 att_dB = EEPROM.read(1);
 delay(50);
  
 // Fuer den allerersten Start vorbereiten (Wenn att_dB noch nicht gesetzt)
 if (att_dB != 0 || att_dB != 3 || att_dB != 6 || att_dB != 10 || att_dB != 20
 || att_dB != 30 || att_dB != 40 || att_dB != 50 || att_dB != 60) 
 {
   att_dB = 3;   // default ATT 3 dB
   range = 3;    // default Range 2.2 GHz 
  
   eeprom_write_range();
   delay(50);
   eeprom_write_att_dB();
   delay(50);
 }

 analogReference (INTERNAL2V56);
}

Steht nun z.B. 30 im EEprom ignoriert er das und schreibt mir wieder den default-wert 3 rein. Denn sollte er ja nur schreiben wenn nicht einer der Werte bereits gespeichert ist.

Über eine Hilfestellung würde ich mich freuen. Danke!

Gruß Wolle

Ich denke, die Werte im if sind die, die Du überprüfen willst. Bei != ist dann das && die sinnvollere Verknüpfung.

Gruß Tommy

Test:

byte  att_dB;

void setup()
{
  Serial.begin(9600);
  Serial.println(F("Los geht's"));
  for (att_dB = 0; att_dB < 61; att_dB++) {
    Serial.print(att_dB);
    if (att_dB != 0 && att_dB != 3 && att_dB != 6 && att_dB != 10 && att_dB != 20 && att_dB != 30 && att_dB != 40 && att_dB != 50 && att_dB != 60)
    {
      Serial.println(F("\tkein Standardwert"));
    } else {
      Serial.println(F("\tStandardwert"));
    }
  }
}

void loop() {}

DL2MWB:
Ich steh gerade etwas auf dem Schlauch.

Und ich habe gerade Watte zwischen den Ohren.

Beim Anblick der Oder-Orgie ging mir nur die Frage durch den ... äh ... die Watte, ob ein switch/case-Konstrukt mit ggf. umgekehrter Logik nicht verständlicher oder einfacher zu handhaben wäre. Evtl. ist das einen „echten“ Gedanken wert.

Gruß

Gregor

Das ist Geschmackssache:

byte  att_dB;

void setup()
{
  Serial.begin(9600);
  Serial.println(F("Los geht's"));
  for (att_dB = 0; att_dB < 61; att_dB++) {
    Serial.print(att_dB);
    switch (att_dB) {
      case 0:
      case 3:
      case 6:
      case 10:
      case 20:
      case 30:
      case 40:
      case 50:
      case 60:
        Serial.println(F("\tStandardwert"));
        break;
      default:
        Serial.println(F("\tkein Standardwert"));
    }
  }
}

void loop() {}

agmue:
Das ist Geschmackssache:

Darüber kann man streiten. Ich habe jedenfalls Geschmack :slight_smile:

Gruß

Gregor

Oder wenn es mehr Werte werden über ein Array iterieren.

bool checkWert(byte w) {
  const byte arr={0, 3, 6, 10, 20, 30, 40, 50, 60};
  const len = sizeof(arr) / sizeof(arr[0]);
  for(byte i=0; i<len;i++) {
    if (arr[i] == w) return true;
  }
  return false;
}

void setup() {
  Serial.begin(9600);
  for (att_dB = 0; att_dB < 61; att_dB++) {
    Serial.print(att_dB);
    if (checkWert(att_db) Serial.println(F("\tStandardwert"));
    else Serial.println(F("\tkein Standardwert"));
  }
}

Gruß Tommy

Vielen Dank an euch alle für die Hilfe und Kritik!

Klar ist alles Ansichtssache wie man die Abfrage gestaltet. Die array Variante von Tommy56 ist auch ne saubere Sache. Vorab habe ich aber nun einfach mal auf && umgestellt. Warum die oder (||) nicht funktioniert ist mir allerdings noch nicht ganz klar.

Gruß Wolle

ODER ist wahr, wenn mindestens ein Teil wahr ist
UND ist wahr, wenn alle Teile wahr sind.

Gruß Tommy

Hi

Zum Haupt-Problem:
Du prüfst auf UNGLEICHHEIT - und ver-ODER-st die Einzelprüfungen.
Wenn Etwas nicht UNGLEICH Drei ist, ist Es aber ganz bestimmt UNGLEICH Sechs - und da Du Diese Einzel-Prüfungen ver-ODER-st, ist Das IMMER wahr.
Denke, Das erkennt der Kompiler auch und optimiert die ganze Prüferei komplett weg - gibt's dabei keine Meldung wie 'unnötige IF'?

MfG

PS: Solche Spielereien würde ich erst im EEprom rumkratzen lassen, wenn der ausgiebige Test gezeigt hat, daß das EEprom Das auch zwei Tage überleben wird.
Die loop() ist schnell und wenn Du hier laufend irgendwo irgendwas reinschreibst, ist das EEprom dort irgend wann am Ende.
100.000 ist zwar nicht 'direkt', aber so viele Millisekunden braucht das EEprom nun auch nicht, um Das nicht in wenigen Minuten hin zu bekommen.

PPS: Ja - ich habe gesehen, daß dort bisher nur eine leere loop() steht - aber nicht heulend ankommen, wenn loop() fleißig war.

Edit Sech --> Sechs (soll ja eine Zahl werden)

Ich glaube Du hast einen großen Denkfehler

A != 0 || A!= 3

wenn A 0 ist, dann ist im ersten Teil die Bedingung nicht wahr, aber dann ist die Kontrolle sicher im zweiten Teil richtig da A nicht 3 ist weil A eben 0 ist. Darum ist die Bedingung dieses ifs immer für alle Werte wahr.

Wie Gesagt mußt Du auf == kontrollieren und AND Verknüpfen.

Grüße Uwe

... auf
== und ||
bzw auf
!= und &&

uwefed:
Wie Gesagt mußt Du auf == kontrollieren und AND Verknüpfen.

Das dürfte schief gehen.

A==0 && A==3 wird nie wahr.

A!=0 && A!=3 kann wahr werden.

Gruß Tommy

postmaster-ino:
... auf
== und ||
bzw auf
!= und &&

Ich bin für eine Kombination von &&||&*|+-

SCNR

Gregor

A==0 && A==3 wird nie wahr.

A!=0 && A!=3 kann wahr werden.

Iss nicht wahr :wink:

... wenn nicht einer der Werte ...

if (! ( x== 0 || x == 3 || x == 10 || ... ) )

Das wäre die wörtliche Übersetzung von Deutsch nach Boolsche Algebra in C, nach meinem Verständnis.
Kann man natürlich auch anders formulieren und anders realisieren. wie schon gezeigt.
agmues switch gefällt mir übrigens am besten.

Genau und "ausmultipliziert" (also das ! mit der inneren Klammer aufgelöst) kommt dann != verknüpft mit && raus.

Gruß Tommy

DL2MWB:
Warum die oder (||) nicht funktioniert ist mir allerdings noch nicht ganz klar.

Das ist Mathematik, genauer das De Morgansche Gesetz der Booleschen Algebra.

michael_x:
agmues switch gefällt mir übrigens am besten.

Mir gefällt der Array Funktion Ansatz am besten...
Noch etwas aufpeppen, dann lässt er sich für alles nutzen, wo es einen == Operator für gibt (oder man ihn bauen kann).
Also auch für Gießkannen, Mäuse und runde Ecken.

#include <Streaming.h>
//#include <CombieTypeTraits.h>

int testArray[] {1,5,55,4,2};
char kette[]    {"Frosch"};

template<typename N, typename A>
bool isInArray(N needle,A &haystack)
{
  // static_assert(is_array<A>(),"haystack ist not a Array");// anderes Thema

  for(N &n:haystack) if(n==needle) return true;
  return false;
}



void setup() 
{
  Serial.begin(9600);
  Serial << "Start: "<< __FILE__ << endl;
  Serial << "check 4: " << isInArray(4,testArray) << endl;
  Serial << "check 42: "<< isInArray(42,testArray) << endl;
  // Serial << "check 'A': "<< isInArray('A',testArray) << endl;// error
  Serial << "check 's': "<< isInArray('s',kette) << endl;
  Serial << "check 'x': "<< isInArray('x',kette) << endl;
}

void loop() 
{

}

Interessante Weiterführung.

Gruß Tommy