Guten Morgen, ich habe an meinem Attiny85 alles belegt außer Reset.
Unter anderem habe ich einen 3poligen Dip schalter an 3 Pins
angeschlossen. Wie werte ich den am intelligentesten aus, so dass ich
dessen Zustand binär in einer 3 Bit Variable habe?
Mark schrieb:> Wie werte ich den am intelligentesten aus
In einer Programmiersprache, die du beherrschst.
> so dass ich dessen Zustand binär in einer 3 Bit Variable habe?
Dazu ein Denkanstoß: welche Wortbreite hat der Prozessor?
Und warum ist es dehalb viel geschickter, den Zustand in eine 8-Bit
Variable einzulesen?
> Unter anderem habe ich einen 3poligen Dip schalter an 3 Pins angeschlossen.
Wie hast du den da angeschlossen? Schaltet jeder der Schalter gegen
Masse? Das wäre hier am intelligentesten, denn dann brauchst du keine
externen Pulldown-Widerstände, sondern kannst mit den im µC eingebauten
Pullups arbeiten.
Komisch, meine Glaskugel ist total beschlagen!
Die sagt mir nicht an welchem Pin welcher Schalter angeschlossen ist
noch sagt sie mir in welcher Sprache Du das Problem lösen möchtest.
Ist wohl unwichtig;-)
Mark schrieb:> Angeschlossen an PIN 2-4,> Sprache ist C,> geschaltet wird gegen Masse.> Und ja, die Zustände mögen in einer uint8 Variablen gespeichert werden.
PIN4 ist GND also bleiben nur 2 Bit übrig oder du nennst die richtigen
Ports!
Michael R. schrieb:> Und Pin 2-4 sind welche Pins von welchem Port (steht im Datenblatt)?
Der Tiny85 hat nur B-Port. Aber Pin 4 ist GND, daran ist der Schalter
zwar auch angeschlossen,
Mark schrieb:> geschaltet wird gegen Masse.
nur wo ist der 3. Schalter angeschlossen?
@Mark: wie wäre es mit einem Schaltplan?
Wenn du drei Schalter hast, dann gibt es 8 Zustände. Also kann man das
relativ einfach den Zahlen 0-7 zuordnen. Oder auch drei Variablen (S1,
S2 S3 mit ON und OFF).
War nur exemplarisch gemeint.
Angeschlossen ist der Schalter an: PB1, PB2, PB3.
Schalter nicht betätig = 0, Schalter betätigt (zieht PBx auf Masse) = 1.
Auslesen geschieht bisher so:
1
if(!(PINB&(1<<SW1)))
2
...
3
if(!(PINB&(1<<SW2)))
4
...
5
if(!(PINB&(1<<SW3)))
Mir geht es darum die Werte in eine Variable zu bekommen, welche ich
dann auf den Zustand überprüfen kann.
dann irgendwas mit InputStates machen.
kann man bestimmt eleganter programmieren, ist aber einfach verständlich
für mich und flexibel einsetzbar.
Gruss
Ist es nicht wesentlich kürzer, schneller, einfacher, den Port komplett
einzulesen, zu maskieren und zu shiften?
Also so wie's der ufuf (Fanboy) oben gesagt hat, nur plus ein >>1, damit
das "kleinste" Bit an Position 0 kommt?
Die inversion sollte man auch noch loskriegen.
Sind dann am Ende ganze 3-4 Befehle.
Wenn Pins vertauscht (0,2,1) oder gemischt sind (0,3,5 bzw. gar andere
Ports), dann muss es wirklich die Version von Markus oder Ingo sein.
Die wird aber wesentlich mehr Code produzieren, oder?
Ingo Less schrieb:> Das spiegel aber nicht den Wertebereich 0...7 wieder, wie vom TO verlangt.
Doch, weil die logische Negierung einer 0 in C den Wert 1 ergibt.
Oder so: !!123 == !!567 == 1
Und die logische Invertierung eines Werts ungleich 0 eben 0
!123 == !567 == 0
Lothar M. schrieb:> Doch, weil die logische Negierung einer 0 in C den Wert 1 ergibt.>> Oder so: !!123 == !!567 == 1
Ok, so tief hatte ich dann nicht gedacht... Wieder ein Grund für die
Lösung mit den if-Abfragen, da sieht man schneller was los is.
Eine eigene Frage?
Dieser Thread ist über 7 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.