Schönen guten Tag, ich versuche in Canape eine Funktion zu programmieren, die wenn ein Signal einen bestimmten Wert überschreitet einen Zaehler hochzaehlen lässt. Mein Programmierwissen ist leider sehr gering und mein Ansatz ist so: function Zaehler (double Signal) { int zaehler=0; for (Signal=0; Signal<300; Signal++){ //printf("Signalwert ist kleiner/gleich 10. Zaehler zaehlt nich mit!"); } if(Signal==10){ zaehler=zaehler+1; printf("Der Zaehler betraegt: 2d", zaehler); } return zaehler; //break; } Ist das so ungefaehr richtig oder ist das totaler Nonsense?? Vielen Dank. Nico
:
Verschoben durch Admin
Absoluter nonsense auch wenn ich CANape nicht kenne. Erklärung: Du setzt das übergebene Signal sofort 0 zählst es hoch bis 299 und fragst mit if ob es 10 ist. Macht das Sinn? Gruß
ok ich dachte das man damit sagt das eingelesene signal gibt zwsichen ienem wert ovn 0-299 die orintausgabe aus und bei genau 10 zaehlt der zaehler um eins hoch und wird ausgegeben... function Zaehler (double Signal) { double zaehler=0; if(Signal==10){ zaehler=zaehler++; } return zaehler; } jetzt habe ich es so ist das besser? also wenn das eingelesene signal 10 wird soll jedes mal der zaehler mitzaehlen.
Nico R. schrieb: > ok ich dachte das man damit sagt das eingelesene signal gibt zwsichen > ienem wert ovn 0-299 die orintausgabe aus und bei genau 10 zaehlt der > zaehler um eins hoch und wird ausgegeben... Bitte?!? Du näherst dich an. Ich hoffe aber dass dir bewust ist, das nur eine 0 oder eine 1 zurückgegeben wird? Gruß
Ape schrieb: > Du näherst dich an. Ich hoffe aber dass dir bewust ist, das nur eine 0 > oder eine 1 zurückgegeben wird? Und sogar mit 99.999%-ger Wahrscheilichkeit eine "0". Gruß AVR-Newbie
ja ok der nimmt den ersten wert vom signal und schaut, ob es ueber 10 oder unter 10 ist und dann gibt er je nach dem 0 oder 1 aus. Wie kann ich es machen das er das gesamte Signal abfaehrt?
Nico R. schrieb: > ja ok der nimmt den ersten wert Falsch! nicht den Ersten, sonder den übergenenen Wert... Nico R. schrieb: > schaut, ob es ueber 10 > oder unter 10 ist Falsch, die Funktion schaut, ob der wert ==10 ist ;-) Nico R. schrieb: > Wie kann > ich es machen das er das gesamte Signal abfaehrt? Die Funktion mehrfach aufrufen? Gruß AVR-Newbie
Nico R. schrieb: > Wie kann > ich es machen das er das gesamte Signal abfaehrt? Array übergeben -> Dann mit einer for Schleife durchlaufen. oder AVR-Newbie schrieb im Beitrag #3032446: > Die Funktion mehrfach aufrufen? Nicht vergessen zaehler=zaehler++; korrigieren ;) Gruß
naja also er uebergibt ja ein signal in dem sich der wert in abhaengigkeit von der zeit aendert. kannst du mir sagen wie das mit den arrays und der schleife geht?
naja ich nehme eine messung aus canape und packe die messung als double signal in meine function.
Nico R. schrieb: > Canape Was ist das? Kannaffe, ein Sofa oder ein Catering-Service in Hannover? mfg.
Eine Frage am Rande: Willst du die Funktion für Online- oder Offline- Berechnungen nutzen? Gruß
Thomas Eckmann schrieb: > Was ist das? Kannaffe, ein Sofa oder ein Catering-Service in Hannover? > > mfg. Kalibrier- Tool von Vector Informatik GmbH Gruß
> naja ich nehme eine messung aus canape und packe die messung als double > signal in meine function. > Signal einen bestimmten Wert überschreitet Das Wort 'überschreitet' impliziert schon etwas! Dein Problem: du ratest momentan drauf los ohne nachzudenken. Lass uns mal einen Schritt zurückgehen. Ich bin deine Messvorrichtung und du bist der Auswerter. D.h. ich gebe dir einen Messwert nach dem anderern und jedesml, wenn ich einen Messwert fertig habe, kriegst du ihn und du machst dann dein Ding. Wie läuft das ab? Wir beide arbeiten immer wechselseitig. Erst ich, dann du Ich Du 23 ? 45 ? 8 ? 123 ? Was genau machst du an den Stellen, an denen das ? steht, wenn ich dir den jeweils nächsten Messwert präsentiere? Wie kriegst du die Information zusammen, die du im Endeffekt haben willst? Formuliere deine Strategie so ausführlich und so konkret wie du nur kannst. Du kannst, nein - du sollst, dazu ruhig Umgangssprache benutzen. Also ohne Rücksicht auf irgendwelche Programmiersprachenregeln. Teste deine Strategie mit den konkreten Zahlen. Wenn du diese Strategie deiner kleinen Schwester aufträgst, dann muss sie zum gleichen Ergebnis kommen wie du. Wenn nicht, wenn sie sich nicht auskennt, dann musst du die Beschreibung deiner Strategie noch verfeinern. Programmieren besteht nicht darin, dass man irgendwelche Schlüsselwörter und Sonderzeichen in irgendeiner Reihenfolge anordnet. Programmieren beginnt damit, dass man sich erst mal über die Strategie im klaren ist, die einem zum Ziel führt. Die Startegie, auch Algorithmus genannt, ist das wesentliche. Die Programmiersprache ist nur das Werkzeug um diese Strategie umzusetzen.
wenn ich den ersten wert also 23 ausgegeben bekomme soll mein zaehler um 1 hoch zaehlen und im anschluss danach möchte ich den naechsten wert. wenn dieser nun immernoch über der schwelle ist, sagen wir mal 10 dann soll der zaehler bei 1 bleiben und der naechste wert soll angezeigt werden also 8. nun soll der zaehler bei 1 bleiben und wenn die die schwelle beim naechsten wert(123) wieder überschreiten soll der zaehler auf 2 gehen.
Nico R. schrieb: > wenn ich den ersten wert also 23 ausgegeben bekomme soll mein zaehler um > 1 hoch zaehlen und im anschluss danach möchte ich den naechsten wert. > wenn dieser nun immernoch über der schwelle ist, sagen wir mal 10 dann > soll der zaehler bei 1 bleiben und der naechste wert soll angezeigt > werden also 8. nun soll der zaehler bei 1 bleiben und wenn die die > schwelle beim naechsten wert(123) wieder überschreiten soll der zaehler > auf 2 gehen. Das ist mir zu konfus. Forumlier es nochmal. Aber diesmal versteifst du dich nicht darauf, was du haben willst, sondern du lieferst mir ein Kochrezept, das ich nur Schritt für Schritt befolgen muss. Fragen und Gedanken dazu > > wenn ich den ersten wert also 23 ausgegeben bekomme soll mein zaehler um > 1 hoch zaehlen Warum? Aus welchem Grund soll hier der Zähler um 1 hochgezählt werden? Ist das immer so? Hat es mit der 23 eine bestimmte Bewandtnis? Oder was ist sonst der Grund dafür, warum der Zähler sich um 1 erhöhen soll? Woran hast du das fest gemacht, dass der Zähler sich um 1 erhöhen soll? (Wichtig: es ist ok, wenn du mir erzählst was deine Beweggründe sind. Aber letzten Endes interessiert mich nur das Kochrezept. Das ist der entscheidende Punkt. Und das da oben ist kein Kochrezept. Das ist ein: Ich hätte gerne ... Es ist der unterschied zwischen Ich würde gerne nach Hawaii fahren, weil dort das Wetter so schön ist und man surfen kann versus * gehe ins Reisebüro * sage der Angestellten, dass ich nach Hawaii will * warte auf ein Angebot für einen Flug * kaufe den Flug * packe die Koffer * steig am Reisetag in den Flieger * steig in Hawaii aus * wenn die Sonne scheint, ziehe eine kurze Hose an * wenn die Sonne scheint, gehe an den Strand * leihe mir ein Surfboard * paddle hinaus aufs Meer * Wenn eine Welle kommt, dann stelle dich aufs Board ... Das letztere ist ein Kochrezept, das ich Schritt für Schritt befolgen muss um ganz sicher beim Surfen in Hawaii zu landen. Du erzählst was du haben willst. Und jetzt geht es darum, die Schritte zu finden, die man befolgen muss um Schritt für Schritt zur Lösung zu gelangen. > und im anschluss danach möchte ich den naechsten wert. den kriegst du sowieso. Denn wir beide arbeiten ja immer wechselseitig. Ich geb dir eine Zahl - du bearbeitest sie - ich geb dir eine Zahl - du bearbeitest sie - ich geb ....
der zaehler soll immer dann hoch zaehlen, wenn er den wert z.b.10 überschreitet. aber auch nur wenn er von 9-Schwelle-11 geht also hoch geht und nicht 11-schwelle-9 nach unten. also: ich habe den ersten wert 23 schaue ob dieser grösser oder kleiner als meine schwelle (10) ist. ist der wert grösser geht der zaehler auf eins. ist der wert kleiner als meine schwelle bleibt der zaehler auf null. nun bekomme ich den zweiten wert 45. hier muss ich schauen, ob der vorherige wert(23) schon über meiner schwelle war oder nicht. Wenn der vorherige wert(23)drüber war dann bleibt mein zaehler so wie er ist also auf der 1. waere er nicht drüber gewesen muss sich der zaehler wieder um einen erhoehen. nun bekomme ich den wert 8.da dieser unterhalb der schwelle ist passiert nicht. beim naechsten wert 123 schaue ich wieder was der vorherige wert(8) war. war dieser ueberhalb der schwelle passiert nichts. war dieser aber unterhalb und wir haben die schwelle ueberschritten steigt der zaehler wieder um 1.
Nico R. schrieb: > der zaehler soll immer dann hoch zaehlen, sag nicht " Der Zähler soll" 'soll' ist eine Absichtserklärung. Die ist als solche nichts wert. * ich kriege einen Messwert (zb 23) * ist dieser Messwert größer als die Schwelle? * wenn ja: ....... > wenn er den wert z.b.10 > überschreitet. aber auch nur wenn er von 9-Schwelle-11 geht also hoch > geht und nicht 11-schwelle-9 nach unten. > also: > ich habe den ersten wert 23 schaue ob dieser grösser oder kleiner als > meine schwelle (10) ist. Gut > ist der wert grösser geht der zaehler auf eins. Sagen wir: der Zähler wird um 1 erhöht. Ob das jetzt eins ist oder drei oder fünf hängt davon ab, was der Zähler vorher war. Daher sagen wir einfach mal: er wird um 1 erhöht. > ist der wert kleiner als meine schwelle bleibt der zaehler auf null. Hier sagen wir mal: der Zähler wird nicht verändert. Aus dem gleichen Grund wie vorher. Aus dem Grundzustand heraus läuft es aufs gleiche raus. Denn wenn der Zähler gerade bei 0 steht, dann stimmen deine konkreten Zahlen. Aber du willst ja nicht nur eine Zahl bearbeiten, du willst ja viele Messwerte bearbeiten. Und bei den folgenden Messwerten ist es dann ja nicht mehr so, dass der Zähler 0 war, sondern der kann ja schon irgendeinen Wert haben. > nun bekomme ich den zweiten wert 45. hier muss ich schauen, ob der > vorherige wert(23) schon über meiner schwelle war oder nicht. Ok. Das bedeutet aber auch: du musst dir irgendwie 'merken', dass bei der vorhergehenden Messung die Schwelle überschritten wurde. Denn jetzt, bei den 45 benötigst du diese Information. > Wenn der > vorherige wert(23)drüber war dann bleibt mein zaehler so wie er ist also > auf der 1. waere er nicht drüber gewesen muss sich der zaehler wieder um > einen erhoehen. Das heisst, deine Regel von oben, die zum Erhöhen des Zählers geführt hat, modifiziert sich ein wenig. Der Zähler wird erhöht, wenn * der Messwert größer als die Schwelle ist * UND der vorhergehende Messwert kleiner als die Schwelle war > nun bekomme ich den wert 8.da dieser unterhalb der schwelle ist passiert > nicht. OK. Das passt immer noch zu der jetzt besseren Regel, wann ein Erhöhen stattfinden soll. Die besteht ja jetzt aus 2 Teilen, die beide erfüllt sein müssen, damit es zu einer Erhöhung kommt. 8 erfüllt aber bereits den ersten Teil dieser Regel nicht. Also kommt es auch zu keiner Erhöhung. > beim naechsten wert 123 schaue ich wieder was der vorherige wert(8) war. Gut. Das deckt sich mit der Erkenntnis von weiter vorne, dass du dir irgendwie den letzten Messwert merken musst. So gesehen ist das eine Bestätigung, dass du nicht so falsch liegen wirst. > war dieser ueberhalb der schwelle passiert nichts. > war dieser aber > unterhalb und wir haben die schwelle ueberschritten steigt der zaehler > wieder um 1. OK. passt immer noch zu den bisherigen Gedanken. Damit kannst du dein Kochrezept etwas verfeinern. PS: Im Grunde musst du dir nicht den letzten Messwert merken. Denn alles was dich interessiert ist doch, ob dieser letzte Messwert über oder unter der Schwelle lag. Der exakt Zahlenwert ist zweitrangig.
ok so weit so gut :) ich habe mal versucht es in einen code zu schreiben aber leider weiss ich nichtmal annaehernd ob das so richtig ist: function Zaehler (double Signal) { int zaehler=0; if (Signal >=10){ zaehler=zaehler++; //naechster Wert; } else { //naechster Wert; } return zaehler; if (letzterWert>=10 && Signal<=10){ //naechster Wert; } else if (letzterWert>=10 && Signal>=10){ //naechster Wert; } else { zaehler=zaehler++; //naechster Wert; } }
Im Grunde hat Karl Heinz schon alles erklärt ;-) Ich berechne alles online, daher musste erst nachschauen… My 2 Cents:
1 | function irgendEinName (signal) |
2 | {
|
3 | Double d1 = signal; |
4 | Double d2 = signal[-1]; |
5 | // hier deine Berechnung….
|
6 | |
7 | return (signal-1); |
8 | }
|
Diese Funktion berechnet (und gibt zurück) dir für jeden Wert des „signal“s (signalwert-1). d1 erhält jedes Mal den aktuellen Wert des „signals“ und d2 den Wert davor. Wenn du einen virtuellen Kanal mit dieser Funktion definierst, wird automatisch jeder Wert des übergebenen Signals verarbeitet. Somit sind Schleifen und das „mehrfach aufrufen“ vom Tisch. Bei CANape- Hilfe => „Beispiele für Funktionen“ findest du auch weitere nützliche Informationen. Gruß
Kompilieren... Fehler beim Kompilieren: Ausdruck kann keiner Konstanten zugewiesen werden. der fehler kommt bei mir nach dem ich double xy1=signal; double xy2=signal[-1]; eingebe
Nico R. schrieb: > ok so weit so gut :) > > ich habe mal versucht es in einen code zu schreiben zu früh. viel zu früh. Du hast die nächsten 5 Schritte in der Algorithmenentwicklung übersprungen. > aber leider weiss > ich nichtmal annaehernd ob das so richtig ist: Es ist noch nicht einmal annähernd richtig. Willst du geordnet weiter machen, oder schlägst du dich so durch? Sags gleich. Ich hab nämlich keine Lust mir den Mund fusselig zu Reden um dir die allerersten Schritte in der Programmierung beizubringen, wenn du dann soewieso alles in den Wind schlägst.
AVR-Newbie schrieb im Beitrag #3032950: > Bei CANape- Hilfe => „Beispiele für Funktionen“ findest du auch weitere > nützliche Informationen. Hast du da mal auf die Schnelle einen Link dazu? Damit ich mich auch kurz einlesen kann, wie die Funktion eigentlich ins System integriert wird :-)
ja schon geordnet aber wie geht es denn jetzt weiter ich weiss ja jetzt wie due schritte sind oder fehlt da zwischen was?
Nico R. schrieb: > ja schon geordnet aber wie geht es denn jetzt weiter ich weiss ja jetzt > wie due schritte sind oder fehlt da zwischen was? Dein 'Kochrezept' ist ja noch gar nicht fertig! Bis jetzt gibt es ja nur Gedankengänge, aber keine saubere Reinschrift, die man auch mal abseits vom µC testen könnte! Und genau so konfus sieht dann auch dein letzter 'Programmentwurf' aus! es reicht nicht, so ungefähr zu wissen, wie die Sache ablaufen soll. Du musst im Vorfeld EXAKT wissen, wie deine Vorschrift aussehen soll, ehe es dann darum geht sich den Syntaxvorschriften und Feinheiten einer Programmiersprache zu unterwerfen.
ok also ich versuch es nochmal etwas feiner zu machen: -Signal einlesen - schauen, ob der signalwert gleich/höher der schwellenwert ist - wenn der wert geringer ist passiert nichts - wenn der wert gleich/höher ist dann zaehlt der zaehler eins hoch - schauen, ob der letzte wert grösser/gleich oder kleiner als die schwelle ist - wenn derletze wert grösser/gleich war passiert nichts (egal wie der aktuelle wert ist - war der letzte wert kleiner als die schwelle, schauen wie gross der aktuelle wert ist -ist dieser grösser/gleich der schwelle dann zaehler um einen erhoehen -ist der kleiner, passiert nichts -ausgabe der Zaehlers
Karl Heinz Buchegger schrieb: > Hast du da mal auf die Schnelle einen Link dazu? > Damit ich mich auch kurz einlesen kann, wie die Funktion eigentlich ins > System integriert wird :-) Nein, sorry, die Hilfe-Funktion ist ins Programm integriert. Habe aber ein paar Funktionen als Beispiel angehängt: Verlauf01.jpg: da sind 4 Signalverläufe -nMotor: Originalsignal -nMot_Verschoben = Signalverschibung(nMot); -zeitliche Verschibung = zeitlicheVerschibung(nMot) -MesspunktCounter = MessPunktCouter(nMot) Bei der letzten Funktion ist zu beachten, dass der Counter global definiert ist. Ich hoffe geholfen zu haben. @ Nico: Signal einlesen = ein „virtuellen Messdateikanal einfügen“, d.h. den gemessene Messdateikanal einfach durch deine Funktion durchprügeln ;-) Gruß
ja das mit dem virtuelle messkanal das weiss ich aber wenn die funktion nicht geht oder richtig ist bringt mich das auch incht weiter ...
hr. buchegger reicht das so oder soll es noch genauer oder koennen sie mir sagen was darin fehlt?
Ich lese garade mal mit, obwohl ich nichts von CANape weiß. Aber deine letzten Postings sind nicht nett. Es gibt Leute, die nicht dauern am Rechner bzw im Forum hängen. Einige müssen auch noch nebenbei Geld verdienen. Nett gemeinter Rat: Warte also ab, bis K.H. sich meldet und drängle nicht. Christian
Nico R. schrieb: > hilfe :) Ich versuche es mal... Nico R. schrieb: > -Signal einlesen Völliger Blödsinn, habe oben schon geschrieben... Nico R. schrieb: > ja das mit dem virtuelle messkanal das weiss ich Wenn du mit „virtuellen“ Kanälen klar kommst, dann ist ja alles OK. Nico R. schrieb: > - schauen, ob der signalwert gleich/höher der schwellenwert ist > - wenn der wert geringer ist passiert nichts > - wenn der wert gleich/höher ist dann zaehlt der zaehler eins > hoch > - schauen, ob der letzte wert grösser/gleich oder kleiner als die > schwelle ist > - wenn derletze wert grösser/gleich war passiert nichts (egal > wie der aktuelle wert ist > - war der letzte wert kleiner als die schwelle, schauen wie > gross der aktuelle wert ist > -ist dieser grösser/gleich der schwelle dann zaehler um > einen erhoehen > -ist der kleiner, passiert nichts Anstatt 7 verschiedene Fälle zu unterscheiden, definiere nur einen: wann soll der Zähler hoch zählen. „Passiert nichts“ kannst du dir schenken, dabei passiert ja nichts… Nico R. schrieb: > -ausgabe der Zaehlers Richtig! PS: meine CounterFunktion zählt bei jedem Wert +1. Wenn du das Hochzählen mit deinen Bedingungen verknüpfst, bist du schon da … Gruß AVR-Newbie
Vielen Dank an alle hier im Forum :) ich glaube es funktioniert ^^ hier meine Lösung: function Zaehler2 (double Signal) { int zaehler=0; if (Signal >= 10 && Signal[-1] < 10){ zaehler++; } return zaehler; }
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.