mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 3 poligen Dip Schalter am Attiny85 auslesen (binär)


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
2 lesenswert
nicht lesenswert
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.

Autor: Sebastian S. (amateur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;-)

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Sven A. (quotschmacher)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geht es etwas genauer, was das für ein schalter ist? 3polig hab ich ja 
schon verstanden, aber nicht was in welcher stellung wie verschaltet 
wird.

Autor: Michael R. (mr-action)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und Pin 2-4 sind welche Pins von welchem Port (steht im Datenblatt)?

Autor: Joachim B. (jar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: Peter D. (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mark schrieb:
> Angeschlossen an PIN 2-4,

Welche Bauform?
Bei SOIC ist 4 GND, bei QFN ist 4 DNC.

PB5..PB0 wäre eindeutig gewesen. Versuchs nochmal.

Autor: HildeK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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).

Autor: Joachim B. (jar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter D. schrieb:
> Welche Bauform?
> Bei SOIC ist 4 GND

beim DIP/DIL auch

: Bearbeitet durch User
Autor: HildeK (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Peter D. schrieb:
> bei QFN ist 4 DNC

Pin 3 auch. Aber wer solche Fragen stellen muss verarbeitet kein QFN 
:-).

Autor: Arduino Fanboy D. (ufuf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mark schrieb:
> Wie werte ich den am intelligentesten aus, so dass ich
> dessen Zustand binär in einer 3 Bit Variable habe?
uint8_t variable;
const uint8_t maske 0x0010101; //an deine Pins anpassen


//und später im Programm:

variable = PINB & maske; // zack, sind die 3 Bit in deiner Variablen.


Autor: Mark (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
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:
if ( !(PINB & (1<<SW1)))
...
if ( !(PINB & (1<<SW2)))
...
if ( !(PINB & (1<<SW3)))

Mir geht es darum die Werte in eine Variable zu bekommen, welche ich 
dann auf den Zustand überprüfen kann.

Autor: Ingo Less (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint8_t Dummy = 0;
if ( !(PINB & (1<<SW1)))
 Dummy |= 1;
if ( !(PINB & (1<<SW2)))
 Dummy |= 2;
if ( !(PINB & (1<<SW3)))
 Dummy |= 4;

// Mach was mit Dummy 

Autor: markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mache ich meistens so ähnlich wie hier:
#define READ_KEY1  (PINA & 1<<PORTA1)
#define READ_KEY2  (PINA & 1<<PORTA5)
#define READ_KEY3  (PINA & 1<<PORTA7)

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

Autor: Ingo Less (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
markus schrieb:
> mache ich meistens so ähnlich wie hier:
Das spiegel aber nicht den Wertebereich 0...7 wieder, wie vom TO 
verlangt.

Autor: Jens M. (schuchkleisser)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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?

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

: Bearbeitet durch Moderator
Autor: Ingo Less (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.