Hallo, könnt Ihr mir als Anfänger mal folgende Fragen beantworten? Ich lerne am besten an Beispielen. Wozu sind die folgenden Definitionen: \avr\portpins.h *********************************************************** /* Port Data Register (generic) */ #define PORT7 7 ... /* Port Data Direction Register (generic) */ #define DD7 7 ... /* Define PORTxn values for all possible port pins. */ /* PORT A */ #if defined(PA0) # define PORTA0 PA0 ... ***************************************************** \avr\ z.B. m8.h ***************************************************** /* PORTB */ #define PB7 7 #define PB6 6 #define PB5 5 #define PB4 4 #define PB3 3 #define PB2 2 #define PB1 1 #define PB0 0 /* DDRB */ #define DDB7 7 #define DDB6 6 #define DDB5 5 #define DDB4 4 #define DDB3 3 #define DDB2 2 #define DDB1 1 #define DDB0 0 /* PINB */ #define PINB7 7 #define PINB6 6 ... ************************************************************ Will also eigentlich fragen: Wie spreche ich einen Port an? Beispiel: eine Variable a soll True/False sein, wenn PINB7 nach Masse ist oder eben nicht. a=PINB7; ??? oder z.B. möchte ich eine Funktion benutzen die True/False zurückgibt, wenn mehrer PINS nach Masse sind. Prototye: uint8_t Portabfrage(uint8_t PINX uint8_t PINY uint8_t PINZ); Aufruf dann mit a=Portabfrage(PINC1,PINC3,PINA2); ? Um es deutlich zu sagen es geht mir einfach um die Syntax. Hoffe ich hab mich nicht zu wirr ausgedrückt! Danke für die Hilfe! gruss Holger
In Kurzform: "Echte" bool-Variablen fuer true/false gibt es in "Standard-C" nicht. Man nutzt ueblicherweise byte-breite-Variablen (char/unsigend char). Dann wenn Var==0 -> false, Var<>0 -> true. PINB7 gibt nur die "Bit-Position" (entsp. Pinnummer an) ist einfach nur eine Zahl, wie in der io.h-Datei ja deutlich wird. Der Status aller Eingaenge des Ports steht in PINB ("I/O-Adresse", analog Assembler). Man muss also das Bit zu dem Eingangspin der interessiert "freischneiden". a=PINB&(1<<PINB7)- oder im avr-libc-"slang": a=PINB&_BV(PINB7). a wird 0 ("false"), wenn Pin7 an PortB "low" ist und <>0 ("true") wenn "high". Ein halbwegs gutens C-Buch oder C-Online-Tutorial sollten weiterhelfen ("Bitoperationen"). Einige Links zu Tutorials finden sich im Wiki (wiki.mikrocontroller.net Stichwort "C").
Danke! Das mit boolean_t war mir klar, das mit dem Bit ausmaskieren hab ich verstanden - genauso wie ichs von Assembler kenne. Einzelnes Bit ausmaskieren und dann auch einzeln verarbeiten. Krieg ich hin, denke ich. Ich möchte aber noch mal blöd nachfragen, auch wenns nervt: Welcher Gedankengang steckt denn hinter den Definitionen in der portpins.h ? Wozu ist generic Data und Direction Register Definition PORT7 und DD7 gedacht. Für welche Syntax brauch ich das? Entschuldigung, wenn ich ein bischen schwer begreife. Danke! Gruss Holger
Guck ins Datenblatt, bitte. Die Definitionen sind alle 1:1 so, wie dort beschrieben.
Aha! Datenblatt war das Stichwort! DD7 ist also das Bit 7 im Register DDRD - obwohl die im Datenblatt es DDD7 nennen. Dann muesste ja z.B. solche Konstruktion gehen: loop_until_bit_is_set(DDRD,DD7); Werd ich gleich heute Abend mal im Simulator testen. Danke fuer Eure Geduld! Gruss Holger
Statt DD7 kannst Du auch ruhig gleich eine 7 schreiben. Mir ist nicht so ganz klar, warum die Atmeller für jedes simple Bit 25 verschiedene Namen brauchen. ;-) (Das wird sich wohl auch garantiert nie ändern, daß DD7 = PORTD7 = PIND7 usw ist.)
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.