Forum: Mikrocontroller und Digitale Elektronik AVR Ausgang nach Impulszeit Ausschalten


von Ste M. (joker)


Lesenswert?

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?

von Ozvald K. (Gast)


Lesenswert?

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?

von Route_66 H. (route_66)


Lesenswert?

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.

von Ste M. (joker)


Lesenswert?

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

von Ozvald K. (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

Ste M. schrieb:
> 128 unsigned long Variablen brauchen nunmal ihren Platz von 512Byte.

Du solltest vielleicht erstmal spezifizieren, was Du überhaupt willst.
Z.B. für 5..1280ms in 5ms-Schritten reichen schon 128 Byte.

Ste M. schrieb:
> Die Libaries fressen alle ziehmlich
> viel Speicher

Welche denn?
1,5kB is schon heftig.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.