- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 8 von 8

Thema: Abfallen von Ausgängen verzögern

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    67
    Beiträge
    2.435
    Hallo Patrick,

    Etwas Software brauchst du dazu schon.

    Du brauchst für jedes Bit einen Timer. Das kannst du mit einem Timer-Interrupt machen, welcher z.B. alle 1ms aufgerufen wird.
    Wenn die Timer >0 wird der Wert jedes Mal um 1 verringert.

    Wenn du PORTD einliest, wird jedes Mal für eine gelesene 1 der entsprechende Timer mit 200 beschrieben.

    Für die Ausgabe musst für jeden Timer welcher >0 eine 1 ins entsprechende Bit setzen.

    So in der Art (nicht getestet):
    Code:
    unsigned char timer[8];
    
    void interrupt(void)
      {
         char i;
    
         for (i = 0; i < 8; i++)
           {
              if (timer[i]) timer[i]--;
           }
      }
    
    void out(void)
      {
        char i;
        unsigned char x = 0;
    
         for (i = 0; i < 8; i++)
           {
              if (timer[i]) (x |= (1 << i));
           }
          i2c_write (x); 
      }
    
    unsigned char in(void)
    {
        unsigned char x;
        char i;
    
         x = PORTD;
         for (i = 0; i < 8; i++)
           {
              if (x & (1 << i)) timer[i] = 200;
           }
    }
    Kann Reste von Tippfehlern enthalten.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  2. #2
    Benutzer Stammmitglied Avatar von modtronic
    Registriert seit
    14.05.2011
    Ort
    Hagen
    Alter
    48
    Beiträge
    68
    Zitat Zitat von Peter(TOO) Beitrag anzeigen
    Hallo Patrick,

    Etwas Software brauchst du dazu schon.

    Du brauchst für jedes Bit einen Timer. Das kannst du mit einem Timer-Interrupt machen, welcher z.B. alle 1ms aufgerufen wird.
    Wenn die Timer >0 wird der Wert jedes Mal um 1 verringert.

    Wenn du PORTD einliest, wird jedes Mal für eine gelesene 1 der entsprechende Timer mit 200 beschrieben.

    Für die Ausgabe musst für jeden Timer welcher >0 eine 1 ins entsprechende Bit setzen.

    So in der Art (nicht getestet):
    Code:
    unsigned char timer[8];
    
    void interrupt(void)
      {
         char i;
    
         for (i = 0; i < 8; i++)
           {
              if (timer[i]) timer[i]--;
           }
      }
    
    void out(void)
      {
        char i;
        unsigned char x = 0;
    
         for (i = 0; i < 8; i++)
           {
              if (timer[i]) (x |= (1 << i));
           }
          i2c_write (x); 
      }
    
    unsigned char in(void)
    {
        unsigned char x;
        char i;
    
         x = PORTD;
         for (i = 0; i < 8; i++)
           {
              if (x & (1 << i)) timer[i] = 200;
           }
    }
    Kann Reste von Tippfehlern enthalten.

    MfG Peter(TOO)
    Guten Morgen

    Vielen Dank. mit dieser Lösung könnte ich etwas anfängen
    könntest du mir dazu noch mehr erklären..
    zb was hinkommt wo das x ist ??

    Danke und Gruss
    Patrick

    - - - Aktualisiert - - -

    Moin

    Ich nochmal..manchmal sieht man ja den Wald vor lauter Bäumen nicht.
    ich habe eine Lösung gefunden, die zwar nicht so elegant ist wie hier oben beschrieben, aber jetzt auch läuft.

    Folgender Weg wurde eingeschlagen.
    Der I2C Datenwert besteht ja aus den Werten 0 - 255. Mein Gedanke war wie ich nun jeden einzelnen Pin steuern kann.
    Ich habe daher nun die Grundwerte 1, 2,4,8,16,32,64 und 128 auf eine Variable aufgeteilt, die immer nur diese Wertigkeit oder 0 hat.

    Ich habe dann diese einzelnen Variablen auf eine Gesamtvariable addiert, und diese dann an den Bus gesendet.
    Gleichzeitig werden diese Einzelvariablen immer von je einem PIN des AT-Mega gesteuert. Das erlaubt mir wiederum, jeden Beliebigen Pin zu verwenden und nicht zwingend ein komplettes Byte.
    Durch diese Addition wird z.b bei der Variable 1 und 2 eine 3 gesendet, was zwei Ausgänge GPA0 und GPA1 des MCP steuern.
    wenn nun die Variable 1 Low wird, und die 2 aber High bleibt, wird die 1 von dem Gesamtwert 3 abgezogen und es wird GPA1 HIGH bleiben und GPA0 wird Low werden.

    so kann ich nun jeden einzelnen Pin des MCP gezielt ansprechen.
    Wenn ich nun diese Einzelvariable noch im Abfall verzögere (Timer, Zähler) kann ich gezielt eine Abfallzeit für jeden Pin steuern.

    Wunderbar.

    Gruss
    Patte

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    67
    Beiträge
    2.435
    Hallo Platte,
    Ich habe daher nun die Grundwerte 1, 2,4,8,16,32,64 und 128 auf eine Variable aufgeteilt, die immer nur diese Wertigkeit oder 0 hat.
    In manchen Programmiersprachen, wie z.B. ursprünglich in BASIC, gab es keinen anderen Weg um einzelne Bits manipulieren zu können.

    C/C++ hat aber von Anfang an extra Mechanismen um einzelne Bits manipulieren zu können.

    (1 << i) macht auch nichts anderes
    1 << 0 = 1
    1 << 1 = 2
    1 << 2 = 4

    C wurde ursprünglich entwickelt um ein Betriebssystem (Unix) schreiben zu können. Zu einem Betriebssystem gehören auch eine Menge Hardware-Treiber und folglich auch eine Menge Bits, welche bearbeitet werden müssen.

    BASIC steht für "Beginner’s All-purpose Symbolic Instruction Code", was so viel bedeutet wie „symbolische Allzweck-Programmiersprache für Anfänger. War also nur für Anwender-Programme gedacht. Auf vielen kleineren Computern wurde BASIC auch als "Betriebssystem" eingesetzt.

    Bis Auf Unix waren praktisch alle Betriebssysteme komplett in Assembler programmiert. Für eine neue CPU musste immer alles neu geschrieben werden. Unix bestand dann nur noch aus ein paar Prozent aus Assembler, der ganze Rest war in C geschrieben.

    Einen anderen Weg ging, ein paar Jahre später, U.C.S.D.-Pascal. Dabei bastelte man sich eine theoretische CPU zusammen, welche dann auf einer konkreten CPU simuliert wurde. Den Assembler-Code für diese simulierte CPU nannte man P-Code (Pseudo-Code). Man musste dann immer nur den P-Code für den einfachen Interpreter für eine neue CPU neu in Assembler schreiben.
    Java verwendet diese Technik heute noch, dort nennt man den P-Code Byte-Code.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

Ähnliche Themen

  1. Gabellichtschranke signal verzögern
    Von T4Sven im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 23.02.2013, 21:32
  2. Waasermelder Signal verzögern
    Von nero24 im Forum Elektronik
    Antworten: 11
    Letzter Beitrag: 15.01.2011, 08:59
  3. Signal um 250ns verzögern
    Von Robbo im Forum Elektronik
    Antworten: 16
    Letzter Beitrag: 15.03.2007, 10:19
  4. Relais nach x Sekunden abfallen lassen
    Von BlaueLed im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 17.11.2006, 16:34
  5. Antworten: 6
    Letzter Beitrag: 06.03.2006, 08:51

Berechtigungen

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

Labornetzteil AliExpress