Forum: Compiler & IDEs [Anfänger] Bitwert eines Eingangspins abfragen


von zaphod_beeblebrox (Gast)


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

von Sven P. (Gast)


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.

von Falk B. (falk)


Lesenswert?

Da fehlt ein volatile

von Sven P. (Gast)


Lesenswert?

Stimmt...

von zaphod_beeblebrox (Gast)


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

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.