Forcen und Freigeben eines 4-Bit Wertes in einer bestimmten Zeit

OP #3602322
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.
#3602425
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.
Gast #3602427
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?
#3602434
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.