Forum: Mikrocontroller und Digitale Elektronik mehrere Portpins in Variable mappen


von bernd (Gast)


Lesenswert?

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.

von Werner (Gast)


Lesenswert?

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)

von Fabian O. (xfr)


Lesenswert?

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 ...

von bernd (Gast)


Lesenswert?

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.

von loller (Gast)


Lesenswert?

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

von ... (Gast)


Lesenswert?

Das is schon fast philosophisch, ob man nicht ständig nen 1bitter hat 
:-)

von Peter D. (peda)


Lesenswert?

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

von Grml .. (grml)


Lesenswert?

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ß

von Route_66 H. (route_66)


Lesenswert?

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
Noch kein Account? Hier anmelden.