- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 96

Thema: C++ fstream GPIO Trigger/Interrupt

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.04.2005
    Ort
    Bad Aibling
    Beiträge
    212
    Jetzt läuft es mit inotify. Es macht auch einen Unterschied ob man rising, falling oder both benutzt. Nur Merkwürdig ist das falling und rising invertiert erscheinen. Kann das an den internen Pullup oder Pulldown Widerständen liegen? Ein aktiver Pullup würde doch wie ein Inverter wirken. Nur weiß ich nicht wie man die konfigurieren kann ...

    [Edit]
    Ich habe jetzt gelesen das die internen Pull Up/Down nach dem booten ausgeschaltet sind. Dann lag es daran das der Port bei mir dann offen war. So kleine Mosfet wie in den Prozessoren wird das bisschen Energie das an einer offenen Leitung einstrahlt schon reichen das er einschaltet. Mit einem externen Pull Down Widerstand funktioniert es dann einwandfrei. Wenn man immer einen gesicherten Zustand haben will wird man so externe Widerstände nehmen müssen. Weil der interne beim booten oder Reset ja nicht vorhanden ist und erst beim Start der Steuerungssoftware konfiguriert wird.

    Nach einigen Tests mit der inotify Lösung sieht man schon das das nicht die schnellste ist. Wenn man in einer Endlos Schleife einen Port ein/ausschaltet und den anderen als Eingang für der Trigger benutzt. Verliert er sehr viele Impulse die der Trigger nicht mitbekommt. Bisher habe ich als kleinsten Wert mit einer Verzögerung von einer Millisekunde getestet. Damit funktioniert es problemlos. Ob noch kleinere Werte möglich sind habe ich bisher nicht getestet. Für die Lösung von Mechanischen Steuerungsaufgaben sollte es aber ausreichend sein.
    Code:
      for (;;)
      {
        std::cout << "Port 2: 1" << std::endl;
        ioPort2 << 1;
        milliSleep (1); // benutzt intern nanosleep
    
        std::cout << "Port 2: 0" << std::endl;
        ioPort2 << 0;
      }
    Vermutlich wäre die Lösung mit epoll schneller und auch recht gut Hardware unabhängig. Bei epoll spart man sich ja einmal die Zugriffe über das Filesystem die schon sehr viel Zeit kosten. Alles Memory Mapped ist zwar schnell aber leider dann auch 100% Hardware abhängig.
    [/Edit]

    [Edit]
    Falls es jemanden interessiert habe ich den aktuellen Stand in mein git Repo kopiert. Das ist noch nicht fertig aber man kann sehen wie es geht. Fehlerhandling usw. muss man noch anständig machen. https://git.hts-software.de/index.ht.../Gpio/Gpio.hpp
    [/Edit]
    Geändert von alexander_ro (24.01.2018 um 09:59 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    31.01.2004
    Ort
    36399
    Alter
    51
    Beiträge
    1.562
    Alexander bist du jetzt mit deinem Code zufrieden ?
    Ich möchte einen Drehgeber damit abfragen die Zeiten die du gemessen hast sehen irgend wie passen aus.
    P: Meine Tochter (06.11.07) und https://www.carnine.de
    M: Träumen hat nix mit Dummheit zu tun es ist die Möglichkeit neues zu erdenken

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.04.2005
    Ort
    Bad Aibling
    Beiträge
    212
    Ja der Code funktioniert auf einem Raspi mit Gentoo Linux sollte aber mit allen anderen halbwegs aktuellen Distributionen auch funktionieren. Wenn Du was findest das nicht geht wäre es nett wenn Du hier schreibst was es ist damit ich es reparieren kann. Du musst bei Deiner Anwendung halt aufpassen das der Drehgeber die Impulse nicht schneller generiert als die vom Controller verarbeitet werden können.

    Hier der neue Link weil ich für die git Web Zugriffe ein anderes Programm benutze geht der oben nicht mehr. Die Domain ist aber die gleiche geblieben.
    https://git.hts-software.de/cgit.cgi.../Gpio/Gpio.hpp
    Geändert von alexander_ro (31.10.2018 um 09:24 Uhr)

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    31.01.2004
    Ort
    36399
    Alter
    51
    Beiträge
    1.562
    Ich habe ein Aktuelles Debian drauf da sollte der Kernel passen denke ich. Ja werde schreiben wenn ich was finde.

    Das der Link jetzt anders ist habe ich schon gemerkt habe aber den Code schon gefunden gehabt danke für den neuen Link.

    Bei dem wort Drehgeber habe ich wohl mich falsch Ausgedrückt bzw es ist halt so ein Poti was schalte da dreht ein Mensch dran nicht ein Motor deshalb hoffe ich das es klappt.
    Lautstärke einstellen ist die Funktion.
    P: Meine Tochter (06.11.07) und https://www.carnine.de
    M: Träumen hat nix mit Dummheit zu tun es ist die Möglichkeit neues zu erdenken

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.04.2005
    Ort
    Bad Aibling
    Beiträge
    212
    Ist ja auch ein Drehgeber wenn den Menschen bedienen gibt das sicher keine Probleme.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    31.01.2004
    Ort
    36399
    Alter
    51
    Beiträge
    1.562
    hast du das Thema PWM schon mal betrachtet ? Wenn ich jetzt mit deinem Code auf externe Libs verzichte brauche ich noch eine Lösung für I²C und PWM. Das PWM brauche ich für den Lüfter.

    http://www.raspberry-projects.com/pi...-i2c-interface damit sollte das mit dem MCP23017 klappen der ist ja vom Protokoll her nicht wirklich schwer.

    Aber bei PWM habe ich noch so gar keine Idee
    P: Meine Tochter (06.11.07) und https://www.carnine.de
    M: Träumen hat nix mit Dummheit zu tun es ist die Möglichkeit neues zu erdenken

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.04.2005
    Ort
    Bad Aibling
    Beiträge
    212
    I2C habe ich bisher noch nichts gemacht. Unter Linux ist das ja auch nur ein Devicefile das man mit open öffnet und dann die Daten schreibt. Für den SPI bei einem Gnublin habe ich das mal gemacht.

    Code:
    // Copyright 2013 HTS-Software Unternehmensberatung
    //                      Alexander Schucha
    //
    // This file is part of Athena-Api.
    //
    // Athena-Api is free software: you can redistribute it and/or modify
    // it under the terms of the GNU Affero General Public License as published by
    // the Free Software Foundation, either version 3 of the License, or
    // (at your option) any later version.
    //
    // Athena-Api is distributed in the hope that it will be useful,
    // but WITHOUT ANY WARRANTY; without even the implied warranty of
    // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    // GNU Affero General Public License for more details.
    //
    // You should have received a copy of the GNU Affero General Public License
    // along with Athena-Api.  If not, see <http://www.gnu.org/licenses/>.
    
    #include <stdio.h>
    #include <unistd.h>
    #include <fcntl.h>
    
    #include <atomic>
    #include <chrono>
    #include <thread>
    #include <time.h>
    #include <iostream>
    #include <fstream>
    
    #include <sys/ioctl.h>
    #include <linux/types.h>
    #include <linux/spi/spidev.h>
    
    class Spi
    {
    public:
      Spi (const std::string&  strChipSelect,
           const std::string&  strDevFile,
           const unsigned int  uiBandbreite = 100000,
           const unsigned char ucBitAnzahl  = 8,
           int                 iDebug = 0)            : strIntChipSelect (strChipSelect),
                                                        strIntDevFile    (strDevFile),
                                                        iIntDebug        (iDebug)
      {
      // Debug Messages
        if (iIntDebug == 1)
        {
          std::cout << "Start Spi Konstruktor ... " << std::endl;
          std::cout << "strIntChipSelect:    "      << strIntChipSelect << std::endl;
          std::cout << "strIntDevFile: "            << strIntDevFile    << std::endl;
        }
          
        iIntDevFile = open(strDevFile.c_str(), O_RDWR);
    
    
        if (iIntDevFile < 0)
          std::cout << "SPI Device File konnte nicht geöffnent werden (SPI-Kernel Modul geladen? root?)." << std::endl;
    
      // SPI Bandbreite einstellen
        if (ioctl (iIntDevFile, SPI_IOC_WR_MAX_SPEED_HZ, &uiBandbreite))
          std::cout << "SPI Bandbreite konnte nicht eingestellt werden" << std::endl;
    
      // SPI Anzahl Bits einstellen
        if (ioctl (iIntDevFile, SPI_IOC_WR_BITS_PER_WORD, &ucBitAnzahl))
          std::cout << "SPI Anzahl Bits konnte nicht eingestellt werden" << std::endl;
      }
    
      int operator<< (std::string strDaten)
      {
        if (iIntDebug == 1)
          std::cout << "Daten länge: " << strDaten.size () << std::endl;
    
        int status;
        struct spi_ioc_transfer xfer;
    
        xfer.tx_buf = (unsigned long) strDaten.c_str ();
        xfer.len = strDaten.size ();
        xfer.rx_buf = 0;
        xfer.delay_usecs = 0;
        xfer.speed_hz = 0;
        xfer.bits_per_word = 0;
    
        status = ioctl(iIntDevFile, SPI_IOC_MESSAGE(1), &xfer);
    
        if ((status < 0) && (iIntDebug == 1))
          std::cout << "SPI Daten senden fehlgeschlagen." << std::endl;
      }
    
    
      int operator<< (__u8* cDaten)
      {
        if (iIntDebug == 1)
          std::cout << "Daten länge: " << sizeof (__u8) << std::endl;
    
        int status;
        struct spi_ioc_transfer xfer;
    
        xfer.tx_buf = (unsigned long) cDaten;
        xfer.len = sizeof (__u8);
        xfer.rx_buf = 0;
        xfer.delay_usecs = 0;
        xfer.speed_hz = 0;
        xfer.bits_per_word = 0;
    
        status = ioctl(iIntDevFile, SPI_IOC_MESSAGE(1), &xfer);
    
        if ((status < 0) && (iIntDebug == 1))
          std::cout << "SPI Daten senden fehlgeschlagen." << std::endl;
      }
    
      ~Spi (void)
      {
        if (iIntDebug == 1)
          std::cout << "Start Spi Destructor ... " << std::endl;
    
        close(iIntDevFile);
      }
    
    private:
      std::string strIntChipSelect;
      std::string strIntDevFile;
    
      int iIntDevFile;
    
      int iIntDebug;
    };
    Das sollte relativ leicht zum umbauen sein ist ja beides eine serielle Verbindung. Geräte Datei öffnen und Daten senden/empfangen müsste fast gleich sein nur die Daten für die Abwicklung des Protokolls sind unterschiedlich. Ich kann so was schon schreiben weiß aber noch nicht was ich zum Testen benutzen könnte. Vielleicht habe ich noch ein Arduino Teil herumliegen.

    PWM habe ich auch noch nicht gemacht würde es aber auch schon brauchen. Kommt halt darauf an ob Du das in Software oder Hardware machen willst. Unter Linux kann man Software PWM recht Rechenzeit sparsam bauen weil der Kernel in der Wartezeit was anderes tun kann. Hardware PWM geht auch wieder über die Devicefiles.

    so etwa:
    https://jumpnowtek.com/rpi/Using-the...WM-timers.html

Ähnliche Themen

  1. Benötige Hilfe zu AT32U3C und GPIO
    Von xrzr im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 10.11.2015, 18:54
  2. Respberry Pi GPIO mit C++ und QT
    Von Basti1204 im Forum Raspberry Pi
    Antworten: 0
    Letzter Beitrag: 05.03.2013, 23:01
  3. [ERLEDIGT] Raspberry Pi GPIO
    Von Kampi im Forum Raspberry Pi
    Antworten: 4
    Letzter Beitrag: 04.11.2012, 22:45
  4. GPIO-Register Ansprechen
    Von kmrish im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 7
    Letzter Beitrag: 14.07.2011, 09:45
  5. schmitt-trigger an interrupt
    Von Bluesmash im Forum Sensoren / Sensorik
    Antworten: 2
    Letzter Beitrag: 19.06.2005, 22:46

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress