Forum: Compiler & IDEs PIN s einlesen in C


von Holger Gerwenat (Gast)


Lesenswert?

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

von mthomas (Gast)


Lesenswert?

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").

von Holger Gerwenat (Gast)


Lesenswert?

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

von Jörg Wunsch (Gast)


Lesenswert?

Guck ins Datenblatt, bitte.  Die Definitionen sind alle 1:1 so, wie
dort beschrieben.

von Holger Gerwenat (Gast)


Lesenswert?

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

von Jörg Wunsch (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.