3 poligen Dip Schalter am Attiny85 auslesen (binär)

Moderator (Firma: Titel) Persönliche Seite #5969969
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.
Gast #5970049
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).
Gast #5970075
Mark schrieb:
> Wie werte ich den am intelligentesten aus, so dass ich
> dessen Zustand binär in einer 3 Bit Variable habe?
1
uint8_t variable;
2
const uint8_t maske 0x0010101; //an deine Pins anpassen
3

4

5
//und später im Programm:
6

7
variable = PINB & maske; // zack, sind die 3 Bit in deiner Variablen.
Gast #5970079
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.
Gast #5970087
1
uint8_t Dummy = 0;
2
if ( !(PINB & (1<<SW1)))
3
 Dummy |= 1;
4
if ( !(PINB & (1<<SW2)))
5
 Dummy |= 2;
6
if ( !(PINB & (1<<SW3)))
7
 Dummy |= 4;
8

9
// Mach was mit Dummy
Gast #5970090
mache ich meistens so ähnlich wie hier:
1
#define READ_KEY1  (PINA & 1<<PORTA1)
2
#define READ_KEY2  (PINA & 1<<PORTA5)
3
#define READ_KEY3  (PINA & 1<<PORTA7)
4

5
unit8_t InputStates = (!READ_KEY3 << 2) | (!READ_KEY2 << 1) | !READ_KEY1;

dann irgendwas mit InputStates machen.

kann man bestimmt eleganter programmieren, ist aber einfach verständlich 
für mich und flexibel einsetzbar.

Gruss
#5970105
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?
Gast #5970116
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.

Antwort schreiben

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.

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.