C Statusänderung feststellen

  • Hallo liebe Leute.
    Wir wollen mit unserem Pi Impulse zählen. Ein Induktiver Sensor gibt eine Spannung aus wenn sich
    ein Rad davor dreht. Mit dieser Spannung schalten wir einen Optokoppler und dieser Schaltet den Eingang mit Pullup Widerstand gegen Masse.

    Wir haben dazu etwas in C geschrieben um den Flankenwechsel mitzubekommen:

    Merker = in1 && !HMerker;
    HMerker = in1;
    if(Merker==1)
    {
    zaehler++;
    printf("\nZaehlstand = %i\n",zaehler);
    }

    gpio 0 ist hier als "in1" definiert, der Eingang mit Pullup Widerstand. Merker und HMerker sind bool,
    zaehler ist int.
    Es soll so sein das entweder nur die positive oder negative Flanke erkannt werden soll.
    Funktionier der ober Teil so? Ich habe da gerade ein Knoten in den Gehirnwindungen :blush:

    Lieben Gruß
    Sebastian

  • probiere es mit einem Taster,

    das Teil geht aber sofort aus der Schleife raus und wartet nicht bis wieder high kommt, ergo kommt er wieder ist immer noch low und zählt weiter, das ist bestimmt nicht gewünscht.

    also wenn er low erkennt setze ich einen merker und betrete erst wieder wenn er ein high erkannt hatte und der merker zurückgesetzt wurde.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • printf ist bisher nur im code um den zählerschritt mit den tatsächlichen schritten zu vergleichen. wir haben die möglichkeit die geschwindigkeit anzupassen und es somit zu testen. im späteren betrieb kommen ca alle 150 ms eine statusänderung.

    deinen vorschlag werde ich morgen mal ausprobieren, das sieht sehr vielversprechend aus.

    Lieben Gruß
    Sebastian

  • Mit den Interrupts werden wir uns in der Tat später herumschlagen müssen. Dieses Programm dient quasi als Kontrolle ob unsere Hardware und unsere erstellten Platinen das tuen was sie sollen.

    Lieben Gruß
    Sebastian

  • Das werdet ihr schwerlich mit einer Schleife ohne Sleeps feststellen, weil die Euch die Recheleistung dermassen abfackelt, dass für was anderes keine Rechenzeit mehr übrig bleibt.
    Wenn schon den RPi mit so was vergewaltigen, dann doch wenigstens 100ms sleep in die Schleife.
    Wenn vernünftig, dann gelcih mit ISR.
    cu,
    -ds-

  • So liebe Leute. Das Programm ist geschrieben und läuft wunderbar mit einem delay(5) in der schleife. Das macht der vergewaltigte Pi soweit gut mit (dreamshader ;) ).
    Nun wollte ich das bestehende Programm umschreiben und um zwei Interrupts in der Schleife ergänzen.

    Nach meiner Suche zur wiringPi habe ich folgende Variante gefunden:

    wiringPiISR (Pin, INT_EDGE_FALLING, interrupt_0) //definition des Interrupts und der Funtion

    waitForInterrupt (Pin, Wartezeit); //wartet die Wartezeit auf fallende Flanke von Pin 0 und springt dann
    //in die Funktion interrupt_0

    void interrupt_0(void);
    {
    ++int;
    }

    Soweit hab ich das mal in einem kleinen Programm getestet und es funktioniert auch wunderbar. Für mein vorhaben wäre es allerdings viel hilfreicher wenn das waitForInterrupt(Pin, Wartezeit) mir bei ausführung einfach nur ein Int oder Bool zur bestätigung ausgibt das es ausgeführt wurde.

    z.B. so:
    int = waitForInterrupt(Pin, Wartezeit)

    Ist das irgendwie möglich oder gibt es dazu einen anderen Befehl? Möchte jetzt ungern Funktionen schreiben welche dann eine Globale Variable beschreiben als Rückgabewert.

    Lieben Gruß
    Sebastian

  • Tach auch Sebastian,

    ehrlich gesagt ist mir nicht ganz klar, was Du da bezwecken willst.

    Zudem:

    Zitat


    The return value is -1 if an error occurred (and errno will be set appropriately), 0 if it timed out, or 1 on a successful interrupt event.


    passt doch ... oder was willst Du mehr?

    Wenn Du das Ganze sauber machen willst, würde ich die Interrupt-Routine resp. die Wartefunktion pro Pin jeweils in einem eigenen pthread realisieren.

    cu,
    -ds-

  • Hallo dreamshader,
    ja an sich passt das wunderbar, aber ich habs noch nicht geschafft dort meine Int 1 abzugreifen.
    hatte

    wiringPiISR (Pin, INT_EDGE_FALLING, )

    mit drin und

    int = waitForInterrupt (Pin, Wartezeit)

    aber in der wiringPiISR verlang er an 3. Stelle einen Funktionsaufruf. Kann ich diesen irgendwie weglassen? Ich bekomme immer Fehler wenn dort nichts ,void oder Platzhalter eingetragen ist.

    Ein eigener pthread? Da muss ich morgen wohl erstmal gucken was das ist :s

    Mal noch ein wenig Informationen zur Schleife und deren Sinn. Wir haben einen Portalkran mit X Y und Z Achse. In dieser Schleife fahren gleichzeitig X und Y und deren Impulse werden gezählt und ausgewertet. Ist die gewünschte Stelle für X bzw. Y erreicht bleibt der jeweilige Motor stehen. Haben sowohl X und Y die gewünschte Stelle erreicht wird die Schleife verlassen. Klappt soweit auch ganz gut, aber jetzt wollte ich es doch mal in "schön" probieren mit den Interrupts.

    Lieben Gruß
    Sebastian

  • Da hab ich es ja her ;)

    Dort ist aber halt auch eine zusätzliche Funktion mit drin die ich eigetnlich umgehen möchte.
    Naja ich lese mir morgen mal die anderen Kommentare dazu durch, vielleicht steckt da ja noch was.
    Bis dahin vielen Dank für die Hilfe :)

    Lieben Gruß
    Sebastian

  • Hi,

    was für eine zusätzliche Funktion :s

    Wenn Du die rot markierte meinst:

    Spoiler anzeigen

    void interrupt_0(void)
    {
    printf("Interrupt: rising to high!");
    }

    main()
    {

    wiringPiSetup();
    pinMode(0, INPUT);

    wiringPiISR (0, INT_EDGE_RISING, interrupt_0) ;


    genau die ist ja der Witz einer ISR ...

    cu,
    -ds-

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!