[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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.