Forum: Mikrocontroller und Digitale Elektronik Funktion in Canape programmieren


von Nico R. (nicor85)


Lesenswert?

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
von Ape (Gast)


Lesenswert?

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ß

von Nico R. (nicor85)


Lesenswert?

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.

von Ape (Gast)


Lesenswert?

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ß

von AVR-Newbie (Gast)


Lesenswert?

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

von Nico R. (nicor85)


Lesenswert?

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?

von AVR-Newbie (Gast)


Lesenswert?

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

von Ape (Gast)


Lesenswert?

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ß

von Nico R. (nicor85)


Lesenswert?

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?

von AVR-Newbie (Gast)


Lesenswert?

Nico R. schrieb:
> naja also er uebergibt ...

Wer uebergibt?

Gruß

von Nico R. (nicor85)


Lesenswert?

naja ich nehme eine messung aus canape und packe die messung als double 
signal in meine function.

von Thomas E. (thomase)


Lesenswert?

Nico R. schrieb:
> Canape
Was ist das? Kannaffe, ein Sofa oder ein Catering-Service in Hannover?

mfg.

von AVR-Newbie (Gast)


Lesenswert?

Eine Frage am Rande:
Willst du die Funktion für Online- oder Offline- Berechnungen nutzen?

Gruß

von Nico R. (nicor85)


Lesenswert?


von Nico R. (nicor85)


Lesenswert?

fuer offline-auswertung

von AVR-Newbie (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Was ist das? Kannaffe, ein Sofa oder ein Catering-Service in Hannover?
>
> mfg.

Kalibrier- Tool von Vector Informatik GmbH

Gruß

von Karl H. (kbuchegg)


Lesenswert?

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

von Nico R. (nicor85)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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

von Nico R. (nicor85)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Nico R. (nicor85)


Lesenswert?

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;
               }
}

von AVR-Newbie (Gast)


Lesenswert?

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ß

von Nico R. (nicor85)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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

von Nico R. (nicor85)


Lesenswert?

ja schon geordnet aber wie geht es denn jetzt weiter ich weiss ja jetzt 
wie due schritte sind oder fehlt da zwischen was?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Nico R. (nicor85)


Lesenswert?

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

von AVR-Newbie (Gast)


Angehängte Dateien:

Lesenswert?

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ß

von Nico R. (nicor85)


Lesenswert?

ja das mit dem virtuelle messkanal das weiss ich aber wenn die funktion 
nicht geht oder richtig ist bringt mich das auch incht weiter ...

von Nico R. (nicor85)


Lesenswert?

hr. buchegger reicht das so oder soll es noch genauer oder koennen sie 
mir sagen was darin fehlt?

von Nico R. (nicor85)


Lesenswert?

hilfe :)

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

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

von AVR-Newbie (Gast)


Lesenswert?

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

von Nico R. (nicor85)


Lesenswert?

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
Noch kein Account? Hier anmelden.