PWM-Signal auswerten

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

So,
Problem 1, also das Prob. mit dem USB, konnte ich lösen. Lag daran, dass der pulseIn() Bereich zu klein war.
2. Problem, toggle, ist jetzt vorerst nicht so wichtig. Irgendwie muss ich mich da mal länger damit beschäftigen.

Mein größtes Problem (motivierender: Hinderniss :grin:), ist, dass wie gesagt die LED nicht korrekt schaltet.
Mit einem anderen Bereich des pulseIn() konnte ich es nicht lösen, auch andere Variablen haben nichts erbracht.
Hat da jemand eine Idee?

Weiß denn keiner was?

Nach einer langen Pause hab ich mich mal wieder mit dem Thema auseinandergesetz. Mit meinem Dad hab ich folgende Grundidee entwickelt: Wenn ich einen mechanischen Schalter betätige, entsteht anfangs nie ein exakt genaues Signal (Funke). Erst mit der Zeit (ein paar millisekunden). Das erste falsche Ergebnis reicht aber aus, um meine bisherige Schaltung zu manipulieren. Also: die if-gleichung wird erst dann in Kraft gesetzt, wenn das eingangssignal (pulseIn) seit ein paar ms konstant ist.

Wie ihr seht, hab ich hier einige Probleme. zum einen, wie ich die erste if-gleichung verwirkliche. Also das mit der maximalen Abweichung von p1. Das zweite Problem ist das "goto". Das goto funktioniert ja nur innerhalb einer Funktion, also nicht übergreifend. Ich weiß, das wird nicht gern gesehen, aber ich sehe hier keine andere Lösung.

Das Bild ist jetzt ein ganz einfacher Gedankenentwurf, bitte schimpft nicht, wenn ich das nicht so formal korrekt habe.

bool func()
{
     if( (p2 > p1 - p1/10.0) && (p2 < p1 + p1/10.0) )
     {
     }
     else
     {
           return false;
     }


     if(z == 5)
     {
     }
     else
     {
         return true;
     }

     return true;
}
if(func() == true)
{
}
else
{
}

So ähnlich. Wichtig dabei ist dass jeder Weg im Code einen return-Wert zurückgegeben muss. Deshalb das "return true" am Ende wenn b beide Bedingungen "true" sind. Wenn mehr als zwei Rückgabe-Zustände gebraucht werden kann man auch ein Byte zurückgeben und dann auf eine Zahl abfragen.

Wenn du solange etwas machen willst bis eine bestimmte Bedingung eintritt geht das aber auch einfach mit einer while-Schleife. z.B. kannst du solange die Funktion aufrufen bis sie "true" zurückgibt (while(func() == false {}). Das machst du wenn "z == 5". Ansonsten gibst du "false" zurück.

Aber ist das nicht unnötig? Wenn du einen Taster entprellen willst kannst du einfach nach der ersten Abfrage mit digitalRead() ein kurzes Delay machen. 10-20ms reichen da. So super genau muss das nicht sein. Es gibt auch eine Library dafür:
http://playground.arduino.cc//Code/Bounce

Sehr interessant hier mitzulesen !

Ich bin auch Hobby-RC-ist (Heli) und beschäftige mich seiner geraumer Zeit wieder damit.
Nachdem ich den Arduino hier sehr positiv kennen gelernt habe und seine Eigenschaften sehr zu schätzen weiß, soll der logo auch am Hubi ran.
Neben 1000 Ideen u.a. zum Ersatz des alten Gyro's mit neuen Teilen (6050,5883,BMP180) soll auch wie hier gefordert die gute alte Fernsteuerung (Robbe FX18, 8-Kanal) ein bischen gepimt werden und z.b. wie Bluetruck es möchte durch mehere Schaltkanäle ergänzt werden.

Dafür gibts es zwar von Robbe (alt !) entsprechende Module wie z.b. den Multi-Switch 16 Decoder Memory, aber so ein Teil kostet heute immer noch locker deutlich mehr als 100 Taler-Euronen .... Also: selber machen !

Extrem genial wäre z.b. einen noch freien Kanal (ich hab hier 8, 5 werden zwingend benötigt, einer wird als "10er-Schalter" missbraucht und einer als "Werte-Kanal" für alles Mögliche -> 1 ist noch frei) durch die "Schalter" das PWM-Signal an verschiedene Ausgänge zu leiten und somit noch mehr Servos steuern zu können als eigentlich möglich. Natürlich nicht zeitkritisch für das Modell !
(Ja, auch das gabs es früher schon von Robbe & Co. - allerdings ebenfalls nicht grade preiswert !

Neben den erforderelichen Korrekturen der Steuersignale für meinen Heli (hier Roll, Pitch, Nick, Tail und Motor) durch zu implementierende Gyro, Kompass und Narometer müssen neben den o.g. Dingen halt alle 8 Signale der Fernsteuerung zunächst eingelesen und dann ggf. "behandelt weitergegeben werden.
(.... ja, so was wie MultWii für Arme / normale Heli-Flieger - ich werde draus abkupfern ... :.)

Mit "pulseIn" kommt man da aber anscheinend nicht sehr weit - ich hab mal rumgeguckt und das hier für dass richtige entschieden:
Arduino Playground - HomePage (Auslesen aller Kanäle einer RC-Fernbedienung mit PWM am Empfänger-Ausgang)
In Kombination mit der Servo-Lib (Arduino-Intern) und modifiziertem Timer dazu sollte das schon sehr gut funzen ....

Die Idee, anstatt eines 'Knüppels" mit gleitendem PWM durch einen Schalter mit festen PWM-Zeiten zu ersetzen finde ich schon sehr genial !
Natürlich muss man da eine wie hier beschriebene "Toggle"-Variable haben, um zu definieren, ob der Zustand bereits gesetzt wurde oder nicht oder zurück.
... ich würde das ehrlich gesagt auch schon 2x nacheinander Prüfen - zur Sicherheit.
... logo schliesst das ein sicheres Ausschließen von Tastenprellen nicht aus (senderseitig)

  1. Wieso kein delay: über pulseIn() kommt kontinuierlich aller 2ms ein neuer Wert. Wenn ich jetzt immer 10ms Pause mache, wird doch einfach nur jeder 5. Wert abgefragt. Damit wird aber nicht ausgeschlossen, dass er falsch (Tasterprellen) ist. Ich muss ergänzen, dass die 10% maximale Abwichung zu viel wäre, 1-2% reichen.

  2. Kannst du mir das mit dem return nochmal erklären? Ich versteh das nicht ganz. Also return als einzelne Funktion versteh ich schon, aber den Unterschied zwischen return false und return true. bzw. return 1 und return 0 nicht.

3)Bei dem Link, den TWERI gepostet hast, versteh ich nur Bahnhof...:wink: Das ist (hoffentlich nur vorerst) zu hoch für mich. Es gibt schon einen Multiswitch für 20€ zu kaufen, der nach dem selben Prinzip arbeitet (wetteringer-modellbauforum, hab keinen konkreten Link mehr). dummerweise hab ich den erst entdeckt, als ich mir den Arduino schon gekauft habe...Jetzt hat der Bastlerwille gesiegt, sowas selber zu machen :wink:

Hier nochmal mein Sketch, bei dem halt besagtes Problem aufgetreten ist....Dem möchte ich nun die "Funktion" fürs Tastenentprellen davorsetzen.

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>1220 && a<1245 && 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>1220 && a<1245 && 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>910 && a<940 && iLED2==LOW && vLED2 == false){
    digitalWrite (6,HIGH);
    vLED2 = true;
  }
  if (a>910 && a<940 && iLED2==HIGH &&  vLED2 == false){
   digitalWrite (6,LOW);
   vLED2 = true;
  }
      //if-Bedinung zum Zurücksetzen der Hilfsvariablen bei Mittelstellung des Eingangssignals
  if (a>1485 && a<1510){
    vLED1 = false;
    vLED2 = false;
  }                      
}