PWM-Signal auswerten

20 ist im Vergleich zu 1024 nicht viel.
grad mal 2%
Würde schon 1% Widerstände nehmen.
Grüße Uwe

Hallo,
Du kannst den Wert von pulseIn auch mappen.
z.B a=map(pulseIn(3,HIGH,24000),1000,2000,0,10).
Du erzeugst dann nur Werte zwischen 0 und 10.

swordfish:
Hallo,
Du kannst den Wert von pulseIn auch mappen.
z.B a=map(pulseIn(3,HIGH,24000),1000,2000,0,10).
Du erzeugst dann nur Werte zwischen 0 und 10.

Was aber nicht 100% gut ist, weil es so Rundungfehler gibt und die 11 Zahlen nicht gleichmäßig verteilt sind.
von 1000 bis 1099 ergibt 0
von 1100 bis 1199 ergibt 1
von 1200 bis 1299 ergibt 2
von 1300 bis 1399 ergibt 3
von 1400 bis 1499 ergibt 4
von 1500 bis 1599 ergibt 5
von 1600 bis 1699 ergibt 6
von 1700 bis 1799 ergibt 7
von 1800 bis 1899 ergibt 8
von 1900 bis 1999 ergibt 9
2000 ergint 10

Grüße Uwe

Ich weiß jetzt nicht, was mir mappen bringen sollte, es funktioniert doch!

Aber ein anderes Problem.
Ich möchte die delay()-Schleife raus haben.

void setup ()
{
pinMode (13, OUTPUT);
pinMode (3, INPUT);
}

void loop ()
{
int a = pulseIn(3,HIGH,24000);
int L1 = digitalRead(13);
if (a>1228 && a<1242 && L1==LOW){//Wenn Eingangssignal im richtigen Bereich und entsprechende LED aus ist,
  digitalWrite (13,HIGH);//dann schalte LED 13 an
  if (a>1490 && a<1505){//Wenn neutrales Einganssignal (Mittelstellung),
    goto if1H;//dann geh weiter zu nächsten if-Bedingung
  }
  else 
  {
    goto if1L;//sonst wiederhole aktuelle if-Bedingung
  }
}
if1H:

if (a>1228 && a<1242 && L1==HIGH){
  digitalWrite (13,LOW);
  if (a>1490 && a<1505){
    goto if1L;
  }
  else 
  {
    goto if1H;
  }

}
if1L:
;
}

Kann das an dem "goto" liegen? Weil er erkennts nicht als funktion, aber es ist ja eine offizielle Funktion !?

Zur Info nochmal das Funktionsprinzip: Wenn eine LED-geschaltet wird, wird automatisch eine weitere if-gleichung in Gang gesetzt, dass die vorhergehende if-gleichung so lange wiederholt wird, bis kein Schalter gedrückt wird (Der Wert am Eingang beträgt dann so um die 1500). Dann gehts nach gewohntem Prinzip weiter. Damit wird verhindert, dass die LED gleich wieder ausgeschaltet wird.

Ich push das hier nochmal hoch
Weiß denn keiner was?

Kann das an dem "goto" liegen? Weil er erkennts nicht als funktion, aber es ist ja eine offizielle Funktion !?

Das versteht wohl keiner so richtig ?!

Was meinst du mit "Funktion" ?

Ein goto ist keine Funktion sondern etwas, was eigentlich nichts in einem Programm zu suchen hat.

Ich möchte die delay()-Schleife raus haben.

Du meinst dein pulseIn() ?
Diese Funktion wirkt zwar wie ein delay und liefert ein unsigned long ( kein int ) zurück.
Aber wenn du sicher bist, dass pulseIn innerhalb weniger msec zurückkommt, ist das ganz in Ordnung.

Generell schmeisst man alle goto's raus und freut sich, wenn loop() schnell fertig ist und wieder neu startet.
Wenn eine LED länger leuchten soll, merkt man sich, wann sie eingeschaltet wurde und wann man sie also wieder ausschalten kann.
BlinkWithoutDelay

Von einem loop Durchlauf zum nächsten kannst du Variable aufheben in globalen oder static Variablen:

const unsigned long LED_DAUER = 500; // 0.5 sec
static unsigned long start;
if ( led_anschalten ) {    // wann die Anschalt-Bedingung erfüllt ist, hab ich hier weggelassen. 
   digital_Write(13,HIGH);
    start=millis(); 
}

if ( millis() - start > LED_DAUER) {
  digitalWrite(13,LOW);
}

Hallo,

das feste delay würde mich auch stören, da bei Dir bestimmt dann mehrere notwendig sind summiert sich die Zeit die den µC blockiert.

Zum umschalten Deiner Ausgänge kann man doch sicherlich das digitale Bit bzw. Pin toggeln. Mehr kannst Du und willst Du ja eh nicht machen wenn Du zum ein- und ausschalten eines Ausganges immer die gleiche Knüppelstellung verwenden möchtest.

toggeln wäre: PinNummer bzw. Variable ^= 1;

oben in void Setup legste die Hilfvariable fest

byte TOGGLE = 0;

if ( a>1228 && a<1242 )                           //Wenn Eingangssignal im richtigen Bereich schalte LED entsprechend um
  {  
     TOGGLE ^= 1;                                   // Wert von TOGGLE wechselt bei jeden Aufruf zwischen 0 und 1 hin oder her
     digitalWrite (13, TOGGLE);                 // und schaltet damit die LED 13 bei jeden Aufruf entweder an oder aus
  }

@Doc_Arduino:
Das bringt mich auch nicht weiter. Ich hab ja dann immer noch das Problem, dass im erneuten und sofortigem Wiederdurchlauf des loop-teils die LED sofort wieder umgeschaltet wird, wenn ich in der Zeit nicht den Taster losgelassen habe. (Das Signal wird aller 20ms erneut gesendet).

@michael_x:
Versteh ich nicht ganz. In der zweiten If-schleife schaltest du dann doch die LED automatisch wieder aus!? Was bringt mir das jetzt XD

Ich weiß, dass ein goto nicht gern gesehen wird, aber sofern ich keine andere Möglichkeit habe, werde ich es wohl verwenden müssen.

michael_x:

Ich möchte die delay()-Schleife raus haben.

Du meinst dein pulseIn() ?

?? Ich versteh jetzt nicht, was die miteinander zu tun haben, bzw. wieso das pulseIn() gleich delay() sein soll

Tut mir leid, wenn ich mich ein wenig blöd anstelle.... =( XD

Hallo,

das ist das generelle Problem wenn man mit einem Taster oder wie bei Dir einer Knüppelstellung 2 Aufgaben erledigen will. Mit etwas Aufwand sehe ich da aber kein Problem. Du mußt laut meiner Theorie nur dafür sorgen das die erneute Auswertung des eben umgeschalteten Bits erst wieder erfolgt wenn sich das Eingangssignal, also Deine Knüppelstellung, verändert hat.

Hinweis. Du willst 11 Sachen schalten. Dann würde ich in allen 11 Wertebereichs if Abfrage eine Hilfvariable einfügen die beim einmaligen Durchlaufen gesetzt wird. Vor der if Abfrage prüfst Du ob sie schon gesetzt ist. Dann wird diese übersprungen und es wird nicht nochmal getoggelt. Das machst Du mit alle Deinen Wertebereichen if Abfragen. Und in allen setzt Du alle anderen Hilfvariablen wieder zurück. Außer die der eigenen wo das Programm sich gerade drin befindet. Wenn ich das so lese finde ich das einfach genial. :grin:

Doc_Arduino:
Wenn ich das so lese finde ich das einfach genial. :grin:

Stimmt, Dankeschön XD

Werd morgen berichten, ob's auch bei mir funktioniert :wink:

Zwei andere Fragen:

  1. Das togglen funktioniert bei mir nicht. Wird immer als unbekannter Befehl (diesmal richtig? XD) markiert und beim kompillieren als Fehlermeldung gebracht. Dann gibt es da ja was zum downloaden (digitalToggle), funktioniert aber nicht. (Ja, ich hab es am Anfang vom Sketch importiert). Bringt immer fehlermeldungen, die sich auf die neuen Dateien in der library beziehen.

  2. zum Blinken ohne delay:

if (millis() - previousMillis > interval) {

Wieso ein ">", und nicht ein "="? Funktionierten tut letzeres ja auch!?

hi,

togglen heißt hin- und herschalten;

bool test;

void setup() {
  Serial.begin(9600);
  test = false;
}

void loop() {
  Serial.println(test);
  test = !test;
  delay(1000);
}

gruß stefan

Bluetruck:
2) zum Blinken ohne delay:

if (millis() - previousMillis > interval) {

Wieso ein ">", und nicht ein "="? Funktionierten tut letzeres ja auch!?

"=" wäre zu unsicher, gar nicht angewöhnen. Wenn der Code mal länger als eine Millisekunde dauern sollte, kann Dir passieren, dass die Bedingung nie eintritt weil millis() schon drüber ist.
Ich schreibs meistens so:

if (millis() - previousMillis >= interval)

Hallo,

so mach ich das, TOOGLE ist bei mir die Hilfsvariable.

byte TOGGLE = 0;

-----------------------------------------------

if ...
  {
    TOGGLE ^= 1;
    digitalWrite(ledPin, TOGGLE);
   }

@MaFu: Ok, hab ich mir fast so gedacht XD

@Doc_Arduino:

Hm, versteh ich nicht ganz.

TOGGLE ^=1;

Was bewirkt das und was bedeutet das "^" ? Ist das das bitweise XOR?
Und muss ich da unbedingt mit bytes arbeiten? Weil da blick ich nicht durch :grin:

Wat anderes: Hab jetzt mal Doc_Arduinos Rat befolgt. Allerdings wird die Hilfsvariable nicht bei jeder gültigen if-Bedingung zurückgesetzt, sondern alle erst in einer seperaten if-bedinung (Eingangssingal muss in in "Mittelstellung" sein) am Schluss. Da der loop-teil ja nahe zu in keiner Zeit durchläuft, reicht das ja auch.
Mein Problem ist: An sich funktioniert es, aber das Signal wird nicht eindeutig verarbeitet. Dh, wenn ich den Taster in meiner Fernbedingung drücke, geht die LED an, aber sofort wieder aus. Ich muss zB. längere Zeit drücken. Ist aber nicht immer. Manchmal geht sie auch wieder aus, wenn ich lange drücke. Beim ausschalten genau das gleiche.
Ich zeig euch mal meiner Code (noch ohne Toggle), vllt. sieht ja jemand was ?

void setup ()
{
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (3, INPUT);
}

void loop (){
  int a = pulseIn(3,HIGH,24000);//Ließt Eingangssignal
  boolean vLED1 = false;//Hilfsvariable wird zusammen mit der LED auf "true" gesetzt, wenn if-Bedingung erfüllt wurde. Am Ende des loop-teils werden, wenn das Einganssignal in der "Mittelstellung" ist, alle Hilfsvariablen wieder auf "false" gesetzt. Somit kann die LED wieder umgeschaltet werden.
  boolean vLED2 = false;//
  int iLED1 = digitalRead(5);//Ließt Status von LED1
  int iLED2 = digitalRead(6);

  //if-Bedinung für LED1
  if (a>1228 && a<1242 && iLED1==LOW && vLED1 == false){//Wenn Eingangssignal zwischen 1228 und 1242, Ausgang an LED1 aus und der Status des Ausgangs in diesem loop-durchgang noch nicht verändert wurde, dann
    digitalWrite (5,HIGH);//schalte Ausgang an
    vLED1 = true;//Setze Hilfsvariable auf true. Nächste if-bedinung stimmt somit nicht mehr (bis Eingangssingal in "Mittelstellung" und die LED bleibt an.
  }
  if (a>1228 && a<1242 && iLED1==HIGH &&  vLED1 == false){//Gleich wie oben, bloß umgekehrt zum ausschalten der LED
   digitalWrite (5,LOW);
   vLED1 = true;
  }
    //if-Bedinung für LED2
  if (a>919 && a<930 && iLED2==LOW && vLED2 == false){
    digitalWrite (6,HIGH);
    vLED1 = true;
  }
  if (a>919 && a<930 && iLED2==HIGH &&  vLED2 == false){
   digitalWrite (6,LOW);
   vLED1 = true;
  }
      //if-Bedinung zum Zurücksetzen der Hilfsvariablen bei Mittelstellung des Eingangssignals
  if (a>1490 && a<1505){
    vLED1 = false;
    vLED2 = false;
  }

}

Es liegt aber nicht am Empfang. Denn als ich es das erste mal mit delay() als verzögerung gemacht habe, hat es ja hinsichtlich dieses Problems super funktioniert.

Was mich verwundert hat: Warum muss ich die Variablen im loop-teil deklarieren, und kann sie nicht ganz am Anfang des Sketches hinschreiben? Denn da funktioniert es nicht.

EDIT Und noch ein Problem. Ich kann die LEDs nur schalten, wenn ich das USB-kabel verbunden habe !?
Mal meine Pin-belegungen:

5V+: 5V
Ground: ?
7V+: VI
Leds sind mit + am Arduino Ausgang und mit - an Ground angeschlossen.

Das Arduino ist schon angeschlossen, wenn ich das USB-kabel entferne, leuchtet die Blaue LED noch.

Warscheinlich ist die Lösung total einfach, bloß komm ich nicht drauf :0

Was bewirkt das und was bedeutet das "^" ? Ist das das bitweise XOR?

Der Kandidat hat 100 Punkte. Und einen Extra-Bonus, weil er nicht nachgelesen, sondern geraten hat. Glückwunsch.

Und muss ich da unbedingt mit bytes arbeiten

Bytes sind die natürlichste Datengröße für einen 8-Bit Prozessor, und sie passen erstaunlich oft.

Aber du hast insofern recht, dass es hier eigentlich um LOW / HIGH geht.
In Arduino - C ist LOW = false = 0 und HIGH = true = 1.
Und boolean wird in Arduino-C in einem byte untergebracht.

Rein logisch gesehen ist ! der richtige toggle - Operator, und Doc_Arduino's ^=1 mogelt, weil er weiss, dass in dem Byte nie was anderes als 0 oder 1 drinsteht.
( Ob das tatsächlich einen Zyklus schneller oder ein paar Byte kürzer ist, als was ein ordentlicher Compiler aus dem ! Operator macht, lassen wir mal offen )

Was mich verwundert hat: Warum muss ich die Variablen im loop-teil deklarieren, und kann sie nicht ganz am Anfang des Sketches hinschreiben? Denn da funktioniert es nicht.

Vielleicht solltest du doch mal ein bisschen Einführung in C lesen, sonst rätst du wieder richtig, was der Unterschied zwischen einer lokalen und einer globalen Variable ist...
Warum - Fragen wollen nicht wirklich eine Antwort, hab ich aus Erfahrung gelernt. Weil die Antwort nicht hilft, sondern eher zeigt, dass alles nicht so einfach ist.
Das Problem ist eher dein geheimnisvolles "Denn da funktioniert es nicht", was man nur mit "Sollte es aber" beantworten kann.

Und noch ein Problem. Ich kann die LEDs nur schalten, wenn ich das USB-kabel verbunden habe
... Leds sind mit + am Arduino Ausgang und mit - an Ground angeschlossen.

... und haben sicher einen Vorwiderstand , oder ?
Ein Arduino sollte auch mit 7V an Vin funktionieren. Da solltest du mal durch Eingrenzen/Vereinfachen klären, ob das an Stromversorgung / LED / Fernsteuerung oder was sonst liegt.

Bluetruck:
@michael_x:
Versteh ich nicht ganz. In der zweiten If-schleife schaltest du dann doch die LED automatisch wieder aus!? Was bringt mir das jetzt XD

Ich weiß, dass ein goto nicht gern gesehen wird, aber sofern ich keine andere Möglichkeit habe, werde ich es wohl verwenden müssen.

michael_x:

Ich möchte die delay()-Schleife raus haben.

Du meinst dein pulseIn() ?

?? Ich versteh jetzt nicht, was die miteinander zu tun haben, bzw. wieso das pulseIn() gleich delay() sein soll

Tut mir leid, wenn ich mich ein wenig blöd anstelle.... =( XD

Ich habe kein delay in deinem Post gesehen, das einzige was eine Verzögerung reinbringt, ist das pulseIn, weil es wartet, bis ein neuer Puls von deiner Steuerung kommt.
Das zweite if in meinem Beispiel wird erst viele Zyklen später true, wenn das im ersten if gesetzte
  start=millis();
so alt ist, dass

   millis() - start > LED_DAUER

erfüllt ist.

( start kann für diesen Zweck übrigens keine einfache lokale Variable sein, um nochmal was verwirrendes zu deinem "Warum" beizutragen)

P.S. Kannst du bitte deinen Kommentar im vorigen Post in der Zeilenlänge kürzen, mein Bildschirm ist zwar 16:9 Full-HD, aber doch ein bisschen zu schmal um Text und scroll-Balken gleichzeitig zu zeigen.
PPS: War nur bei meiner Antwort störend, hat sich erledigt...

Hallo,

ich tipp auch noch paar Worte zum Thema.

Genau, mit XOR kann man toggeln. Manchmal darf man übern Tellerrand schauen. :slight_smile:
Zum Bsp. hier: Bitmanipulation – Mikrocontroller.net
Vieles davon steht auch im Manual zu unserem µC. Ist ja auch von AVR.

Byte deshalb, weil man für 0 oder 1 keinen größeren Speicherbereich deklarieren muß. Kannst auch long verwenden, geht auch, verschwendet nur kostbaren Speicher im µC. In ein Byte passen Werte bis 255 rein. Kannste nachlesen hier in der Referenz.

Wegen Dein Tastereffekten? Das könnte Tasterprellen sein und die delay Verzögerung hatte das zufällig unterbunden. Ist meine Vermutung. Was ich noch nicht ganz verstanden habe, nimmst Du nun einen analogen Knüppel oder digitale Taster?

Wegen Deiner Variablendefinition, ich vermute Du hast das ; vergessen? Oder unter setup reingeschrieben?
Dein Code geändert das am Anfang alle Variablen deklariert werden wird fehlerfrei übersetzt.

int a;
boolean vLED1 = false;//Hilfsvariable wird zusammen mit der LED auf "true" gesetzt, wenn if-Bedingung erfüllt wurde. Am Ende des loop-teils werden, wenn das Einganssignal in der "Mittelstellung" ist, alle Hilfsvariablen wieder auf "false" gesetzt. Somit kann die LED wieder umgeschaltet werden.
boolean vLED2 = false;//
int iLED1;
int iLED2;
  
void setup ()
{
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (3, INPUT);
}

void loop (){
  a = pulseIn(3,HIGH,24000);//Ließt Eingangssignal
  
  iLED1 = digitalRead(5);//Ließt Status von LED1
  iLED2 = digitalRead(6);

  //if-Bedinung für LED1
  if (a>1228 && a<1242 && iLED1==LOW && vLED1 == false){//Wenn Eingangssignal zwischen 1228 und 1242, Ausgang an LED1 aus und der Status des Ausgangs in diesem loop-durchgang noch nicht verändert wurde, dann
    digitalWrite (5,HIGH);//schalte Ausgang an
    vLED1 = true;//Setze Hilfsvariable auf true. Nächste if-bedinung stimmt somit nicht mehr (bis Eingangssingal in "Mittelstellung" und die LED bleibt an.
  }
  if (a>1228 && a<1242 && iLED1==HIGH &&  vLED1 == false){//Gleich wie oben, bloß umgekehrt zum ausschalten der LED
   digitalWrite (5,LOW);
   vLED1 = true;
  }
    //if-Bedinung für LED2
  if (a>919 && a<930 && iLED2==LOW && vLED2 == false){
    digitalWrite (6,HIGH);
    vLED1 = true;
  }
  if (a>919 && a<930 && iLED2==HIGH &&  vLED2 == false){
   digitalWrite (6,LOW);
   vLED1 = true;
  }
      //if-Bedinung zum Zurücksetzen der Hilfsvariablen bei Mittelstellung des Eingangssignals
  if (a>1490 && a<1505){
    vLED1 = false;
    vLED2 = false;
  }

}

Zitate bring ich nicht, weil ich da irgendwie zu blöd dazu bin... XD

@michael_x:

Wieso, weshalb, warum ... XD

"^" Ich habe allerdings schon nachgelesen, und zwar unter den Referenzen. Aber ich verstehe nicht, wie das zusammen mit dem "=" funktioniert !? http://torrentula.to.funpic.de/dokumentation/bitweisesund/
Bedeutet das dann nichts anderes als "alles außer 1"?
Aber irgendwie versteh ichs nicht

Variable "TOGGLE" wird als 0 deklariert.
if...then: Setzte TOGGLE alles andere als 1 !? Gibt irgendwie keinen Sinn.
Schalte Ausgang: TOGGLE, also alles andere als 1 !? Gibt noch weniger Sinn.

byte TOGGLE = 0;

-----------------------------------------------

if ...
  {
    TOGGLE ^= 1;
    digitalWrite(ledPin, TOGGLE);
   }

Google sagt irgendwie auch nichts dazu. Deswegen muss ich hier so blöd fragen. Tut mir echt leid. Wenns irgendwo schon beschrieben ist, könnt ihr mir ja vlt. einen Link geben.

Zu den Variablen: Ich bin mir bewusst, dass, wenn ich sie ganz am Anfang hinschreibe, für setup und loop teil gilt, und wenn ich sie im loop teil definiere, der setup teil nicht zugreifen kann. Als erstes hab ich sie ganz am Anfang (noch vor setup) definiert. LEDs haben nicht geleuchtet. Dann in den loop-teil - LEDs konnte ich schalten.
Und psychologische Antworten bringen mir bei meinem Problem auch nicht viel XD

Zu dem USB-Problem:
An der Stromversorgung liegt's nicht. Da kommt überall die richtige Spannung.
Was mir gerade aufgefallen ist: Das USB kabel ist zum Schalten der LED wichtig. Ist sie einmal an, kann ich das Kabel abstecken und der Ausgang bleibt an.
Ich denke, ich hab irgendwo einen total einfachen Fehler, komm aber nicht drauf.

Weil du kein delay() gesehen haben möchtest: PWM-Signal auswerten - #19 by Bluetruck - Deutsch - Arduino Forum XD

Zum Beispiel: Aber das bringt mir doch immer noch nichts. Ich will die LED ja selber wieder ausschalten und nicht nach einer bestimmten Zeitspanne.

@doc_arduino:

Es sind digitale Taster. Jeder Taster (ich arbeitet zZt. mit 4 Stück) hat einen Wiederstand (Werte weiß ich jetzt nicht ganz genau) vorgeschalten. Je nachdem, wie groß der Wiederstand ist, desto länger/kürzer wird das Signal, was von der Funke zum Modell geschickt wird und schließlich auch vom Empfänger zum Servo, bzw. hier zum Arduino übertragen wird.

Alle Fehlerquellen, die mit schlechtem Kontakt, schlechten Schaltern und Wiederständen oder schlechter Funkübertragung bzw. dem pulseIn() zu tun haben, kann man getrost ausschließen. Denn das problem wäre dann auch bei der "delay-version" aufgetreten. Habs grade nochmal ausprobiert. Ein kurzer Tasterdruck(wirklich kurz), und die LED schaltet zuverlässig an/aus.
Ich gehe davon aus, dass in der Programmierung der Fehler liegt.

Wegen den Variablen: Siehe oben. Ich hab sie eins zu eins kopiert. Zweitens käm sonst beim kompillieren ja auch eine Fehlermeldung.

Hallo,

okay, bevor ich Dir jetzt Toogle bzw. XOR erkläre muß ich wissen ob Du Dich mit Digitaltechnik überhaupt schon einmal befasst hast? Also genau weist wie AND, OR, NAND, NOR funktioniert? Das sind die Grundfunktionen. Alles andere baut darauf nur auf. Klingt vielleicht erstmal einfach, man muß es aber verstanden haben. Ich meine, man muß wissen was einem eine Wahrheitstabelle sagt.
Oder es hängt bei Dir nur an dem Zeichen ^= ?
Das ist einfach nur das Zeichen für die logische XOR Verknüpfung. Ich meine wenn 2 * 2 = 4 da steht fragt auch niemand was * bedeutet. Irgendwas mußten sich die Programmierer der Compiler ausdenken, meine ich, wie man XOR ausdrücken kann. Ich muß auch hin wieder nachlesen wie man was schreibt, also was der Syntax in C-Sprache ist.

Aber ich verstehe nicht, wie das zusammen mit dem "="

Das ist ein C - Trick, der es evtl. auch den ersten nicht so gut optimierenden Compilern einfacher machen sollte.

Statt [b]a = a+10;[/b] kann man auch[b] a+=10; [/b] schreiben : addiere 10 zur Variablen a.
Dies geht mit den meisten Prozessoren einfacher als wenn links und rechts des = verschiedene Variablen stehen. ( y = x+10 )

Das funktioniert nun nicht nur mit +, sondern mit allen ähnlichen Operatoren, unter anderem auch dem "bitweisen xor" ^

** **toggle ^= 1; // invertiere in "toggle" das Bit mit der Wertigkeit 1** **

d.h. aus 1 wird 0 und aus 0 wird 1 , aus true wird false und umgekehrt.

Aber aus 2 wird 3 und aus 3 wird wieder 2, und -noch verrückter- aus -1 ( 0xFF ) würde -2 ( 0xFE oder 254 )
und alle diese 4 Werte würden als true und damit HIGH interpretiert werden, also Vorsicht, Doc.

Entschuldige, dass du so viel Mühe hast, mir deine zwei delays zu zeigen. Ja, ich habe mir den Link genau genug angesehen, um die 2 Sekunden-Pausen zu sehen.
Ich habe allerdings auf Reply #38 on: February 16, 2013, 02:39:17 PM » geantwortet. :wink:

Psychologische Antworten bringen mir bei meinem Problem auch nicht viel

:wink: Du musst auch ein bisschen an die anderen denken :wink:

Wenn man sich diesen Thread mal ansieht, hat sich seit

       if (a>1450 && a<1500 && LED2v=LOW)

doch schon einiges getan.

Aber dass der Arduino sich bei ausreichender Stromversorgung mit 7V an Vin sich total anders verhält als bei USB - Versorgung, ist sehr seltsam.
Vor allem, dass alles weiter geht, nur der LED Zustand sich nicht mehr verändert.

Was total blödes, ist gut möglich, aber was, kann ich so auch nicht raten.
Daher mein Vorschlag: vereinfachen, Teile einzeln testen.

Wenn du den Effekt (LED bleibt an wenn der sketch mit Vin-Stromversorgung läuft, LED lässt sich mit dem gleichen sketch steuern, wenn der Arduino an USB hängt)
in einer möglichst einfachen Umgebung reproduzieren kannst ( und dann nicht selbst verstehst :wink: ) mach einen neuen Thread auf, mit Hardware-Beschreibung (Schaltung) und dem Einfach-Sketch.

Hallo,

michael_x:
** **toggle ^= 1; // invertiere in "toggle" das Bit mit der Wertigkeit 1** **

d.h. aus 1 wird 0 und aus 0 wird 1 , aus true wird false und umgekehrt.

Aber aus 2 wird 3 und aus 3 wird wieder 2, und -noch verrückter- aus -1 ( 0xFF ) würde -2 ( 0xFE oder 254 )
und alle diese 4 Werte würden als true und damit HIGH interpretiert werden, also Vorsicht, Doc.

Die Erklärung ist vielleicht etwas zu kurz gefasst. Aus 2 wird nur 3 und umgekehrt wenn die zu toggelnde Variable vorher den Wert 2 oder 3 hatte und man mit der Wertigkeit 1 toggelt.
Wie Du allerdings auf negative Werte kommst verstehe ich auch nicht. 0xFF ist immer noch 255 und nicht -1. :~

@ Bluetruck:
Wenn Du mal rumspielen willst mit dem toggeln, egal mit welcher Methode, dann lade Dir mal den Simulator runter
http://www.arduino.com.au/Simulator-for-Arduino.php

und nimm erstmal folgenden Code und schaue Dir im Input/Output Fenster an was ausgegeben wird. Dann änderst Du den Wert von der Variablen WERTIGKEIT und später den Wert der Variablen WERT und guckst was passiert. Alles zwischen 0 ... 255. Gut wäre es wenn Du Dir vorher überlegst was passieren müßte und dann überprüfst ob das stimmt.

Du kannst das natürlich auch immer in Deinen µC flashen und in der IDE anschauen. Allerdings nicht wundern im IDE, hier werden nur die untersten Bits ausgegeben bis zu letzten enthaltenen 1. Den Rest der Nullen der höherwertigen lässt er weg. Also wenn 00001111 ausgegeben wird, erscheint nur 1111. Deshalb habe ich als Startwert 255 gewählt, dann bleibt erstmal die binäre Optik erhalten.

byte WERT = 255;
byte WERTIGKEIT = 1;       // welches Bit oder Bits werden getoggelt

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

void loop()
{

  WERT = WERT ^ WERTIGKEIT;            // toggeln mit Wertigkeit x
  Serial.println(WERT, BIN);                 // BIN = binäre Ausgabe

  delay(1000);  
}

und Entschuldigung wegen der Schreibweise ^=. Dass das die Kurzform ist, daran hatte ich in dem Moment nicht gedacht. TOGGLE = TOGGLE ^ 1 ist das gleiche wie TOGGLE ^= 1