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?
Nein, denn das erfordert unendlich viel Speicher. Du wirst immer ein oberes Limit haben, wie viele Events bis zur Übertragung gespeichert werden können.
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.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.