Verkürzte Schreibweise von PIND%2

Gast #1210185
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
Gast #1210193
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.
#1210206
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.
Gast #1210300
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren