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?
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.