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


von Uwe (Gast)


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.
1
struct dipbits{
2
  byte b0 : 1;
3
  byte b1 : 1;
4
  byte b2 : 1;
5
  byte b3 : 1;
6
  byte b4 : 1;
7
  byte b5 : 1;
8
  byte b6 : 1;
9
  byte b7 : 1;
10
} __attribute__((_packed_));
11
12
#define DIP_BIT(port, bitnummer) (((volatile struct dipbits *)&port)->b##bitnummer)
13
#define  DIP1 DIP_BIT(PORTB, 6)
14
#define  DIP2 DIP_BIT(PORTB, 7)
15
#define  DIP3 DIP_BIT(PORTG, 3)
16
#define  DIP4 DIP_BIT(PORTG, 4)

und im Main dann quasi den Hex-Wert der Schalter berechnen und per UART 
rausschicken.
1
  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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

s/DIP_BIT(PORT/DIP_BIT(PIN/g

von STS (Gast)


Lesenswert?

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

von Uwe (Gast)


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?

von Johannes M. (johnny-m)


Lesenswert?

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

von STS (Gast)


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.

von Johannes M. (johnny-m)


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.

von Jadeclaw (Gast)


Lesenswert?

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

Gruß
Jadeclaw.
( not logged in )

von Bensch (Gast)


Lesenswert?

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

von Obelix (Gast)


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.

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.