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
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.
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?
Habs im Datenblatt gefunden was PIND0 zurückgibt. Muss man also diese Syntax verwenden oder gibt es auch einen Befehl?
Ich habe Dir in dem anderen Thread doch schon den Artikel Bitmanipulation empfohlen. Den solltest Du wirklich mal lesen...
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.
Alles klar. (Auch wenn du es mir nicht glaubst, aber die Bitmanipulation habe ich verstanden.) Danke.
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.