mikrocontroller.net

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


Autor: zaphod_beeblebrox (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
struct {
     uint8_t t1;
     uint8_t t2;
     uint8_t t3;
} Taster;


int main (void) {
    while(1) {
        DDRD    = 0b11100011;
        PORTD   = 0b00000011;

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

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


int main (void) {
    while(1) {
        DDRD    = 0b11100011;
        PORTD   = 0b00000011;

        Taster.t1 = PIND2;
        Taster.t2 = PIND3;
        Taster.t3 = PIND4;

[...]
}

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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
struct port_t {
  int b0: 1;
  int b1: 1;
  int b2: 1;
  int b3: 1;
  int b4: 1;
  int b5: 1;
  int b6: 1;
  int b7: 1;
};

struct port_t *PIN_A = &PINA;

So in dem Dreh, müsste aber hier im Wiki auch nochmal stehn.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da fehlt ein volatile

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt...

Autor: zaphod_beeblebrox (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.