Dip-Schalter an Port-Pins abfragen?

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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.