mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Verkürzte Schreibweise von PIND%2


Autor: Thomas D (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte das Bit von PIND0 einlesen. Am D0 liegt ein High Signal 
(nachgemessen). Der Pin fliegt frei in der Luft ist aber durch den 
internen Pull-Up Widerstand auf High gezogen.

Wenn ich...

bit=PIND0; // erkennt er eine 0
bit=PD0;   // erkennt er eine 0
bit=PIND%2 // erkennt er eine 1


Warum will er die direkte / verkürzte Schreibweise nicht erkennen?


- ATmega8
- WinAVR GCC

Autor: let (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieh mal in der iom8.h nach was PIND0 bedeutet.

Mit
bit = PIND & (1<<PIND0);

wäre es zu tun. Wobei diese Anweisung vielleicht auch nicht
das tust was du erwartest. Sie liefert nämlich nicht 0/1
zurück (gut, in diesem Fall schon) sondern den Wert von
dem Bit, falls gesetzt. Bei PIND1 wäre das also 0 oder 2.

Autor: Thomas D (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
iom8.h... kenn ich nicht.

#include <iom8.h>

kennt auch der Compiler nicht.



Gibt es denn keine Möglichkeit das Bit direkt mit einem Befehl 
auszulesen?

Autor: Thomas D (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habs im Datenblatt gefunden was PIND0 zurückgibt.


Muss man also diese Syntax verwenden oder gibt es auch einen Befehl?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe Dir in dem anderen Thread doch schon den Artikel 
Bitmanipulation empfohlen. Den solltest Du wirklich mal lesen...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas D wrote:
> iom8.h... kenn ich nicht.
>
> #include <iom8.h>
>
> kennt auch der Compiler nicht.
Die iom8.h wird auch nicht direkt eingebunden, sondern automatisch über 
die io.h und den CPU-Typ-Eintrag im Makefile! Abgesehen davon steht sie 
wie auch die io.h im Unterverzeichnis "avr"...

Du solltest die Datei auch nicht einbinden, sondern sie öffnen und 
lesen, was drinsteht.

Autor: Thomas D (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar.


(Auch wenn du es mir nicht glaubst, aber die Bitmanipulation habe ich 
verstanden.)


Danke.

Autor: let (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Gibt es denn keine Möglichkeit das Bit direkt mit einem Befehl
auszulesen?

Nicht mit dem GCC. Der kommerzielle Compiler "Codevision AVR"
hat eine erweiterte Syntax dafür.

Da kannst du
bit = PIND.2;
schreiben. Das verstößt aber gegen den C-Standard und führt
letztlich auch zum gleichen Maschinencode. Ist also nicht
effizienter.

Es gibt Leute die sich für die Ports Strukturen mit Bitfeldern
angelegt haben.
Etwa in der Art:
struct PIN_S {
   unsigned char b0 : 1;
   unsigned char b1 : 1;
   unsigned char b2 : 1;
   unsigned char b3 : 1;
   unsigned char b4 : 1;
   unsigned char b5 : 1;
   unsigned char b6 : 1;
   unsigned char b7 : 1;
};
#define MPIND (*((volatile struct PIN_S*)&PIND))

Und dann mit
bit = MPIND.b0;

Ich habe das nur so hingeschmiert, keine Ahnung ob das richtig is.

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.