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


von Thomas D (Gast)


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

von let (Gast)


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.

von Thomas D (Gast)


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?

von Thomas D (Gast)


Lesenswert?

Habs im Datenblatt gefunden was PIND0 zurückgibt.


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

von Johannes M. (johnny-m)


Lesenswert?

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

von Johannes M. (johnny-m)


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.

von Thomas D (Gast)


Lesenswert?

Alles klar.


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


Danke.

von let (Gast)


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.

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.