mikrocontroller.net

Forum: Compiler & IDEs PIN s einlesen in C


Autor: Holger Gerwenat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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").

Autor: Holger Gerwenat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (Gast)
Datum:

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

Autor: Holger Gerwenat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.