Pages: 1 2 [3] 4 5   Go Down
Author Topic: PWM-Signal auswerten  (Read 8720 times)
0 Members and 1 Guest are viewing this topic.
Wien
Online Online
Edison Member
*
Karma: 28
Posts: 1923
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok, gelesen, kann man anscheinend.
aber vergleiche sind immer mit doppeltem gleichheitszeichen, also LED1v==LOW.

gruß stefan
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 270
Posts: 21851
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi,

kann man pins, die auf output gesetzt sind, mit digitalread einlesen?

gruß stefan
Jein

Beim Arduino UNO, MEGA, Nano ecc schon; beim Due nicht; beim Leonardo weiß ich nicht.

Grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Achso.
Danke! Das mit dem == wars. Jetzt bringt er keine Fehlermeldungen mehr.
« Last Edit: February 15, 2013, 02:50:08 pm by Bluetruck » Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 270
Posts: 21851
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Er bringt aber immer noch die andere Fehlermeldung.
"IValue (am anfang ein i)benötigt für übrige/fehlende Rechengröße in Aufgabe" Versuchsweise Übersetzung. Also jedenfalls hat es was mit dem letzten Teil in der if-bedingung zu tun
Code:
&& LED1v=LOW
Denn wenn ich ihn weglösche, kommt kein Fehler

LED1v=LOW ist eine Zuweisung

LED1v==LOW ist ein Vergleich.

Normalerweise macht eine Zuweisung innerhalb if keine Fehlermeldung; funktioniert dann aber nicht. In diesem Fall glaube ich, bekommst Du eine Fehlermeldung weil Du LOW und HIGH vergleichst.

Grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Auf jeden Fall funktioniert es jetzt! Danke an alle   smiley-grin
Mit genauen Widerständen muss ich noch ausprobieren. Hab jetzt an einer Schaltung ausprobiert, die eigentlich für was anderes gedacht war. Aber erfüllen tut sie den gleichen Zweck. Der Toleranzbereich eines Widerstands beträgt so etwa 20.
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 270
Posts: 21851
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 1
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 270
Posts: 21851
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Code:
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.
« Last Edit: February 16, 2013, 10:00:54 am by Bluetruck » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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.

Quote
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:

Code:
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);
}
Logged

Offline Offline
God Member
*****
Karma: 14
Posts: 990
ATmega 2560
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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;

Code:
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
  }


Logged

Tschau
Doc Arduino

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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  smiley-lol

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


Quote
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....  smiley-cry smiley-lol
Logged

Offline Offline
God Member
*****
Karma: 14
Posts: 990
ATmega 2560
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.  smiley-mr-green
Logged

Tschau
Doc Arduino

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn ich das so lese finde ich das einfach genial.  smiley-mr-green

Stimmt, Dankeschön  smiley-lol

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

Zwei andere Fragen:
1) Das togglen funktioniert bei mir nicht. Wird immer als unbekannter Befehl (diesmal richtig? smiley-lol) 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:
Code:
if (millis() - previousMillis > interval) {
Wieso ein ">", und nicht ein "="? Funktionierten tut letzeres ja auch!?
Logged

Pages: 1 2 [3] 4 5   Go Up
Jump to: