Hallo, Folgendes ansich einfaches Vorhaben: Ich habe an P1.6 P3.2 und weitere Portss Tasten (insgesamt über 50 an verschiedenen Pins). Für eine interne Verabeitung mochte ich diese nun in einer Variable (64Bit) sortiert einlesen. Also z.B. so: Bit 0 ist Taste 1, Bit 1 ist Taste 2 u.s.w.. Jetzt kann man natürlich zu jeder Taste sagen z.B: ((Port1 & (1<<6))>>6) und ((Port3 & (1<<2))>>1). Das wiederum wird in eine 64 Bit Variable geodert. Oder man macht es lesbarer: if (Port1 & 00100000) setbit var64 an Stelle 1. Ich finde das aber höchst bescheiden, insbesondere bei mehreren Tasten enorm aufwendig und nicht generatorisch. Ich hätte da lieber etwas wie: Nehme Pin 6 von Port 1 und mappe ihn an Bit 1 von Variable x. Kennt da einer eine lesabare Vereinfachung. Umgekehrt ist es auch nötig aus z.B. 1Byte verschiedene Bits verschiedenen Ausgangspins zuzuordnen, ohne zuviele if oder verschiebeaktionen.
bernd schrieb: > Kennt da einer eine lesabare Vereinfachung. Du könntest einen kleineren Prozessor mit 3 freien I/O-Pins nehmen und da deine Tasten ranhängen (Über SPI und Schieberegister) oder du ordnest sie in einer Matrix an (-> 15 I/O Pins)
bernd schrieb: > Für eine interne Verabeitung mochte ich diese nun in einer Variable > (64Bit) sortiert einlesen. Also z.B. so: Bit 0 ist Taste 1, Bit 1 ist > Taste 2 u.s.w.. Und wozu? Lies das Bit lieber an der Stelle ein, an der Du es brauchst. 64-Bit-Variablen sind auf einem Mikrocontroller doch sehr unhandlich und ineffizient. Das Einlesen bzw. Mapping kann man sich per Makro oder Inline-Funktion schön lesbar machen. Zum Beispiel so:
1 | // Taste Port Bit
|
2 | #define KEY_A A, 6
|
3 | #define KEY_B C, 2
|
4 | |
5 | #define GET_KEY_(port, bit) ((PIN##port & (1 << bit))
|
6 | #define GET_KEY(key) GET_KEY_(key)
|
Das Schema kann man natürlich auch benutzen, um die Werte alle nacheinander in eine 64-Bit-Variable zu packen. Ich bezweifel aber wie gesagt, dass es sinnvoll ist ...
Na ja ich versuche allzuviele informationen wegzulassen da es nchts mit dem Problem zu tun hat. Hätte man die Möglichkeit könnte ich natürlich Taste1 an p1.0 und Taste 8 an p1.7 legen u.s.w.. Aber die Möglichkeit gibt es eben nicht. (mehr) Wenn ich die Variable habe werden damit Tastenentprellung und Sonderfunktionen gelesen, das Umsortieren ist also nötig, um allgemeine Programme zu nutzen die bereits fertig sind. Diese wollen eine formatierte Eingabe anhand einer Variablen. 64 Bit waren ein Beispiel. Es geht aber ständig darum verschiedene 8Bit Ports wo teilweise meine Taster dran sind, vernümftig weiterzuverarbeiten.
LOL Was für'n Käfer hast Du denn ? 1 Bitter 4 Bitter 8 Bitter 16 Bitter 32 Bitter 64 Bitter Wenn's in C programmiert ist kannst du 64bit Werte nehmen und dem Compiler den Rest überlassen :-P
Das is schon fast philosophisch, ob man nicht ständig nen 1bitter hat :-)
bernd schrieb: > if (Port1 & 00100000) setbit var64 an Stelle 1. Ja, diese Lösung ist soweit die effizienteste. Allerdings sollte man vorher prüfen, ob der Compiler 64Bit auch optimiert. Oftmals ist das bei 8-Bittern nicht der Fall. Da fährt man erheblich besser, wenn man ein Array aus 8 chars nimmt. bernd schrieb: > Ich finde das aber höchst bescheiden, insbesondere bei mehreren Tasten > enorm aufwendig und nicht generatorisch. Ja, wenn Du einen Schönheitspreis haben willst, muß eben die Effizienz sehr darunter leiden. Du könntest aber auch sagen, wozu das Ganze. Dann gibt es bestimmt viel bessere Lösungen, die auch effizient sind. bernd schrieb: > Nehme Pin 6 von Port 1 und mappe ihn an Bit 1 von Variable x. Ein solches Mapping ist nur möglich, wenn der (unbekannte) MC eine Crossbar hat oder man einen FPGA als MC nimmt. 50 Tasten an den MC zu führen, wäre mir vom Layout her auch schon viel zu aufwendig und störempfindlich. Jede Leitung von außen ist ja auch eine Antennne für Störungen. Ich würde daher die Tasten einfach mit kaskadierten 74HC165 bündeln. Oder als 7*8 Matrix, wenn 2 Tasten gleichzeitig reicht. Peter
Moin, wenn dir Schönheit wichtiger ist nimm doch ein Union:
1 | typedef union _myPort_TypeDef |
2 | {
|
3 | uint8_t d8; |
4 | struct
|
5 | {
|
6 | uint8_t Pin1_0 : |
7 | 1; |
8 | uint8_t Pin1_1 : |
9 | 1; |
10 | uint8_t Pin1_2 : |
11 | 1; |
12 | uint8_t Pin1_3 : |
13 | 1; |
14 | uint8_t Pin1_4 : |
15 | 1; |
16 | uint8_t Pin1_5 : |
17 | 1; |
18 | uint8_t Pin1_6 : |
19 | 1; |
20 | uint8_t Pin1_7 : |
21 | 1; |
22 | }
|
23 | b; |
24 | } myPort_TypeDef ; |
25 | |
26 | myPort_TypeDef xyz; |
27 | |
28 | xyz.d8 = 0x00; |
29 | |
30 | xyz.b.Pin0_0 = 0; |
damit kannst du direkt auf den gesamten Port oder jeden einzelnen Pin zugreifen. Wenn du die Datentypen entsprechend wählst bekommst du auch alle 50 Pins unter. Gruß
Hallo! Bei vielen und ungeordneten Tasten nimmt man auch gern mal Tabellen. Siehe PC-Tastaturen.
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.