AVR Ausgang nach Impulszeit Ausschalten

OP #6241353
Guten Abend zusammen!

ich habe Platine erstellt, die kaskadiert bis zu 128 Augänge über i2C 
Port Expander PCF8574 und 4099 Latches bereitstellen kann.
Prinzipiell funktioniert das ganze. Wenn die Bedingung für den Ausgang 
erfüllt sind wird er gesetzt und wenn die Bedingungen zum löschen des 
Ausgangs Erfüllt sind wird er gelöscht.

Mein eigentliches Problem liegt darin, die Ausgänge als "Impulsausgänge" 
zu betreiben. Hier wird die Bedingung zum löschen des Ausgangs 
ignoriert.
Wenn die Bedingungen erfüllt sind um den Ausgang zu setzen, soll er nach 
beispielsweise 200ms (Bis 1000ms soll möglich sein) wieder gelöscht 
werden.
Delay ist keine Option. Ich suche eine "Multitasking"-Version ähnlich 
wie millis() (Blink without Delay) bei der Arduino IDE.
Verwendet wird ein atmega328P.

Das Problem bei Arduino war, das das ganze sehr Speicherintensiv wurde. 
128 unsigned long Variablen brauchen nunmal ihren Platz von 512Byte. 
Also 1/4 des Verfügbaren Speichers. Die Libaries fressen alle ziehmlich 
viel Speicher, sodass am Ende nur noch 10% Speicher übrig waren.

Somit bin ich doch wieder dazu übergegangen, das ganze in Atmel Studio 6 
zu programmieren.

Ein möglicher Gedanke meinerseits wäre es hier zum Beispiel beim setzen 
des Ausgangs eine Variable auf 0 zu setzen die dann von einem TOVERFLOW 
zum Beispiel alle millisekunde inkrementiert wird. Die Variable wird 
dann im Main auf erreichen des Wertes überwacht.
Allerdings bräuchte ich dann doch auch wieder ein Array mit 128 
Variablen, da die Ausschaltverzögerung ja jeweils für alle 128 Ausgänge 
autark sein soll.

Könnte das so funktionieren?
Gast
Ste M. schrieb:
> Ein möglicher Gedanke meinerseits wäre es hier zum Beispiel beim setzen
> des Ausgangs eine Variable auf 0 zu setzen die dann von einem TOVERFLOW
> zum Beispiel alle millisekunde inkrementiert wird. Die Variable wird
> dann im Main auf erreichen des Wertes überwacht.

Kann man machen. Was wäre die feinste Auflösung? 1ms? Ist die Zeit 
global für alle Ausgänge gültig oder wäre für alle separat einstellbar?
Ste M. schrieb:
> Allerdings bräuchte ich dann doch auch wieder ein Array mit 128
> Variablen, da die Ausschaltverzögerung ja jeweils für alle 128 Ausgänge
> autark sein soll.

Richtig.
Man braucht für 128 unabhängige Zeiten auch 128 Speicherzellen 
(Variablen).
Der Mikrocontroller kann ja nicht ahnen, was Du willst.
OP
Ozvald K. schrieb:
> Kann man machen. Was wäre die feinste Auflösung? 1ms? Ist die Zeit
> global für alle Ausgänge gültig oder wäre für alle separat einstellbar?

Anfangs würde ich die Impulszeit für alle Ausgänge global einstellen.
Die Option einer "Gruppen-Impulszeit" z.B. für immer 16 Augänge steht 
noch offen.

Route_66 H. schrieb:
> Richtig.
> Man braucht für 128 unabhängige Zeiten auch 128 Speicherzellen
> (Variablen).
> Der Mikrocontroller kann ja nicht ahnen, was Du willst.

Gäbe es die Möglichkeit die einzelnen Variablen für den Zeitraum des 
benutzens im SRAM zu speichern und hinterher den Reservierten Speicher 
wieder freizugeben? Wenn ich die Variable lokal definiere wird diese ja 
immer neu initialisiert. Je nach Impulsdauer würde die Funktion ja öfter 
oder weniger durchlaufen.

Grüße
Joker
Gast
Ste M. schrieb:
> Gäbe es die Möglichkeit die einzelnen Variablen für den Zeitraum des
> benutzens im SRAM zu speichern und hinterher den Reservierten Speicher
> wieder freizugeben?

Wenn du die Variablen in mehreren Durchläufen benutzen willst, dann 
musst du sie als global oder static innerhalb der Funktion definieren. 
Ich weiß nicht ob es hier eine explizite Freigabe vom Speicher gibt.
Ich bin in embedded C nicht top fit aber eine gemeinsame Nutzung vom 
Speicher lässt sich mit Union definieren. In dem Fall musst du aufpassen 
wann welche Funktion den gemeinsamen Speicher nutzt.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.