Hallo zusammen, mittels eines jumpers am PortB möchte ich Geräte Adressen einstellen können. Meine Idee dazu ist, über den gesamten Port pinweise ein Bitmaske zu legen. Also if ( !(PINB & (1<<PINB7)) dann ... (Jumper ist gegen GND geschaltet) if ( !(PINB & (1<<PINB6)) dann ... if ( !(PINB & (1<<PINB5)) dann .. usw. Ist das die richige Vorgehensweise oder gibt es da eine einfachere und schönerere Lösung ? Danke
Du aktivierst die internen PullUps und ließt den ganzen Port ein? Notfalls kannst du es danach noch Maskieren und/oder invertieren
Damit kommst du auf 8 Adressen. Du könntest es auch so machen, dann brauchst du für 8 Adressen nur 3 Pins:
1 | PIN |
2 | 1 2 3 Adresse: |
3 | |
4 | 0 0 0 1 |
5 | 0 0 1 2 |
6 | 0 1 0 3 |
7 | 0 1 1 4 |
8 | 1 0 0 5 |
9 | 1 0 1 6 |
10 | 1 1 0 7 |
11 | 1 1 1 8 |
(0 = Pin nicht gejumpert, 1 = gejumpert) Allerdings brauchst du halt dann bis zu 3 Jumper gleichzeitig.
Simon S. schrieb: > Damit kommst du auf 8 Adressen.Du könntest es auch so machen, dann brauchst du für 8 Adressen nur 3 Pins: PIN 1 2 3 Adresse:0 0 0 10 0 1 20 1 0 30 1 1 41 0 0 51 0 1 61 1 0 71 1 1 8(0 = Pin nicht gejumpert, 1 = gejumpert)Allerdings brauchst du halt dann bis zu 3 Jumper gleichzeitig. Ok ! Aber der Weg mit der Maske pro Pin ist doch richtig, oder ?
Nachtrag: Code währe dann:
1 | adresse = PINB & 7; |
(Wenn du die 3 niederwertigsten Pins des PortB nimmst. Ansonsten halt nach rechts shiften)
Na wo ist denn dann das Problem? Wenn ein Jumper gesteckt ist, ist das Bit Low, wenn nicht, High. Dann ließt du den Port ein, invertierst es und hast die Adresse als binär Code. Wenn du z.B. an PORTB.0 ein Jumper hast und beim Rest nicht, ließt du "1111 1110". Invertiert ist das "0000 0001". Und da hast du die Adresse. Ob du die im Ram speicherst oder in einem Register für z.B. I²C ist dir überlassen. BTW: Simos Vorschlag ist der gleiche wie meiner, nur dass ich alle 8 bit benutze (du meintest den gesamten PORTB). Ob dir 8 Adressen reichen oder nicht musst du wissen. Wenn ja, kannst du auch alles einlesen, also "xxxx x110", negiert "xxxx x001" und dann mit "& 0000 0111" Maskieren.
tom schrieb: > Ok ! > Aber der Weg mit der Maske pro Pin ist doch richtig, oder ? Schon. Aber umständlich. Und für einen Benutzer ist es in Wirklichkeit auch nicht einfacher.
nach ein paar Zeichnungen und vielen 000000'en und 1111111'en habe ich es nun begriffen. Danke !
Statt Jumpern gibt es auch schöneres: http://www.reichelt.de/index.html?;ACTION=446;LA=446;SEARCH=codierschalter;OFFSET=16;SORT=-rank;SHOW=1;SID=11T7c5PH8AAAIAAD337YY9ca6d32c4b28f2a273e8efba32c7706f;GROUPID=385
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.