Interrupt funktioniert nicht

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo, habe den Code

    Jedoch kommt da eine Fehlermeldung:

    Code
    ./code.c: 4: ./code.c: Syntax error: "(" unexpected


    Warum tut sich beim ersten Code nichts und wieso ist der zweite Code falsch?

    Einmal editiert, zuletzt von Cool_pi (3. April 2015 um 22:54)

  • Hallöle,
    füg mal einen Zeilenumbruch ein:


    ...
    printf("Interrupt: rising to high!\n");
    ...


    Code
    ...
        wiringPiISR (7, INT_EDGE_RISING, interrupt_0) ;
    ...


    merkst Du was?

    Code
    ...
        wiringPiISR(7, INT_EDGE_RISING, &interrupt_7);
    ...

    So long ...
    -ds-

  • Es ist leider spät, ich merke nichts mehr :( Was soll da denn falsch sein? Auch mit Zeilenumbruch und ohne & Zeichen kommt die gleiche Fehlermeldung. :wallbash:
    Kurios beim Kompilieren wird kein Fehler angezeigt, aber dann beim ausführen.
    Führe das Programm mit

    Code
    sudo ./code.c

    aus

    Einmal editiert, zuletzt von Cool_pi (10. März 2015 um 23:46)

  • Du solltest aufmerksamer lesen ...
    Zeilenumbruch ist im zweiten Source eh drin ... wo also wird der wohl hingehören?

    Das Ampersand ist im zweiten Source - das ist falsch :fies:
    Die Adresse einer Funktion ist deren Name ....
    Wenn Du anschliessend immer noch einen Fehler bekommst, dann tippe ich auf ein Steuerzeichen, das Du da irgendwie reingebracht hast.
    Nutze einen Editor für/unter Linux - lösche die Zeile, die der Compiler nicht mag - füg sie neu ein.

    cu,
    -ds-

  • Hallo.

    also... irgendwie passt doch der ganze Struct nicht...
    weil:


    geschweifte Klammer nach while(1) fehlt.
    Das zerreist den restlichen Struct.

    warum dann diese Leerzeile zwischen den Zeilen ?
    gerade das sind Fangfallen wie -ds- sagte für nicht sichtbare Sonderzeichen die da reinrutschen o.ä.

    gruß root

    //edit
    zeig mal den komplette Code bitte

    Einmal editiert, zuletzt von root (11. März 2015 um 00:15)


  • ...

    Warum postest Du verschiedene Sourcen? :fies:
    Ich glaube nicht, dass root da was manipuliert hat ...
    Also bitte ... wenn das ernsthaft was werden soll, dann
    - gesamten Source posten
    - nur diesen, und genau diesen auch verwenden
    - alle Fehlermeldungen inkl. Compileraufruf posten
    - nichts im Nachherein verändern sondern erst auf Ansage

    Wenn das so nicht klappt, können wir uns den Zirkus hier schenken ...

    cu,
    -ds-


    Also das ist echt misteriös.


    da ist nix mysteriöses dran ...

    Code
    gcc -o code code.c -L/usr/local/lib -lwiringPi


    passt doch schon mal ...


    ... ausgeführt mit

    Code
    ./code.c


    auch

    Code
    gcc -o $ code.c $code -lwiringPi


    und Aufruf mit

    Code
    ./$ code.c


    zeigt den gleichen Fehler an


    das ist alles hahnebüchener Unsinn ...
    gcc -o macht was?

    Ein paar Grundlagen aneignen ... sonst kommst Du da nicht weit ...
    cu,
    -ds-

  • Habe den zweiten Code verworfen. Das hätte ich vorher dazu sagen sollen. Der ist ja total falsch wie ich verstanden habe. Versuche es nun mit diesem hier


    Habe auch schon unterschiedliche Namen für Funktionen interrupt probiert. Habe den Code kopiert oder per Hand eingetippt. Es kommt immer der gleicher Fehler:denker:

    Einmal editiert, zuletzt von Cool_pi (11. März 2015 um 01:14)

  • Hallo zusammen, hallo Cool_Pi,

    eigentlich wollte ich mich in diesem Thread nicht zu Worte melden, nachdem ich mit Dir, Cool_Pi, schon einige PN während der vergangenen Tage habe austauschen dürfen.

    Normalerweise fängt man - wenn man eine Programmiersprache erlernen möchte - mit einem einfachen Beispiel an. Z.B. diese typischen Hello-World-Dinger.

    Diese haben einen tieferen Sinn
    1. Man hat ganz schnell ein Erfolgserlebnis - vielleicht 3 bis 5 Zeilen eingegeben und irgendwas passiert
    2. Man bekommt bei Tippfehlern, die sich so einschleichen, ganz schnell die Grenzen aufgezeigt - der Präprozessor meckert, der Compiler meckert, das Laufzeitsystem meckert.
    3. Auf diese Weise bekommt man den normalen Ablauf einer Software-Entwicklung eingetrichtert.

    Dazu gehört auch eine ToolChain, die letztlich zum ausführbaren Programm führt. Und spätestens nach dem Hello-World-Dingens sollte klar sein, durch welche Befehle aus dem Quellcode ein ausführbares Programm wird.

    Cool_Pi, mal ganz im Ernst, meinst Du nicht, dass es angebracht ist, Dich als Erstes mit der Programmiersprache zu beschäftigen, bevor Du mit ganz obskuren Codezeilen an die Interrupt-Programmierung gehst? :s

    Diese - Deine - Vorgehensweise sorgt nämlich dafür, dass Du zu keinem Zeitpunkt einer Software-Entwicklung Sicherheit in dem erlangen wirst, was Du gerade machst.

    Wenn ich nicht verstehe, warum ein Programm mal fehlerfrei compiliert, dann aber mit Laufzeitfehlern abstürzt, dann versuche ich ersteinmal, die Fehlerursache zu verstehen und zu beseitigen. Ansonsten würde ich versuchen Sicherheit in dem, was Du machst, zu gewinnen. Vertrauen darin, dass der Compiler zuverlässig arbeitet. OK, gcc ist in der Hinsicht über so ziemlich jeden Zweifel erhaben. :cool:


    Und die absolute Grundlage ist die Syntax einer Programmiersprache. Die muss sitzen - sonst gilt

    Code
    Programmierversuch :=: Totalfrust

    :=: ist der Doppelzuweisungs-Operator bzw. Tausch-Operator - funktioniert aber bestimmt nicht in C...

    Ich bin mir sicher, dass Dir jeder gern helfen würde, aber für meinen Teil muss da ein wenig mehr kommen. Die Grundlagen musst Du Dir selber aneignen - da kann Dir keiner helfen. Wenn Du dann Fragen zur Gestaltung eines Programmes hast, zur Optimierung des Zeitverhaltens hast etc., dann zu helfen, macht wieder richtig Spaß!


    Denke mal drüber nach und lerne die Grundlagen...


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (11. März 2015 um 01:23)

  • Hallo Andreas.


    Ich bin mir sicher, dass Dir jeder gern helfen würde,


    Stimme ich dir vollkommen zu.


    Die Grundlagen musst Du Dir selber aneignen - da kann Dir keiner helfen.


    Warum nicht, selbst bei nem Anfänger klemmt es oft.

    Ich denke, viele machen den Fehler (grade an Anfang) kopieren sich irgend nen Code ... rein damit, compilieren ... geht net dann kommt das große Fragezeichen.
    Wie du sagtest... "Hello world", wenn das kapiert ist ... nächster Schritt.

    gruß root

  • Hallo Root,


    Warum nicht, selbst bei nem Anfänger klemmt es oft.

    Ja, zum Glück klemmt es bei uns nicht so oft - das wäre echt ungünstig...

    Aber was willst Du machen?

    Ich habe damals Programmieren gelernt, in dem ich Bücher durchgearbeitet habe, Programm für Programm abgetippt hatte. Es war in den Jahrzehnten vor "Download" und "Suchmaschine".
    Tippfehler für Tippfehler mühsam ausgemerzt. Und wenn das Programm dann irgendwann doch mal lief, dann natürlich mit größter Phantasie eigene Ideen eingebaut.

    Heute habe ich den Eindruck, dass niemand mehr an Grundlagenwissen interessiert ist. Es muss am ersten Abend, an dem man mit "Programmieren" (im Sinne, Code zusammenladen) begonnen hat, gleich die komplexeste Oberfläche erstellt sein, mit der man über Bluetooth, Handy irgendwelche Sachen über einen Webserver auf die Reihe kriegt.

    Jedes Ding braucht seine Zeit: Das Lernen wie das Üben, das Verstehen wie das Nachdenken, das Planen wie das Umsetzen, sich über Erfolge freuen und genießen wie auch Probleme beseitigen.

    Das Schlimmste, was man machen kann, ist sich unter Druck zu setzen. Programmieren ist eine feine Sache, fördert die Kreativität, erweitert den Horizont, löst Probleme, die man ohne Computer nicht hätte... :cool:


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (11. März 2015 um 02:03)

  • Hallo Andreas.


    Heute habe ich den Eindruck, dass niemand mehr an Grundlagenwissen interessiert ist. Es muss am ersten Abend, an dem man mit "Programmieren" (im Sinne, Code zusammenladen) begonnen hat, gleich die komplexeste Oberfläche erstellt sein, mit der man über Bluetooth, Handy irgendwelche Sachen über einen Webserver auf die Reihe kriegt.

    Jedes Ding braucht seine Zeit: Das Lernen wie das Üben, das Verstehen wie das Nachdenken, das Planen wie das Umsetzen, sich über Erfolge freuen und genießen wie auch Probleme beseitigen.

    Das Schlimmste, was man machen kann, ist sich unter Druck zu setzen. Programmieren ist eine feine Sache, fördert die Kreativität, erweitert den Horizont, löst Probleme, die man ohne Computer nicht hätte... :cool:

    one of the best-looking statements i've read in the last recent years. :thumbs1:
    Exact meine Meinung.

    gruß root

    Einmal editiert, zuletzt von root (11. März 2015 um 02:32)

    • Offizieller Beitrag

    Ich bin mir zu 99,99% sicher das es am verwendeten Editor liegt.

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Einmal editiert, zuletzt von dbv (11. März 2015 um 08:46)

  • Ok, habe den Fehler entdeckt.

    Wenn ich den Code aus Post 9 mit

    Code
    ./code.c

    ausführe, kommt die Fehlermeldung

    Code
    ./code.c: 4: ./code.c: Syntax error: "(" unexpected


    Führe ich den Code mit

    Code
    ./code

    aus, gibt es keine Fehlermeldungen:).
    Allerdings passiert von alleine erstmal nichts. Nur wenn man Kabel abklemmt und wieder dran macht kommt da die entsprechende Meldung.
    Angeschlossen ist alles richtig. Das Modul, welches an den RaspberryPi angeschlossen ist, schickt auf jedenfall ein Signal ( mit dem Oszilloskop nachgewiesen). Liegt das dann doch am kompilieren oder fehlt irgendeine Kleinigkeit im Code, dass michts passiert?

    Einmal editiert, zuletzt von Cool_pi (11. März 2015 um 10:02)

  • Hallo Cool_Pi,

    ein Compiler erzeugt aus einem Quellcode (z.B. meincode.c) direkt oder oder über mehrere Stufen (z.B. Linker) ein ausführbares Programm (z.B. meincode).

    Einen Quellcode kannst Du nur ausführen, wenn es sich um eine Skriptsprache handelt UND in der ersten Quellcode-Zeile ein sog. SHEBANG definiert ist.

    Die Programmiersprache C ist keine Skriptsprache. Deswegen ist der Versuch, den Quellcode mit

    Code
    meincode.c


    oder

    Code
    ./meincode.c


    oder

    Code
    sudo ./meincode.c

    ein zwar interessanter Ansatz - aber vollkommen sinnlos.

    Insbesondere nachdem Du den Quellcode durch Aufruf eines Compilers offensichtlich zu "mehr" als den Quellcode befördert hast, solltest Du eigentlich stutzig geworden sein, nach Compilierung nochmals den Quellcode direkt aufrufen zu wollen.

    Solange wir Deinen kompletten Quellcode nicht gesehen haben, sondern es nur mit kurzfristig ausgewechselten - wild aus dem Zusammenhang herauskopierten - Codezeilen zu tun haben, kann man nur schlecht irgendwelche Aussagen treffen.

    Besorge Dir bitte ein gutes Tutorial / Lehrbuch und arbeite dies inkl. von "Hello World" an schrittweise durch. Und beginne erst mit dem nächsten Kapitel, wenn Du mit dem durchgearbeiteten restlos alles verstanden hast. Programmieren-lernen baut aufeinander auf. Wenn Du Grundlage 1 ignorierst, kommt Dir Grundlage 2 mysteriös vor. Wenn Du Grundlagen 3 bis 10 überspringst, dann hast Du keine Chance ab Grundlage 11 überhaupt noch irgendetwas nachvollziehen zu können.

    Was macht Dich eigentlich so sicher, dass Du den richtigen GPIO-Pin abfragst? Hast Du das Signal an dem Pin gemessen, der im Programm abgefragt wird? Und ist das Signal auch so beschaffen, dass es den überwachten Pegelwechsel ermöglichen kann?

    Im Zweifelsfall würde ich an Deiner Stelle auch mal die Schaltung posten...


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (11. März 2015 um 11:46)

  • Andreas, danke für den Tipp.

    Hat aber bisher immer funktioniert mit .c dahinter. Aber werde das ab jetzt nicht mehr machen.

    Hier nochmal der Code

    Also der Pegel des Pins ändert sich nicht, ob ein Signal kommt oder nicht ( Spannung ist durchgehend 0 Volt). Nur wenn ich den GRD abklemme, dann wird der Pegel durchgehend 1 und Programm schreibt: rising to high. Da werde ich weiter gucken müssen, was da nicht stimmt. Wichtig ist, dass das Programm prizipiell funktioniert

    Einmal editiert, zuletzt von Cool_pi (11. März 2015 um 11:34)

  • Hallo Cool_Pi,

    die einzigen Linux-Kommandos, die "mit .c dahinter" funktionieren, sind z.B. folgende:

    rm würde ich jetzt allerdings nicht unbedingt ausprobieren.

    Wie der Name EDGE_RISING andeutet, wird hier auf eine aufsteigende Flanke (LOW ==> HIGH) geprüft. Wenn Du sagst, dass da 0 V anliegen, dann funktioniert das Programm ja richtig, wenn nichts weiter passiert.

    Schau Dir vielleicht noch mal die Syntax von wiringPiISR an. Gordon hatte mit dem letzten Parameter eigentlich etwas anderes beabsichtigt.

    Also liegt's an der Schaltung...

    In einer früheren Botschaft habe ich Dich gefragt, was Dich sicher macht, dass der Pin, den Du vermutest, auch abgefragt wird. Stichwort

    Code
    pin numbering scheme
    Raspberry Pi Pin Bezeichnungsschema

    Es gibt noch zwei andere Setup-Befehle, die für Deinen Zweck besser geeignet sein dürften.


    Kennst Du diese Seite schon? https://projects.drogon.net/raspberry-pi/wiringpi/functions/

    Wenn Du die gelesen hast, dann fällt es Dir leicht, Aussagen zu treffen, wozu die Befehle

    Code
    wiringPiSetup();
    pinMode(7, INPUT);
    wiringPiISR (7, INT_EDGE_RISING, funktion);
    waitForInterrupt (0, -1);

    gedacht sind. Und dann wirst Du auch sagen können, wie diese aussehen müssten, damit das Programm so läuft, wie Du es beabsichtigt.

    Dann wird Dir auch auffallen, dass funktion nicht existiert... Was soll passieren, wenn das Interrrupt-Event eingetreten ist?

    Tip: Back to Hello World...


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (11. März 2015 um 12:17)

Jetzt mitmachen!

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