Konfigurationsschalter auf Platine verdreht, Software Korrektur

Gast #2905608
Lesenswert?

Guten morgen,

ich lese einen Konfigurationsschalter (DIP Schalter 4 polig) in meinen 
Atmega88 ein. Der Schalter hängt an Port C und zwar genauer gesagt an 
PC0 bis PC3.
Nun ist mir ein kleiner Lapsus unterlaufen. Eigentlich sollte Schalter 1 
an PC0, Schalter 2 an PC1, usw.
Leider ist mir beim routen der Leiterplatte passiert, dass der DIP 
Schalter 180° gedreht ist, d.h. Schalter 4 hängt nun an PC0, Schlter 3 
an PC1, etc. Klar man kann diesen gedreht einlöten, aber dann stünde er 
im eingebauten Zustand auf dem Kopf --> unschön.

Wenn ich jetzt den Schalter einlese erhalte ich statt 1 den Wert 15, 
statt 2 den Wert 8 usw.

Gibt es eine geschickte Möglichkeit das in der Software zu korrigieren?

Mir fällt nur ein, das ganze zwischen zu speichern, jedes Bit einzeln zu 
maskieren (also 4x) und entsprechend seiner Stelle links zu schieben (um 
es an die richtige Stelle zu rücken) und dann in der eigentlichen 
Variable zu verodern. Das wäre dann im Prinzip 4x maskieren, 4x schieben 
und 4x verodern.

Geht das irgendwie "trickreicher".

Besten Dank.

VG
Sven
Gast #2905656
Lesenswert?

Wenn man die Software so schreibt, dass es egal ist, macht das die Sache 
aber auch einfacher
1
#define PIN-SCHALTER PINC
2
#define SCHALTER1 (1<<0)
3
#define SCHALTER2 (1<<1)
4
#define SCHALTER3 (1<<2)
5
#define SCHALTER4 (1<<3)

und jetzt, weil falsch verdrahtet:
1
#define PIN-SCHALTER PINC
2
#define SCHALTER1 (1<<3)
3
#define SCHALTER2 (1<<2)
4
#define SCHALTER3 (1<<1)
5
#define SCHALTER4 (1<<0)

im Code selber dann nur
1
if (PIN_SCHALTER & SCHALTER1) AktionFuerSchalter1();
2
if (PIN_SCHALTER & SCHALTER2) AktionFuerSchalter2();
3
.
4
.
5
.

da kannste sogar mit verschiedenen Make-Files arbeiten und beide 
Hardware-Configs durch ein flag unterscheiden, braucht keine Verwaltung 
unterschiedlicher Programmcodes:
1
#ifdef CONF1
2
    //Hier Konfig1, siehe oben
3
#ELSIF
4
    //hier Konfig2, siehe oben
5
#ENDIF
Gast #2906535
Lesenswert?

Michael schrieb:
> #define PIN-SCHALTER PINC
> #define SCHALTER1 (1<<0)
> #define SCHALTER2 (1<<1)
> #define SCHALTER3 (1<<2)
> #define SCHALTER4 (1<<3)
>
> und jetzt, weil falsch verdrahtet:#define PIN-SCHALTER PINC
> #define SCHALTER1 (1<<3)
> #define SCHALTER2 (1<<2)
> #define SCHALTER3 (1<<1)
> #define SCHALTER4 (1<<0)
>
> im Code selber dann nurif (PIN_SCHALTER & SCHALTER1) AktionFuerSchalter1();
> if (PIN_SCHALTER & SCHALTER2) AktionFuerSchalter2();
> .
> .
> .

Diese Lösung ist einfach, lesbar, übertragbar, flexibel,..... ==> also 
absolut ungeeignet. Das passt einfach nicht in unstrukturierten 
SpagettiCode.

Rufus Τ. Firefly schrieb:
> Noch viel einfacher aber ist es, einfach die Dokumentation des Schalters
> anzupassen ...

PSSTTT verrate doch nicht alle Tricks, Wie soll man denn so den Kunden 
noch klarmachen wie viel Geld man für die Arbeit haben will.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren