Dip-Schalter an Port-Pins abfragen?

Gast #740698
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
#740775
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.
Gast #740870
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

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