Zustand Port-Pins in Dezimalzahl wandeln

Gast #1701695
Lesenswert?

Hallo,

ich habe da mal eine Frage. Angenommen ich habe eine Reihe von 
Dip-Schaltern an meinem Atmega angeschlossen und will nun in C diese 
Pins benutzten um eine Zahl zu bestimmen, mit der ich dann rechnen kann. 
Binär oder Dezimal ist ja jetzt erstmal egal. Dann würde ich 
normalerweise hingehen und den Zustand meines Ports mit sowas wie

i = PinX & Maske;
irgendwas = irgendwasanderes * i;

auslesen. Ich nehme die Pins, die ich brauche, die anderen maskiere ich 
weg und kann dann mit meinen Dip-Schaltern eine binäre Zahl codieren, um 
damit zu rechnen. Wie mache ich das aber, wenn die Dipschalter über 
mehere Ports verteilt sind und ich eine zusammenhängenden Binärzahl 
will? Ich brauche also irgendwas in der Form von.

if (!(PINB &(1<<2)))
  {
  LSB von i;
  }
if (!(PINC &(1<<5)))
  {
  1. Bit von i;
  }
if (!(PIND &(1<<0)))
  {
  2. Bit von i;
  }

usw. Wie aber macht man sowas konkret und in elegant?

Gruß Tom
Gast #1701729
Lesenswert?

Hi
C is nicht, aber vielleicht ein Lösungsansatz:
Register 1 mit Portwert A belegen.
unwichtige Bits mit Und-Verknüpfung ausblenden (Masierung)
Bit in Position schieben
und register in Variable schreben
Nächsten Portwert laden
unwichtige Bits ausblenden
Auf Position schieben
Mit abgelegtem Wert verodern
usw.....
Gruß oldmax
#1702015
Lesenswert?

Servus,
>
> usw. Wie aber macht man sowas konkret und in elegant?
>

Sich vorher darueber Gedanken machen und nicht einfach drauflos 
loeten.

> Was für eine Enttäuschung.

was kann den C dafuer, dass du deine Schalter so konfus anklemmst, 
obwohl sie offensichtlich eine logische Einheit bilden sollen?
#1702074
Lesenswert?

Tom schrieb:
> Sowas geht nicht mit Bitoperationen in C?

Sicher gehts.
Aber es gibt nicht für jeden Fall von
"Hole dir aus 25 Variablen die Bits mit den Nummern x, y, z und schiebe 
alle gemeinsam in eine neue Variable" ein Spezialzeichen. Da würde die 
Tastatur schnell zu klein werden.

C stellt dir den Baukasten zur Verfügung. Der Bauskasten ist vollständig 
genug, dass man jede Operation daraus zusammenstellen kann.
So wie das bei Lego früher auch mal war: Ein überschaubarer Satz von 
Bausteinen mit denen man gebaut hat. Heute besteht Lego ja nur noch aus 
Spezialteilen für jeden möglichen Furz.

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