Forum: Mikrocontroller und Digitale Elektronik Forcen und Freigeben eines 4-Bit Wertes in einer bestimmten Zeit


von Constantin Alexandru M. (azzuro)


Lesenswert?

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.

von Horst (Gast)


Lesenswert?

"Geforct"???!!!

von Possetitjel (Gast)


Lesenswert?

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? :-)

von Constantin Alexandru M. (azzuro)


Lesenswert?

ich mein damit setzen ;)

von B. S. (bestucki)


Lesenswert?

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.

von Bitflüsterer (Gast)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

@ 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.

von Paul Baumann (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.