mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Dip-Schalter an Port-Pins abfragen?


Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

steh grad auf dem Schlauch. Hab hier einen Atmega 64 und einen vierfach 
Dip-Schalter gegen VCC dran.

 VCC
  |
  o-o-o-o
  | | | |
  1 2 3 4    <DIPs>
  | | | |
  | | | o--- Pin B6 <uP-Portpin>
  | | o-+--- Pin B7 <uP-Portpin>
  | o-+-+--- Pin G3 <uP-Portpin>
  o-+-+-+--- Pin G4 <uP-Portpin>
  | | | |
  R R R R    <10K-Widerstände>
  | | | |
  o-o-o-o
  |
 GND

Die einzelnen Portpins sind DDR = 0 definiert.
Die Schalter wollte ich in ein Struct ablegen, etwa so.
struct dipbits{
  byte b0 : 1;
  byte b1 : 1;
  byte b2 : 1;
  byte b3 : 1;
  byte b4 : 1;
  byte b5 : 1;
  byte b6 : 1;
  byte b7 : 1;
} __attribute__((_packed_));

#define DIP_BIT(port, bitnummer) (((volatile struct dipbits *)&port)->b##bitnummer)
#define  DIP1 DIP_BIT(PORTB, 6)
#define  DIP2 DIP_BIT(PORTB, 7)
#define  DIP3 DIP_BIT(PORTG, 3)
#define  DIP4 DIP_BIT(PORTG, 4)

und im Main dann quasi den Hex-Wert der Schalter berechnen und per UART 
rausschicken.
  unsigned int dipwert = (DIP1 * 1 + DIP2 * 2 + DIP3 * 4 + DIP4 * 8);

Aber egal was ich an den Schaltern einstelle, es bleibt immer "0". Wo 
denke ich hier falsch?

Uwe

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
s/DIP_BIT(PORT/DIP_BIT(PIN/g

Autor: STS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sind beim AVR die Eingänge nicht PIN anstatt PORT?

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso, Du meinst, daß ich damit zwar die einzelnen Bits im Struct setzen 
kann, nicht aber den Zustand der Pins, ob High oder Low, einlesen kann?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jeder Port hat drei Register: DDRn, PORTn und PINn. Das einzige von 
außen beeinflussbare ist PINn. Steht aber auch im Datenblatt...

Autor: STS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In meiner trüben Erinnerung war beim AVR das Eingangsregister PINx, das 
Ausgangsregister PORTx getrennt. Bei manchen Controllern (HC 11) liegt 
es auf der gleichen symbolischen Adresse.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
STS wrote:
> In meiner trüben Erinnerung war beim AVR das Eingangsregister PINx, das
> Ausgangsregister PORTx getrennt. Bei manchen Controllern (HC 11) liegt
> es auf der gleichen symbolischen Adresse.
So trüb ist Deine Erinnerung offensichtlich nicht. Es verhält sich 
genau so. PORTn enthält die Zustände der Ausgangstreiber, und die sind 
von außen nicht veränderlich. Wenn man PORTn einliest, bekommt man immer 
das, was man auch selbst reingeschrieben hat.

Autor: Jadeclaw (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Uwe: STS, Johannes und Stefan liegen richtig.
Du mußt PIN abfragen, nicht PORT. Das sind separate Register.

Gruß
Jadeclaw.
( not logged in )

Autor: Bensch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und im übrigen schaltet man gewöhnlich gegen Gnd und nutzt die internen 
PullUps des AVR.

Autor: Obelix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> unsigned int dipwert = (DIP1 * 1 + DIP2 * 2 + DIP3 * 4 + DIP4 * 8);

Das sieht für mich auch reichlich umständlich aus, da der Wert den du 
errechnest bereits so wie du ihn brauchst im Speicher steht. Schau dir 
mal "union" in Zusammenhang mit der "struct dipbits" an.

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.