Forum: Mikrocontroller und Digitale Elektronik Algorithmus zur verlustfreien Sensorabtastung


von Bert (Gast)


Lesenswert?

Hallo,

ich habe verschiedene Module die alle von einem Master zyklisch 
abgefragt werden. Jedes Modul besteht dabei aus einem Taster und einem 
Microcontroller für die Kommunikation. Pro Modul wird ein long 
"Tasterzustand" übertragen. Dieser Zustand kann folgende Werte annehmen: 
Aus  Ein  Gehalten (> 2s Ein)/ Doppelklick.

Liegt nun das Abfrageintervall des Masters deutlich über dem 
Schaltintervall der Taster, so gehen eventuell Events verloren.

Einfaches "hochzählen" eines Wertes würde für simples Ein/Aus 
funktionieren, allerdings nicht mit zusätzlich Gehalten / Doppelklick 
als Zustand.


Gibt es einen Algorithmus / eine Encodierung um trotz unveränderter 
Abfrageintervalle keine Zustände zu verlieren?

von Programmierer (Gast)


Lesenswert?

Nein, denn das erfordert unendlich viel Speicher. Du wirst immer ein 
oberes Limit haben, wie viele Events bis zur Übertragung gespeichert 
werden können.

von Bert (Gast)


Lesenswert?

Das obere Limit wäre kein Problem. Die Taster werden vom Master so 
schnell es eben der uC hergibt abgefragt (praktisch also mehrmals die 
Sekunde). Die Taster werden ausschliesslich von Menschen bedient. Somit 
reicht bereits ein kleiner Puffer aus um ca. 1 Sekunde zu überbrücken. 
Nur wollte ich eigentlich ohne zusätzliche Implementierung einer 
Puffer-Übertragung auskommen.

von Radiostar (Gast)


Lesenswert?

Dann kannst zyklisches Abfragen knicken. Die Module müssen selbstätig 
Tastendrücke an den Master schicken, sobald welche da sind. Der Master 
reagiert per Interrupt. Aber auch da kanns eng werden, wenn zu viele 
Tasten auf einmal gedrückt werden. Ohne Puffer wirds also schwierig. Und 
ich würde mir schon überlegen, obs ein Limit gibt. Erstmal kan auch ein 
nervöser Mensch nicht beliebig schnell drücken, außerdem hast du doch 
sicher eine Tastenentprellung, die ja auch Zeit braucht.

von Ernie (Gast)


Lesenswert?

Muss die Kommunikation Synchron oder kann diese auch Asynchron ablaufen.

Du kannst die Kommunikation mit dem Master und die Erfassung der Aktion 
trennen.

Im Aktionsblock fragst Du den Taster ab und generierst für den Zustand 
einen Wert. Den übergibst du an den Kommunikationsblock, der darauf 
wartet, dass ihn der Master abfragt.

Wenn das Abfrageintervall kurz genug ist, sollte kein Event verloren 
gehen.

In deinem "long" kannst du ja eine ganze Menge an Informationen 
unterbringen, die den Master über die Zustände informiert.

Leg dir für die verschiedenen Zustände eine Tabelle an. Erleichtert in 
den meisten Fällen den Weg zu Ziel.

von Peter D. (peda)


Lesenswert?

Bert schrieb:
> Pro Modul wird ein long
> "Tasterzustand" übertragen. Dieser Zustand kann folgende Werte annehmen:
> Aus  Ein  Gehalten (> 2s Ein)/ Doppelklick.

Ich komme dafür nur auf 2 Bit, wozu sind die übrigen 30 Bits?

Bert schrieb:
> Die Taster werden ausschliesslich von Menschen bedient.

Wenn es keine Gamer sind, reichen 500ms Abfrageintervall dicke aus.

Radiostar schrieb:
> Dann kannst zyklisches Abfragen knicken.

Warum, arbeitet Deine CPU etwa noch mit Relais?
Polling ist selbst bei 1000 Tasten völlig problemlos.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Bert schrieb:
> ich habe verschiedene Module die alle von einem Master zyklisch
> abgefragt werden. Jedes Modul besteht dabei aus einem Taster und einem
> Microcontroller für die Kommunikation. Pro Modul wird ein long
> "Tasterzustand" übertragen. Dieser Zustand kann folgende Werte annehmen:
> Aus  Ein  Gehalten (> 2s Ein)/ Doppelklick.

 Mit long kannst du weitaus mehr als nur diese Zustände senden.
 In deinem Beispiel:

  |  Byte 1  |  Byte 0  |
  | 76543210 | 76543210 |
  | 1xyttttt | tttttttt | = Taster Ein
  | 0xyttttt | tttttttt | = Taster Aus
 t steht fur Zeit in ms., wenn >= 8192 wird nicht weitergezählt.
 x steht für einen (vom Modul detektiert) Doppelklick.
 y steht für einen (vom Modul detektiert) gehaltenen Taster.

 Beim drücken oder loslassen der Taster werden Byte1 und Byte0 ins
 Byte3 und Byte2 übernommen. Funktionierende Prellroutine beim
 Modul vorausgesetzt.

 Master sendet:
  a) eine normale Abfrage, bei der er nur die 4 Bytes zurückkriegt.
  b) eine Reset Abfrage, bei welcher die 4 Bytes gesendet und gleich
     danach auf Null gesetzt werden. (Nach einem Doppelklick z.B.)

 Somit kannst du beim Modul die Zustände detektieren, beim Master
 kontrollieren und es geht mit Sicherheit kein Zustand verloren.

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.