Forum: Mikrocontroller und Digitale Elektronik Zustand Port-Pins in Dezimalzahl wandeln


von Tom (Gast)


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

von oldmax (Gast)


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

von Tom (Gast)


Lesenswert?

Sowas geht nicht mit Bitoperationen in C? Was für eine Enttäuschung. Na 
dann halt alle Ports einlesen, wichtige Bits rausmaskieren und alle 
zusammen verunden. Müsste ja auch gehen.

von Lehrmann M. (ubimbo)


Lesenswert?

http://www.mikrocontroller.net/articles/Bitmanipulation

da steht alles.

Musst dir halt Wertigkeiten ausdenken.

z.B.

Wertigkeiten immer 2^n.

Bsp.

Pin7 Wertigkeit 2^0 = 1
Pin 12 Wertigkeit 2^1 = 2
Pin 329 Wertigkeit 2^2 = 4
Pin 2 Wertigkeit 2^3 = 8

deine Dezimalzahle ist die Summe der Wertigkeiten (wenn der Pin log. 
high ist dann gilt die Wertigkeit ansonsten 0)

von Robert W. (rweber)


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?

von Karl H. (kbuchegg)


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.

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.