[Anfänger] Bitwert eines Eingangspins abfragen

Gast #1242163
Lesenswert?

Hallo,
ich hab gerade mit AVR-Programmierung angefangen. Vor 5-6 Jahren hatte 
ich C mal im Studium, die Grundzüge sind mir also klar. PHP programmiere 
ich täglich, das ist ja mein Job. Also wie ein Programm "funktioniert", 
ist mir schon klar.

Nun habe ich eine Frage, wie ich den Zustand von Ports speichersparend 
ablegen kann. Ich möchte gerne ein Variable haben, in der nur steht 
"Taster gedrückt: ja/nein".

Dazu habe ich folgendes gemacht:
1
struct {
2
     uint8_t t1;
3
     uint8_t t2;
4
     uint8_t t3;
5
} Taster;
6

7

8
int main (void) {
9
    while(1) {
10
        DDRD    = 0b11100011;
11
        PORTD   = 0b00000011;
12

13
        Taster.t1 = PIND & (1 << PIND2);
14
        Taster.t2 = PIND & (1 << PIND3);
15
        Taster.t3 = PIND & (1 << PIND4);
16

17
[...]
18
}
Das funktioniert. Ich möchte aber haben:
1
struct {
2
     uint8_t t1 : 1; // Also nur ein Bit des Integers (Quasi-Bool)
3
     uint8_t t2 : 1;
4
     uint8_t t3 : 1;
5
} Taster;
6

7

8
int main (void) {
9
    while(1) {
10
        DDRD    = 0b11100011;
11
        PORTD   = 0b00000011;
12

13
        Taster.t1 = PIND2;
14
        Taster.t2 = PIND3;
15
        Taster.t3 = PIND4;
16

17
[...]
18
}

Dass das mit PINDx nicht geht, weil es nur ein Alias ist, ist mir klar. 
Ich würde aber gerne nur den Wahrheitswert des einzelnen Bits speicher, 
um es einfacher ansprechen zu können.

Wenn es nicht geht, ist's auch OK. Nur würde ich's gerne mal wissen...

Viele Grüße & danke schonmal,

Matthias
Gast #1242166
Lesenswert?

Deine Taster-Struktur kannste mit :1 schon machen, das ist in Ordnung. 
Was so nicht direkt geht, ist die Sache mit 'sowieso = PIND2;' und so 
weiter.

Entweder du freundest dich mit der Schieberei und Ver-und-erei an oder 
schreibst dir ein Makro. Alternativ (aber mitunter nicht ganz so 
performant) kannst du dir ein Bitfeld aus acht 1-Bit-breiten Elementen 
bauen und das auf den Port legen:
1
struct port_t {
2
  int b0: 1;
3
  int b1: 1;
4
  int b2: 1;
5
  int b3: 1;
6
  int b4: 1;
7
  int b5: 1;
8
  int b6: 1;
9
  int b7: 1;
10
};
11

12
struct port_t *PIN_A = &PINA;

So in dem Dreh, müsste aber hier im Wiki auch nochmal stehn.
Gast #1242230
Lesenswert?

Hallo & danke schonmal!

Also, das geshiffte stört mich nicht.
Was mich stört, ist -- so sehe ich das zumindest -- in Taster.t1 nicht 
nur der Wert des Tasters, sondern der Wert des ganzen Ports gespeichert 
wird. Nur sind halt alle anderen Pins mit 0 gespeichert. Dh. es werden 
immer 8 Bit gespeichert, obwohl mir die 1-Bit-Info reicht. Oder sehe ich 
das falsch?!

Viele Grüße,
Matthias

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren