Forum: Mikrocontroller und Digitale Elektronik Matrixtastenfeld per UART "gedrückt halten" (AVR)


von Christian (Gast)


Lesenswert?

Guten Tag zusammen :)

Ich habe vor mit einem AVR (Atmega32) eine Matrixtastatur auszulesen, 
und über UART die Daten mit an ein Funkmodul zu übertragen.

Wie das mit dem Auslesen der Tastatur funktioniert und die Uart 
übertragung funktioniert weiß ich schon, und ist im Testaufbau auch 
schon erfolgreich ausprobiert worden.

Ich habe mir ein passendes einfaches Protokoll dazu einfallen lassen das 
der Senderteil sendet;

Adresse, Datenblock1, Datenblock2, Prüfsumme gebildet aus der Adition 
der Quersumme von der adresse dem Datenblock1 und Datenblock2. sieht 
dann etwa so aus:


Adresse   Datenblock1   Datenblock2   Resultierende Prüfsumme
14DEZ     15DEZ         22DEZ         15DEZ


Der Empfängerteil rechnet sich die Prüfsumme erneut aus Adresse, 
Datenblock1 und Datenblock2 aus und vergleicht sie mit der 
mitübertragenden Prüfsumme. So  wird ausgeschlossen das Empfangender 
Umweltfunkmüll verarbeitet wird.

-Klappt supi

Mein Problem ist folgendes:
Wenn eine Taste gedrückt gehalten wird soll das vom empfänger auch so 
aufgenommen werden.
Ich habe keine Idee wie ich das Softwaretechnisch realisieren soll. Ich 
könnte in einem der Datenblöcke ein bit für eine gedrücktgehaltene taste 
setzen und zyklisch senden. Problem ist wenn dann die Funkverbindung 
abbricht (Entfernung oder störende Signale) bleibt der letzte 
übertragene Wert zur Auswertung, was dem Empfänger eine immernoch 
gedrückte Taste mitteilen würde.
Timer käme für mich vom Gedanken her nicht in Frage (korrigieren wenn 
falsch) da ja sowieso "ab und an" mal eine übertragung misslingt.

jemand eine Idee ?

Ich programiere in Assebler von daher falls Codeschnippsel kommen bitte 
nur in Assembler :)


Mfg Christian

von Klaus2m5 (Gast)


Lesenswert?

Beim PS2 Protokoll wird zum Beispiel "Make" und "Break" gesendet, also 
Anfang und Ende eines Tastendrucks haben einen eigenen Datenblock.

von BirgerT (Gast)


Lesenswert?

Christian schrieb:
> Wenn eine Taste gedrückt gehalten wird soll das vom empfänger auch so
> aufgenommen werden.
> Ich habe keine Idee wie ich das Softwaretechnisch realisieren soll.

Mach's doch so, wie es in den Infrarot Fernbedienungen gemacht wird - 
mit dem Togglebit. Jeder neue Tastendruck dreht ein Bit im Telegramm um. 
Bei wiederholten Telegrammen mit gleichem Tastendruck, hat das Bit den 
gleichen Wert, wie im Vorgänger Telegramm.

von Christian (Gast)


Lesenswert?

Klaus2m5 schrieb:
> Beim PS2 Protokoll wird zum Beispiel "Make" und "Break" gesendet, also
> Anfang und Ende eines Tastendrucks haben einen eigenen Datenblock.

Hätte zur Folge das bei Datenabriss nach drücken der Taste die Taste 
immernoch als gedrückt gilt.



BirgerT schrieb:
> Mach's doch so, wie es in den Infrarot Fernbedienungen gemacht wird -
> mit dem Togglebit. Jeder neue Tastendruck dreht ein Bit im Telegramm um.
> Bei wiederholten Telegrammen mit gleichem Tastendruck, hat das Bit den
> gleichen Wert, wie im Vorgänger Telegramm.


hast du das jetzt versehentlich vertauscht ?
Wird der bit bei gedrücktgehaltener Taste NICHT gedreht?
macht jetzt für mich so in der Form keinen Sinn. Aber der ansatz ist 
glaube ich ganz gut.

von BirgerT (Gast)


Lesenswert?

Christian schrieb:
> hast du das jetzt versehentlich vertauscht ?
> Wird der bit bei gedrücktgehaltener Taste NICHT gedreht?

Zitat von http://www.opendcc.de/info/rc5/rc5.html
" Die Daten werden solange gesendet, wie die Taste auf der Fernbedienung 
gedrückt ist. Das Toggle Bit wechselt bei jedem erneuten Drücken der 
Taste seinen Zustand. Dadurch kann der Empfänger Doppeldruck von einem 
langen Tastendruck unterscheiden. "

von Christian (Gast)


Lesenswert?

Vielen Dank erstmal.
Ich werde michda mal durchlesen.
Ich melde mich wenn was explodiert ist :D

mfg Christian

von Andreas (Gast)


Lesenswert?

Hi,
man könnte es so machen:

-bei einer gedrückten Taste in einem definierten Zeitabstand senden, 
sagen wir 200ms, warum auch nicht? Sonst nach Anforderung festlegen.

-der Empfänger zieht beim Empfang einen Timer für diese Taste(n) mit 
200ms*N auf. Schlägt der Timer zu, gilt/gelten die Taste(n) als 
ausgeschaltet. N > 2, einfach testen, welche Werte am Besten 
funktionieren und wie groß der "Überhang" sein darf.

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.