Forum: Mikrocontroller und Digitale Elektronik Codierschalter abfragen


von Gerry (Gast)


Lesenswert?

Hallo zusammen,

ich verzweifel gerade daran einen Codierschalter abzufragen. Hier das 
Datenblatt des Schalters:

http://www.produktinfo.conrad.com/datenblaetter/700000-724999/705400-da-01-ml-Printcodierschalter_P60A_701_de_en.pdf

Der Schalter ist an einem ATTiny45 an PB0-3 angeschlossen.

Je nach Stellung des Schalters soll PB4 unterschiedlich lange auf High 
geschaltet sein. Das ganze Timing funktioniert auch schon.

Allerdings klappt die Abfrage des Schalters noch nicht. Einzelne 
Einstellungen alleine funktionieren, aber nicht alle zusammen.

So habe ich es bisher versucht:
1
  DDRB = 0b00010000;
2
  PORTB = 0b00010000;
3
4
  uint8_t end = 0;
5
6
  if (PINB & 0x01) {
7
    end = 5;
8
  } else if (PINB & 0x02) {
9
    end = 10;
10
  } else if (PINB & 0x03) {
11
    end = 15;
12
  } else if (PINB & 0x04) {
13
    end = 20;
14
  } else if (PINB & 0x05) {
15
    end = 25;
16
  } else if (PINB & 0x06) {
17
    end = 30;
18
  } else if (PINB & 0x07) {
19
    end = 35;
20
  } else if (PINB & 0x08) {
21
    end = 40;
22
  } else if (PINB & 0x09) {
23
    end = 45;
24
  }
25
 
26
  while (1) {
27
  ...
28
  }

Leider überschreiben sich die Abfragen irgendwie gegenseitig.

Kann mir vielleicht jemand weiterhelfen? Ist bestimmt eigentlich eine 
einfache Sache, aber ich komm grad echt nicht weiter.

Vielen Dank.

Gruß, Gerry

von pegel (Gast)


Lesenswert?

BCD einlesen und mal 5 nehmen :)

von Oliver J. (skriptkiddy)


Lesenswert?

versuchs mal mit
1
  end=(PINB&0x0f)*5;

von Tim R. (vref)


Lesenswert?

Wenn du deine "&" Operationen durch "==" ersetzt dürfte es sogar mit 
deinem etwas umständlich anmutenden Code funktionieren.

Eleganter ist definitiv der Code von Script Kiddy ;-)

Denke mal nach, auf welche Schalterstellungen z.B. "if (PINB & 0x01)" 
überall zutrifft...

von Peter D. (peda)


Lesenswert?

Gerry schrieb:
> Allerdings klappt die Abfrage des Schalters noch nicht.

Pullups nicht eingeschaltet bzw. keine Pulldowns angeschlossen.

Es gibt keinen Logikpegel "Pin offen", sondern nur 0V und 5V und einer 
von beiden muß angelegt werden.


Peter

von Achim M. (minifloat)


Lesenswert?

Peter Dannegger schrieb:
> Pullups

und Common-Pin des Schalters an Masse
1
end = ((~PINB) & 0x0F ) * 5;
mfg mf

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.