Daten über ein Pin empfangen

  • Wie ist das eigentlich wenn ich binäre Daten an das Raspberry Pi schicken will.Soweit ich weiß, muss ich dazu in einer Schleife, ständig den Wert eines Empfänger Pins kontrollieren. Oder kann man richtige Interrupts nutzen, wo das GPIO Programm vom OS informiert wird?


    Damit es keine volle Auslastung der CPU gibt, baut man in die Schleife eine kleine Pause, von wenigen Mikrosekunden, ein.


    Ist das so richtig und auch sicher?
    Ich versuche mir das vorzustellen, was wenn die Schleife eine Zustands Änderung der Pin nicht erkennt, weil die Sender Hardware den Wert (also den Stromfluss) zu schnell verändert hat?
    Die Pause in der Schleife könnte ja theoretisch so lange dauern, das einige Wertänderungen der Pin gar nicht bemerkt werden.


    Generell erscheint mir diese Methode mit einer Schleife, per Thread, irgendwie nicht als ideal. Ist das so üblich? Was sollte ich beachten?

  • Vorweg der Raspberry Pi ist für so etwas nur bedingt geneignet. Normalerweise macht man das mit einem µC der hat u.a. Timer und Interrupts um die Signale richtig zu erkennen.


    Beim Raspberry Pi bleibt die nur eine Variante mit dem Thread übrig. WiringPi hat auch eine Interrupt Erkennung die kannst du für dein Vorhaben wohl verwenden. Damit es sicher ist solltest du allerdings die Signale lang genug schalten.

  • Danke, ich werde mir mal WiringPi näher anschauen. Ansonsten hätte ich da eine Idee: Ich verbinde Raspberry Pi über ein weiteren Pin (Output) mit dem Mikrocontroller und lasse den Raspberry Pi jede Signaländerung bestätigen, so das der Mikrocontroller, mit dem Senden weiterer Signale, immer lange genug wartet und sogar überprüft ob Raspberry Pi den richtigen Wert gemessen hat.


    Aber: Wie kann man denn einen Wert wie 111010100 messen. Wie soll ich mit der Schleife messen wie viele Einsen eine Signaldauer bedeutet bzw. wie viele Nullen ein fehlender Stromfluss?
    Ich ging davon aus das ich 1 und 0 durch Strom an und aus erzeuge, und so die binären Daten bilde.


    Ja ich bin noch recht ahnungslos mit solchen Grundlagen, versuche noch zu lernen :D

  • In dem Fall brauchst du noch ein Takt-Signal vom Microcontroller in den PI.
    Damit hättest du dann 3 Signal-Leitungen:
    -das eigendliche Daten-Signal vom yC zum PI
    -das Takt-Signal vom yC zum PI
    -das Bestätigungs-Signal vom PI zum yC


    Das ganze könnte dann so ablaufen:
    1. der yC gibt das Datenbit auf die Daten-Leitung
    2. der yC setzt die Taktleitung auf 1
    3. der PI erkennt die 1 auf der Taktleitung und liest das Datenbit ein
    4. der PI quittiert das eingelesene Bit, indem er die Bestätigungsleitung auf 1 setzt.
    5. der yC erkennt die 1 auf der Bestätigungsleitung und setzt die Taktleitung auf 0
    6. der PI erkennt die 0 auf der Taktleitung und quittiert das, indem er die Bestätigungsleitung ebenfalls auf 0 setzt.
    7. der yC erkennt die 0 auf der Bestätingunsleitung und beginnt mit dem nächsten Bit.


    PS:
    Eine Alternative wäre auch die Benutzung der dafür vorgesehenen Schnittstellen RS232 oder I2C.
    Der PI kann beide, und viele Microcontroller können wenigstens eine davon.

    Edited once, last by Ordoban ().

  • Rate ich dir von dem Projekt gleich ab, du wirst dich nur ärgern. Theoretisch wäre das möglich wenns nicht das OS wäre. Da es kein RTOS ist, treten Unterbrechungen auf die als Bit bzw. kein Bit interpretiert werden können, somit wäre die Übertragung fehlerhaft.

  • Eigentlich willst Du das "Rad neu erfinden". ;)


    i2c, SPI oder auch 1wire sind Lösungsmöglichkeiten, die vom RPi bzw. dem Linux Kernel unterstützt werden. Wie das im Detail funktioniert (Clock-, Datensignal) kannst Du im Netz finden.


    Gruß, mmi


  • Eigentlich willst Du das "Rad neu erfinden". ;)


    i2c, SPI oder auch 1wire sind Lösungsmöglichkeiten, die vom RPi bzw. dem Linux Kernel unterstützt werden. Wie das im Detail funktioniert (Clock-, Datensignal) kannst Du im Netz finden.


    Gruß, mmi


    das geht an den TO (nicht das der zitierte das falsch versteht)


    zum lernen würde ich es mit der RxD von der seriellen probieren


    RxD 1 Draht Input, definierte Baudraten welche dein Timing Problem lösen


    es ginge auch I2C mit PCF8574(a)
    dort hast du 8 Ports, an einem Bit kann dein Signal high/low legen, am anderen Bit einen Takt der die Gültigkeit vorgibt, wie SDA und SCL nur eben in deinen Clockgrenzen


    1wire da kenne ich nur den DS18B20 aber auch der kann nachgebaut werden, das wäre dann dein 1-Draht


    ich weiss ja noch nicht was du senden willst, welche Bitrate, welches Protokoll

    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)

    Edited once, last by jar ().