Hallo, ich stehe gerade etwas auf dem Schlauch und bräuchte bitte Eure Hilfe. Folgendes Problem: Ich habe einen 4-Bit Wert, der von 0000 bis 1010 geht. Wenn jetzt ein Wert, wie z.B. 0111 sich innerhalb von 3 Sekunden nicht verändert, wird dieser dann für 2 Sekunden geforct und anschließend wieder freigegeben. Wenn dieser Wert aber vor dem Ablauf der 3 Sekunden sich nochmals ändert, beginnt der Timer für den neuen Wert vom neuen an zu zählen. Wie kann ich das jetzt in C realisieren, das der Wert mit sich selbst für die 3 Sekunden vergleicht? Vielen Dank im voraus.
Horst schrieb: > "Geforct"???!!! Na logisch. Das signal distorted, weil die output stage des power amplifiers in die saturation geht und die spikes clipped. Alles klar? :-)
Du hast also zwei Komponenten, die wirken: - Einen Zähler - Etwas, das den Zähler kontrolliert und den Wert des Zählers setzen und sperren kann. Somit bietet sich folgende Datenstruktur an:
1 | typedef struct{ |
2 | uint_fast8_t Value:4; |
3 | uint_fast8_t Protected:1; |
4 | }Counter_t; |
Nun musst du sicherstellen, dass dein Zähler Value nur verändert, wenn Protected Null ist. Überlauf musst du natürlich auch implementieren, wenn du nicht bis 0xF zählst. Um den Zähler zu kontrollieren, benutzt du idealerweise einen Timer (falls du für den Zähler ebenfalls einen Timer verwendest, solltest du hierfür einen anderen benutzen). Hier prüft du nun, ob sich der Wert Value seit dem letzten Durchlauf verändert hat. Falls nicht, inkrementierst du eine zusätzliche Zählvariable, falls ja setzt du diese auf Null. Hat die Zählvariable einen bestimmten Wert erreicht, Setzt du Value auf deinen gewünschten Wert und Protected auf 1. Der Rest ist nun ein Kinderspiel. Du inkrementierst wieder deine Zählvariable. Hat sie einen bestimmten Wert erreicht, setzt du Protected wieder auf 0.
Ob ein Input sich verändert hat, kann man feststellen indem man eine frühere und eine jüngere Kopie dieses Inputs miteinander vergleicht. Du solltest allerdings noch ein paar weitere Details festlegen, denn der genaue Ablauf hängt doch von weiteren Gegebenheiten ab: 1. Steht ein neuer Wert synchron zu irgendeinem weiteren Signal an, oder nicht? 2. Wie lange steht ein neuer Wert an? 3. Ändert sich der Wert in irgendeinem Zeitraster? 4. Handelt es sich um ein bidirektionales Signal? 4.a. Wenn ja, wie ist die physikalische Schnittstelle genau gestaltet? Es wäre vielleicht auch hilfreich, wenn Du mal den Gesamtzusammenhang beschreibst. Was ist an Schaltung und Protokoll fest vorgegeben?
@ Constantin Alexandru Mauro (azzuro) >Wenn dieser Wert aber vor dem Ablauf der 3 Sekunden sich nochmals >ändert, beginnt der Timer für den neuen Wert vom neuen an zu zählen. Nennt sich Entprellung. >Wie kann ich das jetzt in C realisieren, das der Wert mit sich selbst >für die 3 Sekunden vergleicht? etwa so
1 | #define CNT_MAX 300
|
2 | |
3 | // das hier im 10ms Raster per Timer aufrufen
|
4 | |
5 | if (wert_alt == wert_neu) { |
6 | cnt=CNT_MAX |
7 | } else { |
8 | cnt-- |
9 | if (!cnt) { |
10 | wert_alt = wert_neu; |
11 | wert_aktuell= wert_neu; |
12 | }
|
13 | }
|
Vielen Dank im voraus.
@Possetitjel Das hast Du wirklich schön gesagt! :-)) MfG Paul
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.