PIN s einlesen in C

Gast #100790
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
Gast #100791
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").
Gast #100792
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
Gast #100794
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
Gast #100795
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.)

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