While durch if oder ähnliches ersetzten ??

Hallo =)

Ich habe ein Problem mit meiner while schleife ^^

ich kann damit nicht das abfragen was zum Ergebnis führen würde .....

also meine frage .... kann ich eine whyle schleife auch durch z.b if ersetzten .... perfekt wäre so etwas wie WENN = DANN

so ganz simpel

Danke =)

hier nochmal das skript zu der Frage

int sensorPin1  = A0;   
int sensorPin2  = A5;  //Pin, an den der LDR angeschlossen ist
int sensorWert1 = 0;    
int sensorWert2 = 0; //in dieser Variable wird der ausgelesene
int MausKlick   = 13;                           //Wert zwischen gespeichert.
int time = 0;


void setup() 

{  
  Serial.begin(9600);      //Serielle Verbindung initialisieren
  pinMode (MausKlick,OUTPUT);
}

void loop() 

{
  sensorWert2 = analogRead(sensorPin1);
  sensorWert1 = analogRead(sensorPin1);  // Wert auslesen
  
  Serial.println(sensorWert1);   
  Serial.println(sensorWert2);
                                    
  delay(1);         
  
digitalWrite (MausKlick,LOW);

while (analogRead(sensorPin1)<23) 

Serial.println("Warten-1");



unsigned long time=micros();

Serial.println("Warten-2");



while (analogRead(sensorPin2)<23)


time=(micros()-time)/2; 


Serial.println("Wieder Warten-1");

while (analogRead(sensorPin1)<23) 

delayMicroseconds(time);
digitalWrite (MausKlick,HIGH);

Serial.println(MausKlick);
}

Danke und frohe Weihnachten nachträglich ;)

PUSH ...

Weis keiner was oO

Warst du nicht letztens so weit, dass mit einem Interrupt zu machen? Du hattest doch nur den 4093 falsch angeschlossen.

Fabio1989: PUSH ...

Weis keiner was oO

Posted « on: Today at 02:19:50 pm » Pushed « Reply #1 on: Today at 02:53:42 pm »

Also wenn ich mir Deine Postings so ansehe, scheint weder Geduld noch Programmieren Deine Stärke zu sein.

Mein Vorschlag: Lerne beides! (Wenigstens ein wenig.)

jurs:

Fabio1989: PUSH ...

Weis keiner was oO

Posted « on: Today at 02:19:50 pm » Pushed « Reply #1 on: Today at 02:53:42 pm »

Also wenn ich mir Deine Postings so ansehe, scheint weder Geduld noch Programmieren Deine Stärke zu sein.

Mein Vorschlag: Lerne beides! (Wenigstens ein wenig.)

stimmt ... am zweiten arbeite ich ....

zu ersterem : NIEMALS :D

Ja die Nummer mit dem IC will auch nich so recht .... deshalb habe ich es nochmal auf die alte art versucht ....

jedoch hänge ich da natürlich wieder am ursprünglichem Problem -.-

Die Geschichte mit der mess Geschwindigkeit is überhaupt nicht wichtig habe ich festgestellt

aber es scheint ziemlich schwierig zu sein ein funktionierenden Code für so eine mega simple Aufgabe zu erstellen :/ :(

Per Interrupt muss man nur ein paar Dinge beachten:

  • Variablen die innerhalb und außerhalb eines Interrupts verwendet werden müsse als volatile deklariert werden
  • Im Interrupt geht keine Serial Ausgabe

Wenn man die LDRs über Schmitt-Trigger oder Komparatoren auf ein Digital-Signal bringt sollte sowas ähnliches gehen:

volatile boolean sensor1Triggered;
volatile boolean complete;
volatile unsigned long time1;
volatile unsigned long time2;

void setup()
{
     attachInterrupt(0, sensor1, RISING);    //Pin 2
     attachInterrupt(1, sensor2, RISING);    //Pin 3
}

void sensor1()
{
     if(sensor1Triggered == false)
     {
         time1 = micros();
         sensor1Triggered = true;
     }
}

void sensor2()
{
       if(sensor1Triggered == true)
       {
           time2 = micros();
           complete = true;
       }
}

void loop()
{
        if(complete == true)
        {
              Serial.print("Zeit: ");
              Serial.println((time2 -  time1) / 2);
           
              sensor1Triggered = false;
              complete = false;
        }
}

Ok, der Code von Serenifly ist eleganter als der dem ich ihm vor ein paar Wochen mal gepostet hatte. Das Prinzip war aber dasselbe mit 2 ISR's

Ist aber nicht sein Kernproblem, denn er bekommt die Schaltung mit den beiden Gattern nicht zum Laufen. @Fabio1989 : Kannst ja mal das letzte Fritzing nochmals posten. Und Geduld gehört auch dazu, vor allem wenn man was neues Lernen will.

Was soll ich sagen, als ich als Pascal/Delphi Mensch vor 3/4 Jahr mit C(++) angefangen habe, habe ich (fast) alles in den Refs. nachlesen müssen . Ohne Geduld und ein bisschen Ehrgeiz geht das gar nicht.

rudirabbit: Ist aber nicht sein Kernproblem, denn er bekommt die Schaltung mit den beiden Gattern nicht zum Laufen.

Das war doch in dem anderen Thread gelöst. Er hatte das eine eine Gatter falsch angeschlossen.

rudirabbit: Was soll ich sagen, als ich als Pascal/Delphi Mensch vor 3/4 Jahr mit C(++) angefangen habe, habe ich (fast) alles in den Refs. nachlesen müssen . Ohne Geduld und ein bisschen Ehrgeiz geht das gar nicht.

Wirst wohl recht haben =(

hier der Schaltplan

EDIT DER WAR FALSCH -.-

Das ist der falsche Plan vom 1 Versuch

While durch if oder ähnliches ersetzen

Ist eine sehr gute generelle Idee. Wenn loop () schnell fertig wird, braucht man oft gar keine ISR und hat doch ein Echtzeit-System.

while (analogRead(sensorPin1)<23) 
Serial.println("Warten-1");

Sowas ist natürlich noch tausendmal schlechter als ein böses delay ;) Und kriegt noch einen Zusatz-Minuspunkt für fehlendes Einrücken

hier der richtige Plan =)

michael_x:

While durch if oder ähnliches ersetzen

Ist eine sehr gute generelle Idee. Wenn loop () schnell fertig wird, braucht man oft gar keine ISR und hat doch ein Echtzeit-System.

while (analogRead(sensorPin1)<23) 
Serial.println("Warten-1");

Sowas ist natürlich noch tausendmal schlechter als ein böses delay ;) Und kriegt noch einen Zusatz-Minuspunkt für fehlendes Einrücken

das ... versteh ich nich ^^ gibt es nun eine alternative =?

das ... versteh ich nich ^^ gibt es nun eine alternative =?

@fabio: Das war ironisch gemeint.

Ich sehe keinen Fehler in dem Plan, außer das der 4093 die Leds evtl. nicht treiben kann. Was genau funktioniert nicht ?

Wenn du das nicht über ISRs machst, musst du auch statt analogRead() digitalRead() verwenden

Ändert allerdings an deiner Frage nichts. Du hast ja durch loop() eine Schleife. Du kannst dann wenn diese kurz genug ist, jedesmal den Zustand per if und digitalRead() abfragen.

rudirabbit: Ich sehe keinen Fehler in dem Plan, außer das der 4093 die Leds evtl. nicht treiben kann. Was genau funktioniert nicht ?

was meinst du mit "treiben kann " ?

bis zum Code bin ich noch gar nicht gekommen das Problem steckt schon in der Schaltung

ich weiß ja (aus älteren versuchen ) das die Ldr´s funktionieren und auch relativ sensibel sind

in der oben gezeigten Schaltung reagieren sie nicht mal .... sie sollen ja sobald der widerstand im LDR niedrig/hoch genug ist ein optisches Signal wieder geben ( LED an )

das passiert aber nicht ..... nichmal wenn ich mit einer LED Taschenlampe genau draufhalte ............. wenn ich den LDR überbrücke funktionieren beide LED`s also kann es daran nich liegen !

ich bin Rat und Plan los :(

und damit nicht genug .... selbst wenn die Schaltung funktionieren würde , habe ich immer noch keinen Code der die gemessene zeit durch 2 teilen kann und das Ergebnis als Delay vor die Aktion setzt -.- .....

Das IC bringt laut Datenblatt den Strom für die Led's nicht ganz.

Aber wenn die LED Leuchten beim Überbrücken der LDR leuchten sind wir schon einen Schritt weiter. Ich denke es liegt an dem Wert der beiden Vorwiderständen vor den LDR's

Diese müssen so bemessen sein das die Spannung am Eingang des Gatters im Arbeitsfenster liegt. Hast du Trimmpoties zur Hand ?

Hattest du nicht mal gesagt, dass das eine Gatter funktioniert hat?

Fabio1989: was meinst du mit "treiben kann " ?

Das kommt von "Stromtreiber"

Das IC hat nur einen ganz geringen Ausgangsstrom. Logik-ICs generell können nicht so viel Strom. Maximal vielleicht 10mA und hier sind es noch weniger. Was du machen kannst ist einen Transistor dazwischen zu hängen: http://www.techshire.com/freebies/LED4dummies_images/LEDNPN.jpg R2 hat dabei ca. 500-1000 Ohm

Sollte im Prinzip gehen. Hier ist sowas mal um damit ein Relais zu steuern: http://home.xmsnet.nl/hanmir/ldr.jpg

Spiele vielleicht mal mit dem LDR Widerstand. z.B. testweise durch ein Poti ersetzen.

Und den Interrupt Code den ich vorhin gepostet habe sollte so auch mit if-Abfragen gehen:

boolean sensor1Triggered;
unsigned long sensor1Time;

const int sensor1 = 2;
const int sensor2 = 3;

void setup()
{
     pinMode(INPUT, sensor1);
     pinMode(INPUT, sensor2);
}

void loop()
{
     if(digitalRead(sensor1) == HIGH && sensor1Triggered == false)
     {
         time1 = micros();
         sensor1Triggered = true;
     }

       if(digitalRead(sensor2) == HIGH && sensor1Triggered == true)
       {         
              Serial.print("Zeit: ");
              Serial.println((micros() -  sensor1Time) / 2);
           
              sensor1Triggered = false;
       }
}

Statt Serial.print() kannst du dann auch delay() oder was auch immer machen.

Wenn es falsch ist, bitte korrigieren :)

rudirabbit: Das IC bringt laut Datenblatt den Strom für die Led's nicht ganz.

Aber wenn die LED Leuchten beim Überbrücken der LDR leuchten sind wir schon einen Schritt weiter. Ich denke es liegt an dem Wert der beiden Vorwiderständen vor den LDR's

Diese müssen so bemessen sein das die Spannung am Eingang des Gatters im Arbeitsfenster liegt. Hast du Trimmpoties zur Hand ?

auf die nummer mit den Potis bin ich schon gekommen ^^ hatte erst einen mit 10 MOhm dann 250 kOhm .... hab noch nen No name rumliegen ...den hab ich noch nich getestet denke er wird so ca 10k Ohm haben haber auch wenn ich den poti brücke ( nur kurz ) keine reaktion der LED´s ....