Hilfe bei meinem Projekt.



  • Hallo, ich bin vollkommen neu auf dem Gebiet der C++ Sprache. Jedoch habe ich Erfahrungen mit ST bei CoDeSys (Programmierungen von SPS Steuerungen werden damit Programmiert, uvm.
    Jedenfalls habe ich mir mal eine Schaltung einfallen lassen, die jedoch nicht auf eine so große SPS soll, sondern auf ein Microchip. Ich finde kaum was dazu und wenn, dann verstehe ich da nicht, wie ich dieses Programm zu einem Ganzen bekomme.

    Hier meine Aufgabe:

    Ich habe einen Taster (S1) und 2 Lampen (H1, H2) der 3 Funktionen wieder geben soll.

    1. Funktion (Variante 1):

    Wenn S1 betätigt wird = H1 sofort an UND H2 bleibt aus.
    Wenn S1 nocheinmal betätigt wird, soll H1 aus gehen und H2 aus bleiben.

    2. Funktion (Variante 2):

    Wenn S1 15s lang betätigt wird, Soll H2 an gehen, aber H1 soll ganz normal, wie in der Variante 1 angehen (gleich nach betätigen des Tasters)
    Wenn S1 hier das 2. mal gedrückt wird, sollen beide Lampen aus gehen.

    3. Funktion

    Wäre halt jeweils das ausschalten jeder einzelnen Funktion, was halt bei jeder Funktion als 2. Wenn angegeben ist.

    ---------
    Falls da jemand diese Schaltung gern mal für den ST (Strukturieren Text) von CoDeSys sehen will, den hab ich mit 100%iger Funktion hier:

    RS (SET:= S1, RESET1:= K1, Q1=> H1;

    TON (IN:= S1, PT:= t#15s, Q=> K3);

    RS (SET:= K3, RESET1:= K1, Q1=> H2;

    CTD (CD:= S1, LOAD:= NOT S1 AND NOT H1 AND NOT H2, PV:= 2, Q=> K1);

    Wenn da was unklar ist, kann ich gern erklären.
    Würde mich sehr über eure Hilfe freuen.
    Danke schonmal 🙂



  • Hallo.

    Hier wäre überhaupt erst mal die Frage, wie Du in der C++-Welt Deine Taster-Zustände ausliest bzw. wie Du Deine Lampen ein/aus schaltest.

    Oder soll reden wir dann hier von "virtuellen" Tasten und Lampen, eventuell von einer graphischen Benutzeroberfläche (GUI) ???



  • Also da ich das Programm auf einen Microchip laden möchte und das ganze auf eine Platine bringen möchte, sind die Schalter und Lampen Real, sprich das man die Eingänge des Mikrochips ansteuern muss.

    der Taster soll ein Schließer sein, also logischer weise, soll er erst ein Signal geben, wenn man ihn drückt.



  • xXScOrPiONXx schrieb:

    Also da ich das Programm auf einen Microchip laden möchte und das ganze auf eine Platine bringen möchte, sind die Schalter und Lampen Real, sprich das man die Eingänge des Mikrochips ansteuern muss.

    der Taster soll ein Schließer sein, also logischer weise, soll er erst ein Signal geben, wenn man ihn drückt.

    Welches Betriebssystem läuft denn dort? Irgend ein Ebedded-Linux z.B.? Wie kann man dort die Schalter und Lampen über C ansteuern? Gibt es da ein entsprechendes SDK ???



  • Jetzt wird es mir ein bisschen zu hoch, aber ich mein das ich mal bei conrad.de geguckt habe und da kann man mit einem Microchip Programm einen Microchip Programmieren.

    also das der Chip wird auf den Steckplatz der Platine aufgesteckt und dann mit einem Gerät verbunden, womit das Programm auf die Platine, bzw auf den Chip geladen wird. (=> Der Chip wird "Gebrannt")
    Das kann man mit Allen Betriebssystemen Programmieren.

    Es soll ja nur in logische Funktionen der C++ umgewandelt werden. damit ich es auf den Chip bringen kann und den Schalter und die Lampen Mit auf eine neue Platine zu löten.



  • Wie wäre es wenn du uns einfach mal sagst was du genau an Hardware hast?



  • Servus

    Wahrscheinlich redet er von µC, so etwas z.B: Atmega8.

    Für diese hat man spezielle Libs um die Input/Oupput-Pins zugreifen zu können. Achja und darauf läuft kein "richtiges" Betriebssystem, sonder nur dein Programm, was mit der main-Funktion gestartet wird.

    Zum Programmieren gibt es ein {url=http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial]Tutorial[/url].

    Zugriff auf die I/O's findet über DDRx bzw. PINx statt. Für deine Variante1 mit PIN0=Taster, PIN1=Lampe1 und PIN2=Lampe2.

    if(PIN0 != oldPinValue) {
      PIN1 = !PIN1;
      PIN2 = !PIN2;
      oldPinValue = PIN0;
    }
    

    MfG mdn



  • Danke Marc-O, jetzt kommen wir der Sache schon näher 🙂

    Also genau, auf den Microchips Läuft nur das Programm.
    Nur das ich halt ein Chip verwenden werde der zwischen 18 und 20 Pins besitzt.
    Nur ich komme halt mit Der Programmiersprache C++ nicht zurecht um es auf meinen Chip zu bekommen 😞

    Wäre echt nett und lieb von euch, wenn ihr mir da mal ein beispiel für ein

    Logisches UND-, ZEITGLIED-, RS-Glied zeigen könnt. Wenn möglich mit rklärung 🙂

    Mfg.



  • Servus

    Deine gewünschten Gatter gibt es nur nicht alle so direkt in C++.

    Erstmal die Grundlagen:

    PIN1 & PIN2 // Und
    PIN1 | PIN2 // Oder
    PIN1 ^ PIN2 // Exklusiv Oder
    

    Das Set hat ich im Beitrag von vorher schon definiert, aber hier nochmal im ganzen:

    if (PIN0 != oldPinValue) {
      PIN1 = !PIN1;
      PIN2 = !PIN2;
      oldPinValue = PIN0;
    }
    

    Und dein Zeitglied wird noch etwas komplexer, weil du dir die Zeit selbst ermitteln musst, hier ein kleines Beispiel, ohne Gewähr auf Richtigkeit und Vollständigkeit:

    if (PIN0 && PIN0 != oldPinValue)
      startTime = time(NULL);
    if (PIN0) {
      // Zeitdifferenz bilden, seit Start
      double seconds = difftime(startTime, time(NULL));
      if(seconds > 15.0)
        PIN1 = 1;
    }
    oldPinValue = PIN0;
    

    Und alles musst du dann passend nacheinander in eine hübsche Schleife verpacken.
    Als kleiner Grundstein zum Anfangen:

    #include <avr/io.h>
    
    int main(void) {
      // Vorgeplänkel
    
      while (1) {
        // Hier deine Arbeit verrichten
      }
    
      // Das wird nie erreicht werden.
      return 0;
    }
    

    Hast du dir eigentlich meinen Link zur AVR-Tutorial angeschaut? Wenn nicht hier nochmal der Link http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial. Schau da nach weiteren Informationen, da ist fast alles Schritt für Schritt beschrieben.

    Mfg mdn

    // Edit: belegen von oldPinValue vergessen



  • while(1)
    {
      if (PIN0 && PIN0 != oldPinValue)
        startTime = time(NULL);
      if (PIN0) {
        // Zeitdifferenz bilden, seit Start
        double seconds = difftime(startTime, time(NULL));
        if(seconds > 15.0)
          PIN1 = 1;
      }
      oldPinValue = PIN0;
    }
    

    Das ist ja nichts anderes als Busy Waiting. Ich bin kein Experte was die Programmierung von Mikrocontrollern angeht, aber bei "normaler" C/C++ Programmierung wäre so etwas unbedingt zu vermeiden.

    Stattdessen würde man entweder Sleep() verwenden oder mit Timer-Events arbeiten.

    Auf einem Mikrocontroller hat man evtl. kein Betriebssystem, das einem solche "Dienste" anbietet. Aber ich könnte mir vorstellen, dass man so etwas hier mit einem Timer-Interrupt lösen könnte/sollte...


Anmelden zum Antworten