Forum: Mikrocontroller und Digitale Elektronik MAX7313 Input Auswertung


von Marcus (Gast)


Lesenswert?

Hallo,

Für mein kleines Projekt brauche ich an einem ESP8266 viele Eingänge und 
da möchte ich gern mit einem MAX7313 arbeiten, da ich diesen noch auf 
"Lager" habe.

Soweit so gut, ich kann die Ausgänge relativ einfach ansteuern, jedoch 
ist dies hier nicht von Nöten. Ganz im Gegenteil verhält sich das bei 
den Eingängen.
Wenn ich einen Auslesen möchte bekomme ich den Zahlenwert 255 für HIGH 
und 254 für LOW, sofern keine anderen Taster gedrückt sind. Und genau da 
ist mein Problem, wenn ich parallel Taster drücke kann ich keine 
eineindeutige Zuordnung machen, da der ausgegebene Zahlenwert immer 
weiter sinkt. Zum Beispiel wenn 3 Taster gedrückt sind und ich gern den 
Wert von einem Taster auslese, steht dieser nun bei 244.

Ich programmiere das Ganze in Arduino IDE mit der Library: 
https://github.com/eta-systems/MAX7313-Arduino

Hier ist noch das Datenblatt von dem IC: 
https://datasheets.maximintegrated.com/en/ds/MAX7313.pdf

Ich wäre sehr dankbar, wenn jemand ein Lösung für die Auswertung hat!

Gruß
Marcus

von Kevin M. (arduinolover)


Lesenswert?

Ganz einfach, so wie es gedacht ist. Du musst die einzelnen Bits 
auswerten. Das geht mit Bitmasken oder Bitfields.

von Marcus (Gast)


Lesenswert?

Danke für die schnelle Info!
Hast du dafür eine gute Vorlage?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Marcus schrieb:
> Wenn ich einen Auslesen möchte bekomme ich den Zahlenwert 255 für HIGH
> und 254 für LOW
Also binäre 11111111 und 11111110.

> Zum Beispiel wenn 3 Taster gedrückt sind und ich gern den
> Wert von einem Taster auslese, steht dieser nun bei 244.
Also binäre 11110100

Was meinst du, welche 3 Taster sind somit betätigt?

Marcus schrieb:
> Hast du dafür eine gute Vorlage?
Mach dich drüber schlau, wie die Darstellung im Dezimalsystem und im 
Binärsystem aussieht. Der Computer hat intern nur die binäre Variante 
mit 0 und 1. Aber rechnet sie dir für die Anzeige auf dein Dezimalsystem 
mit 0,1,..9 um. Du musst also nur zurückrechnen, damit du weißt, was der 
Computer intern sieht.
Dann wird die Auswertung ganz einfach. Mein Tipp: das muss nicht soooo 
schnell gehen, denk ruhig mal ein, zwei Tage drüber nach...

Und dann hängst du noch einen Tag für das Thema Bitmanipulation 
dran.

: Bearbeitet durch Moderator
von Kevin M. (arduinolover)


Lesenswert?

Marcus schrieb:
> Hast du dafür eine gute Vorlage?

Da gibt es millionen Möglichkeiten.

z.B If-Abfragen mit Bitmasken
1
if(data & 0x01){
2
 // tu etwas wenn Taste 1
3
}
4
if(data & 0x02){
5
 // tu etwas wenn Taste 2
6
}
7
if(data & 0x04){
8
 // tu etwas wenn Taste 3
9
}
10
if(data & 0x08){
11
 // tu etwas wenn Taste 4
12
}
13
....

oder Bitfields
1
typedef struct{
2
    uint8_t in1 :1;
3
    uint8_t in2 :1;
4
    uint8_t in3 :1;
5
    uint8_t in4 :1;
6
    uint8_t in5 :1;
7
    uint8_t in6 :1;
8
    uint8_t in7 :1;
9
    uint8_t in8 :1;
10
}Bitfield;
11
12
Bitfield Input;
13
14
if(Input.in1){
15
 // tu etwas wenn Taste 1
16
}
17
if(Input.in2){
18
 // tu etwas wenn Taste 2
19
}
20
if(Input.in3){
21
 // tu etwas wenn Taste 3
22
}
23
if(Input.in4){
24
 // tu etwas wenn Taste 4
25
}
26
....

Wenn die Bits invertiert sind also eine 0 da steht wenn der Taster 
gedrückt ist dann musst du die Abfragen eben invertieren also sowas wie:
1
if(!Input.in1){
2
 // tu etwas wenn Taste 1
3
}

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Marcus schrieb:
> wenn ich parallel Taster drücke kann ich keine
> eineindeutige Zuordnung machen

Die Zuordnung ist sehr wohl eindeutig.
Laß Dir mal den Wert als Binärzahl ausgeben. Dann sollte Dir ein 
Seifensieder aufgehen.

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.