Posts by Prittzl

    ARTYUSS


    double time_spent(0);


    muss meines Erachtens sein:


    double time_spent = 0.0L;


    Du willst doch eine Variable erstellen und nicht den Protytyp einer Funktion.

    Genauso die Deklaration von begin und end


    Im Linux-Konsolenfenster sieht man den Text :"so schnell ist der Wind:"

    Der Text taucht aber in Deiner Routine gar nicht auf ?


    Es wäre hilfreich, den Code zu zeigen, welcher den Text im Linux-Konsolenfenster zur Anzeige bringt.


    printf(" %2.4f sec \n", time_spent);


    Du weist den Compiler an, eine Zahl vom Typ "float" mit insgesamt 2 Stellen anzuzeigen, möchtest aber 4 Stellen nach dem Komma haben ?


    Den Dezimalpunkt mitgezählt, ohne Vorzeichen, 2 Stellen vor dem Komma und 4 Stellen nach dem Komma müsste für eine Variable vom Typ double so aussehen:


    printf (" %7.4lf sec \n", time_spent);


    Zudem könntest Du die Variablen counter, begin und end als "unsigned long" deklarieren.


    Um den Fehler genauer zu beurteilen, könntest Du einmal nachsehen, was angezeigt wird wenn Du folgende Zeile einfügst:


    printf ("Byte-Anzahl = %d\n", sizeof (clock_t));


    Gruß

    Prittzl

    hyle

    Genau so macht man das, wenn es einfach und schnell gehen soll.

    Schalter abfragen, Strings auswerten, usw..


    Selbstverständlich gibt es auch pipes, forks, callbacks, Events, wiringpi-schein-Interrupts mit einem Riesenaufwand im Hintergrund.

    Wunderbar für den Programmierer, alles auf das System schieben, über nichts nachdenken, und grottenlangsame Programme schreiben. Und wenn es dann klemmt, im Internet was anderes suchen.


    Das kann man natürlich alles machen, wenn man nicht Echtzeit programmieren muss und wenn es nicht so schlimm ist, wenn das Programm einmal stehen bleibt.

    xxdarkgamerxx


    Mit den unsäglichen Delays und Pausen ist das so eine Sache.

    Meines Erachtens ist es nicht einzusehen, warum die Hauptschleife angehalten werden soll, wenn sie während der Wartezeit auch andere Dinge erledigen kann.

    Grundsätzlich können die Pausen und Delays umgangen werden.

    Dazu wird ein Zeitnormal benötigt:

    Ich benutze dafür die Register CLO und CHI vom System Timer des BCM2835 im Raspberry.

    Unter Linux gibt es die Funktion gettimeoftoday (), die ist aber nicht ganz so schnell wie der System- Timer-Zugriff. Letztlich liefern beide einen Wert, welcher in jeder µ-Sekunde um 1 erhöht wird.


    Wenn nun etwas um 2 Millisekunden verzögert werden soll, dann liest man z.B. den aktuellen Inhalt des System-Timers in eine long long Variable und addiert 2000. Mit einer IF-Abfrage prüft man dann, ob der aktuelle Inhalt des System-Timers größer ist, als der Inhalt der long long Variablen. Ist die Bedingung erfüllt, wird das ausgeführt, was verzögert werden sollte, vorher eben nicht.


    In C kann das sekündliche Aufblitzen einer LED wie folgt aussehen (in Python eben ähnlich):


    Hallo xxdarkgamerxx


    Falls kein Debugger zur Verfügung steht, kann man den Fehler finden, indem man an unterschiedlichen Stellen des Programms unterschiedliche Zahlen- und/oder Buchstabenkombinationen ausgibt. Anhand der Ausgaben, kann man den Programmablauf überprüfen und feststellen, wo der Pogrammablauf klemmt.


    Ein Programm in eine Pause zu schicken oder in einem Delay stecken zu lassen, führt erfahrungsgemäß oft zu Problemen.


    Gruß Prittzl

    Ein PIR muss nicht unbedingt ein Bewegungsmelder sein. Das hängt von der Auswertelogik ab.

    Man unterscheidet zwischen Bewegungs- und Präsenzmeldern.


    Bewegungsmelder schalten bei Änderung, Präsenzmelder schalten solange jemand im Raum ist.

    Falls jemand an einem Schreibtisch sitzt und sich wenig bewegt, schaltet ein Bewegungsmelder u.U. ab, ein Präsenzmelder nicht.


    Für den Raspberry bietet sich der HC-SR501 an. Der arbeitet mit 3,3V Versorgungsspannung, und besitzt einen Jumper, mit dem er wahlweise als Bewegungsmelder oder Präsenzmelder betrieben werden kann.


    Wegen eines möglichen toten Winkels kann man mehrere Senoren einbauen.


    Gruß Prittzl

    Hallo Marcel2


    Das kann man so machen:


    #define MAX_LENGTH 1000

    #include <stdio.h>

    #include <string.h>


    char EingabeZeile[MAX_LENGTH+1];

    FILE* Datei;

    .

    .

    Datei = fopen (DateiName.txt, "rb");

    if (Datei != NULL) {

    while (fgets (EingabeZeile, MAX_LENGTH, Datei) {

    .

    .

    .

    .

    .

    }

    fclose (Datei);

    }












    }







    }

    Hallo maximilian99


    wenn der Sprung in der Mitte des Messbereiches liegt, kann der Fehler durch folgenden Umstand verursacht werden:


    Der HX711 liefert einen 24-Bit-Messwert. Wenn der in einen 4-Byte-Integer (long) eingelesen wird, liefert der HX711

    für den Wert 1 das Bitmuster 0x00000001. Für den Wert -1 gibt der HX711 das Bitmuster 0x00FFFFFF aus.


    Enthält ein (long) Integer den Wert 0x00FFFFFF wird er als 16777215 interpretiert. Beim 24-Bit-Übergang von 0 nach -1 springt dann der 32-Bit-Wert von 0 nach 16777215 (statt wie erwartet von 0 nach -1).


    Um diesem "Fehler" zu begegnen, geht man wie folgt vor:

    Man prüft das höchste Bit des 24-Bit-Musters und übertragt dessen Zustand auf auf die höheren Bits.


    Nehmen wir an, das Bitmuster des HX711 sei in die Speicherstelle (long value) eingelesen also


    long value;


    In C sieht die Anpassung dann wie folgt aus:


    value = value & 0x800000L ? value | 0xFF000000L : value;


    Dann springt auch der Messwert wie gewünscht von 0 nach -1.


    Gruß Prittzl

    Das liegt daran, das in C vor einer arithmetischen Operation die Operanden geprüft werden.

    Da gibt es eine Hierachie:


    qfloat

    long double

    double

    float

    long long

    long

    short int

    char


    Vor der Operation werden die Operanden in den Typ konvertiert, welcher in der Hierachie am höchsten steht.

    Beispiel:


    int w;

    int x;

    float y;

    double z;


    z = x * y; x wird nach float konvertiert, das Produkt nach double.


    y = w * x; Die Multiplikation wird mit zwei Integern durchgeführt, und das Produkt nach float konvertiert.

    Die Multiplikation ist schnell, aber Vorsicht vor Überläufen. Die werden nicht abgefangen.

    Beit 4-Byte Integern wird 80000 * 80000 dann zu 2105032704.


    Die Zahlen innerhalb Deiner Klammen werden als "signed int" deklariert, weil nicht anders vorgegeben.

    Durch die Klammern, hast Du den Compiler explizit angewiesen die Multiplikationen innerhalb der Klammen mit

    dem Typ "signed int" durchzuführen zu lassen.

    Bei Deinem System scheint sizeof (int) gleich 2 zu sein.

    Hallo dragon4sb,


    das Lötauge "E-" muss eine galvanische Verbindung (Widerstand) zur Masse des HX711-Moduls haben.

    Die hat der Entwickler der Platine nicht ausgeführt, weil der nicht wissen kann, welche Sorte Sensor angeschlossen wird.


    Der Widerstand (für die Verbindung "E-" nach Masse) sollte so berechnet werden, dass der Messbereich +- 80 mV bzw. +- 20 mV

    in der Mitte der Versorgungspannung liegt. Bei 3,3V bei ca. 1,6V, bei 5V Spannungsversorgung bei ca. 2,5 V.


    Gruß Prittzl

    Hallo Streifenhase




    So kann man die Umsetzung von 24V auf 3,3V ausführen.

    Dazu muss der GPIO im Pull-Down-Modus betrieben werden.

    Der Pull-Down-Widerstand des BCM2837 beträgt ca. 54 kOhm.


    Diese Schaltung verwendet man, wenn die Schaltung nicht nur auf dem Schreibtisch funktionieren soll, sondern auch mit langen Leitungen in Umgebungen mit großen elektrischen und/oder magnetischen Wechselfeldern.

    Man kann der unteren Diode noch einen Kondensator parallel schalten. Dessen Größe hängt dann von der höchsten Frequenz der zu erfassenden Schaltwechsel ab.


    Gruß

    Prittzl

    Hallo Frank94_Bi


    Du kannst die Zunge des Schalters an 3,3 V legen. Die beiden anderen Kontakte schließt Du direkt an jeweils einen Pin des GPIOs an.

    Die beiden GPIO-Pins initialisierst Du als Pull-Down.


    In Deinem Programm legst Du eine Variable "Status" an.


    Solange der erste Pin Spannung bekommt, setzt Du die Variable Status auf 1.

    Soalnge der zweite Pin Spannung bekommt, setzt Du die Variable Status auf 0.

    Solange keine Spannung an einem Pin anliegt, lässt Du den Inhalt von Status, wie er ist.


    So kannst Du den Schalter ohne Widerstände und ohne sonstiges Gedöns anschließen und absoluft prellfrei auswerten.

    Zusätzlich sorgen die Pull-Down-Widerstände (die befinden sich im BCM2837) dafür, dass keine Transienten induziert oder influenziert werden.


    Geht das so, oder benötigst Du noch einen Schaltplan ?


    Gruß


    Prittzl

    @dreamsgader


    http://xillybus.com/tutorials/device-tree-zynq-4 ist eine Library, wobei ich nicht weiß, ob es eine Version für den Raspberry gibt.


    http://www.valvers.com/open-so…tal-programming-in-c-pt4 ist bare metal programming.


    Aber trotzdem vielen Dank für Deine Bemühungen.


    @Ozymandias


    Ich habe Deine Beiträge gelesen, verstanden was Du schreibst, und halte Deine Aussagen für nicht richtig.

    Allein in Deinem letzten Beitrag stellst Du Behauptungen auf, welche mich daran zweifeln lassen, ob Du je Interrupt-Routinen geschrieben hast und deren Sinn verstehst.

    Dass z.B. zu jeder Interrupt-Service-Routine auch immer mindestens eine Routine gehört, welche die Resultate der Interrupt-Service-Routine an die Erfordernisse des Kernels mit seinem "wahnsinnigen Overhead" und "Ewigkeiten" anpasst.