Drucksensorprogrammierung C++



  • Ein herzliches Hallo an alle,
    ich habe schon länger ein Problem und hoffe ihr könnt mir dabei helfen. Ich bin Schüler einer Fachschule für Elektrotechnik und mir wurde unter anderem eine für euch wahrscheinlich ziemlich einfache Aufgabe zuteil, mit der ich wirklich nicht besonders gut klar komme. Ich bin kein Informatiker, habe bis jetzt in der Schule nur ein Jahr mit Java gearbeitet und jetzt mehrere Aufgaben bekommen. Ein Teil davon beinhaltet, ein Programm für einen Drucksensor zu schreiben, welcher den Druck eines Körpers unter Wasser messen muss und vorerst "nur" möglichst umgerechnete "handliche" Werte ausgibt, welche andere (ebenfalls im Projekt involvierte Personen) dann benutzen können, um diese in Diagramme umzusetzen oder Motoren anzusteuern.
    Ich muss das Programm in C++ schreiben, dazu darf ich nur Codeblocks verwenden und benutze einen Arduino Atmega 2560 Prozessor.
    Der Sensor misst einen Bereich von 10-1.300mbar.
    Ich benötige einfach nur etwas Hilfe, eine Art Leitfaden, weil ich einfach nicht weiss, wie ich da anfangen soll. Habe bereits dutzende Videos und Tutorials (Stefan Wintgen) und ähnliches angesehen, auch schon einige kleine Programme erfolgreich umgesetzt aber steh einfach total auf der Leitung, was mir sehr peinlich ist. Nur ist auch diese Kombi (Arduinoprozessor mit Codeblocks) eher selten im Internet anzutreffen.
    (Muss auch AVR Projekt sein(kein Arduinoprojekt))
    Natürlich wird es hier um einen Spannungswert gehen, der sich eben je nach Druckveränderung ebenfalls verändert, soviel ist mir klar.
    Ich würde den Wert so alle 0,2 Sekunden abfragen.
    Wie soll ich da anfangen?
    Soll ich mit TWI arbeiten? Bringen mir da Interrupts etwas? Und vorallem, wie kann ich diese Werte abfragen, also woher weiss ich, dass diese Werte auch wirklich ausgegeben werden? (geht da nur messen, oder gibts da auch eine Ausgabe am PC) In Java kann man ja alles simulieren...

    Ich danke euch schonmal so sehr im Voraus, vergebt mir meine Unwissenheit. 😞

    [code="cpp"]
    LG
    Jskr



  • Hallo,

    wie wirst du den Sensor an die Platine anschließen ? Über die GPIO Pins? und was für ein Betriebssystem wirst du verwenden?

    Falls du die Wahl hast beim OS, würde ich ein UNIX-artiges OS verwenden, dort kann man relativ einfach die Ausrichtung der Pins(In/Out) bestimmen und auch auslesen, falls der Sensor über die GPIO Pins angeschlossen wird.

    Ich würde das Projekt eher in C schreiben. Aufjedenfall sehr Projekt hast du da.

    VG



  • CodeBlocks ist nur eine IDE und kein Compiler, oftmals liegt darunter gcc oder Derivate.
    Die Aufgabenstellung "man darf nur CodeBlocks benutzen" ist Schwachsinn.
    Außerdem benötigst du offensichtlich ein C Programm und kein C++.
    (Das ist ein Unterschied).
    Suche also nach "C GCC AVR" (ohne CodeBlocks), da sollte sich was finden, und als "IDE" kannst du dann deinen Lieblingseditor benutzen, die gcc-Kommandos zum Compilieren/Linken hast du schnell drauf.



  • Erstmal danke für die rasche Antwort!
    Ganz ehrlich gesagt wollte ich ursprünglich alles mit SPI machen also MISO, MOSI, SCK... usw und da ja noch bestimmte Aktoren im Spiel sind, welche diese Werte umsetzten/verarbeiten müssen, könnte dieser Prozessor dann eben jene Aktoren als Slaves ansteuern. Dem Drucksensor würde der Prozessor dann quasi lediglich in bestimmten Abständen den aktuellen Wert entnehmen, um ihn dann weitergeben zu können! Weiss nicht ob das so funktionieren könnte.
    PS:
    Leider muss ich in C++ programmieren... 😕



  • Ok, welches Betriebssystem läuft auf der Platine ?. Wenn du SPI benutzen möchtest, muss der Baustein(Drucksensor) auch SPI-fähig sein. Weißt du den, ob die Platine hardware-technisch SPI unterstützt?. Das gleiche gilt auch für I2C.
    Im schlimmstenfall musst du SPI, i2c software-technisch simulieren, was nicht mehr im Rahmen eines Schulprojekts ist.

    Falls die Platine SPI unterstützt und auch der Drucksensor, existieren universelle Treiber, mit den du dann die Slaves ansteuern kannst. Wenn der Drucksensor wirklich SPI fähig oder i2c fähig ist, musst du höhstwahrscheinlich auch keine Spannung messen, sondern die Drucksensorwerte in bar sind dann schon in den Paketen von SPI bzw i2c enthalten.

    Wie oben erwähnt gibt es für SPI universelle Treiber und wenn dein OS unix-artig ist, wird im dev-Filesystem für den Treiber eine Gerätedatei enthalten sein. Auf diesen greifst du dann mit den Operationen für Dateien(open,read,write,close) drauf zu. Insbesondere der Befehl ioctl ist hier nützlich. SPI und i2c sind Master-Slave Systeme, daher kann der Slave sich auch nicht bemerkbar machen durch Interrupts, sondern der Master muss pollen also immer nachfragen.

    Falls dein Sensor wirklich nur eine Spannung ausgibt auf einen seiner Ausgangspins, musst du mit einem anderen Baustein seine Spannung messen und diese an die GPIO Pins weitergeben. Ich vermute jedoch, dass dieser Drucksensor mehrere Ausgänge hat und der Wert in bar binär übergeben wird.

    P.S Das ist kein einfaches Schulprojekt.

    VG



  • ich Habe einen Arduino Atmega 2560 zur Verfügung Microcontroller ist eben ein Atmel AVR , dieser Prozessor steuert ja lediglich die I/O Pins. Dient nicht als Betriebssystem wie z.b Raspberry.
    Du hast recht hab auch gerade erfahren das es doch I2C sein muss... 😕 wird auch unterstützt
    Der Drucksensor hat 8 Pins:
    1 SCLK Serial data clock
    2 GND
    3 CSB Chip Select (active low)
    4 NC
    5 VDD Positive supply voltage
    6 PS Communication protocol select
    7 SDI/SDA Serial data input
    8 SDO Serial data output

    LG
    Jskr



  • Ok, dann ist es ja doch nicht so schwer. Für SPI und i2c existieren ja fertige Bibliotheken um mit dem Baustein zu kommunizieren.
    Die einzigste kleine Hürde ist, Daten sozusenden, dass der Baustein es versteht.
    Da musst du in die Spezifikation des Sensors reingugen.

    VG



  • Wenn es so einfach wäre... wir sollen die Bibliotheken wenn dann selber schreiben.
    Habe aber gerade etwas gefunden das ähnlich wie mein Sensor programmiert wurde. Ich komm mir jetzt irgendwie dämlich vor, kapier nämlich nicht was er da am anfang definiert...

    #define F_CPU 4000000UL
    #define SCL_CLOCK 100000L
    #define ADDR_W 0xEE
    #define ADDR_R 0xEF
    #define CMD_RESET 0x1E
    #define CMD_ADC_READ 0x00
    #define CMD_ADC_CONV 0x40
    #define CMD_ADC_D1 0x00
    #define CMD_ADC_D2 0x10
    #define CMD_ADC_256 0x00
    #define CMD_ADC_512 0x02
    #define CMD_ADC_1024 0x04
    #define CMD_ADC_2048 0x06
    #define CMD_ADC_4096 0x08
    #define CMD_PROM_RD 0xA0
    Die ersten zwei erkenn ich. Das erste ist die CPU Geschwindigkeit (4 MHz wenn ich mich nicht irre) und das zweite ist wahrscheinlich die I2C Clockfrequenz von 1 Mhz. Aber was ist der Rest? Sind ja alles Bitwerte aber CMD_ADC was heisst das?
    LG
    Jskr



  • Ich vermute mal:
    CMD -> Command
    ADC -> analog digital converter



  • Jskr schrieb:

    Wie soll ich da anfangen?

    timer_interrupt_ausgelöst=false;
    
    int main()
    {
    //analog-digital-wandler initialisieren
    //timer mit interrupts etc. initialisieren
    
    while(1)
    {
    if(timer_interrupt_ausgelöst)
    {
    //Wert von AD-Wandler einlesen
    //Wert ausgeben
    timer_interrupt_ausgelöst=false;
    }
    }
    
    }
    
    void isr()
    {
    //interruptflags löschen
    //timer zurücksetzen
    timer_interrupt_ausgelöst=true;
    
    }
    

    mag sein, dass die tatsächliche programmierung anders aussieht, aber ich kenn mich mit dem arduino speziell nicht aus. grundsätzlich läuft das aber so.
    evtl. mal ein buch dazu kaufen?



  • Ist das nicht etwas kontraproduktiv, ein interruptflag zu pollen?



  • ist es bestimmt. aber wenn die kiste sowieso nur lesen und schreiben soll....
    wobei es eine endlosschleife mit delay bestimmt auch tut.


Anmelden zum Antworten