Forum: Mikrocontroller und Digitale Elektronik C Code für mein Projekt anpassen?


von 4017er (Gast)


Lesenswert?

Hallo,
ich würde gerne mein Looping Louie Spiel in etwa so tunen wie hier:

Beitrag "pimp my Looping Louie (mit Mikrocontroller & Zufall!)"

allerdings möchte ich ein paar Änderungen vornehmen.

So wie ich das sehe, gibt es bei einem Dip Switch mit sechs Schaltern 
insgesamt 12 Möglichkeiten, richtig?

00
01
10
11
etc.

Gibt es hier irgendwo ein Tutorial dazu, wie man so einen Dip Switch in 
C auswertet? Ich habe zwar den Code aus dem oben verlinkten Thema, aber 
so ganz wird mir das dadurch noch nicht..

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

4017er schrieb:
> So wie ich das sehe, gibt es bei einem Dip Switch mit sechs Schaltern
> insgesamt 12 Möglichkeiten, richtig?
> 00
> 01
> 10
> 11
Nein, es gibt 2^6 Möglichkeiten. Im Grunde also 64...
000000
000001
000010
000011
000100
000101
000110
000111
001000
001001
001010
001011
usw...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

4017er schrieb:
> Gibt es hier irgendwo ein Tutorial dazu, wie man so einen Dip Switch in
> C auswertet?
Womit bzw. worauf soll der ausgewertet werden? Da Einlesen ist z.B. von 
uC zu uC unterschiedlich. Und dann kommt esnoch drauf an, wie der 
DIP-Schwitz an den besagten uC angeschlossen ist. Du siehst: da sind 
noch Fragen offen...

von 4017er (Gast)


Lesenswert?

Lothar Miller schrieb:
> 4017er schrieb:
>> So wie ich das sehe, gibt es bei einem Dip Switch mit sechs Schaltern
>> insgesamt 12 Möglichkeiten, richtig?
>> 00
>> 01
>> 10
>> 11
> Nein, es gibt 2^6 Möglichkeiten. Im Grunde also 64...
> 000000
> 001011
> usw...

Oh...
Und wie kann man das in C auswerten? Finde kein einziges Tutorial dazu..

von 4017er (Gast)


Lesenswert?

Lothar Miller schrieb:
> 4017er schrieb:
>> Gibt es hier irgendwo ein Tutorial dazu, wie man so einen Dip Switch in
>> C auswertet?
> Womit bzw. worauf soll der ausgewertet werden? Da Einlesen ist z.B. von
> uC zu uC unterschiedlich. Und dann kommt esnoch drauf an, wie der
> DIP-Schwitz an den besagten uC angeschlossen ist. Du siehst: da sind
> noch Fragen offen...

Hallo,
in meinem verlinkten Thread z.B.
Wie wurde das dort gemacht?

von Peter II (Gast)


Lesenswert?

4017er schrieb:
> Oh...
> Und wie kann man das in C auswerten? Finde kein einziges Tutorial dazu..

wo ist genau dein Problem damit? Man kann es genauso wie jeden Taster 
oder
Schalter einlesen.

Wenn die DIP gleich sinnvoll an einen Port angeschlossen ist, kann man 
einfach den wert direkt verwenden  - für was braucht man da noch ein 
Tutorial?

von 4017er (Gast)


Lesenswert?

Ich habe mich vielleicht etwas undeutlich oder falsch ausgedrückt. 
Entschuldigung.

Im Code vom mir verlinkten Thema steht z.B.
1
** \name DIP-switch settings
2
 * \brief The different modes selectable with the DIP switches
3
 */
4
//@{
5
#define GAME_MODE_SLOW    0 << 0 ///< DIP1..2 = 00 (booooring)
6
#define GAME_MODE_FAST    1 << 0 ///< DIP1..2 = 10 (not soo boring)
7
#define GAME_MODE_RANDOM  2 << 0 ///< DIP1..2 = 01 (magic :) )
8
#define GAME_MODE_RANDOM_STOP  3 << 0 ///< DIP1..2 = 11 (more magic :) )
9
#define LED_MODE_OFF    0 << 2 ///< DIP3..4 = 00
10
#define LED_MODE_ON    1 << 2 ///< DIP3..4 = 10
11
#define LED_MODE_RAND    2 << 2 ///< DIP3..4 = 01
12
#define REMOTE_MODE_25    0 << 4 ///< DIP5..6 = 00 
13
#define REMOTE_MODE_50    1 << 4 ///< DIP5..6 = 10
14
#define REMOTE_MODE_75    2 << 4 ///< DIP5..6 = 01
15
#define REMOTE_MODE_100    3 << 4 ///< DIP5..6 = 11
16
//@}

Gibt es dafür eine Erklärung? Also wie genau das funktioniert?

von Max H. (hartl192)


Lesenswert?

4017er schrieb:
> Und wie kann man das in C auswerten? Finde kein einziges Tutorial dazu..
Ich würde sie an bit 0 bis 5 einen Ports hängen und dann ungefähr so 
abfragen:
1
switch(PORTx & 0x3F) {
2
  case 0:
3
  //.....
4
  case 1:
5
  //.....
6
7
  // ...
8
  case 63:
9
  //.....
10
}
Noch besser wäre es den Cases mit #define oder enum sprechende Namen zu 
geben.


Edit:
4017er schrieb:
> Im Code vom mir verlinkten Thema steht z.B.
Defines sind reine Textersetzung. Überall wo im Code "REMOTE_MODE_100" 
steht wird es dann vom Präprzessor durch "3 << 4" ersetzt.

3 << 4 entspricht 3 bitweise um 4 nach rechts verschoben:

3    = 0b00000011
3<<4 = 0b00110000

> Gibt es dafür eine Erklärung? Also wie genau das funktioniert?
Was mit den Werten dann passiert musst du an der jeweiligen Stelle im 
Code nachsehen.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

4017er schrieb:
> in meinem verlinkten Thread z.B. Wie wurde das dort gemacht?
Ok, mal angenommen, du hast dir den Code dort mal angesehen und 
verstehst aus irgendwelchen Gründen nur Bahnhof, dann könntest du es wie 
folgt probieren.
Da gibt es Definitionen im Quelltext, in denen der Begriff DIP vorkommt:
1
/** \name DIP-switch settings
2
 * \brief The different modes selectable with the DIP switches
3
 */
4
//@{
5
#define GAME_MODE_SLOW    0 << 0 ///< DIP1..2 = 00 (booooring)
6
#define GAME_MODE_FAST    1 << 0 ///< DIP1..2 = 10 (not soo boring)
7
#define GAME_MODE_RANDOM  2 << 0 ///< DIP1..2 = 01 (magic :) )
8
#define GAME_MODE_RANDOM_STOP  3 << 0 ///< DIP1..2 = 11 (more magic :) )
9
#define LED_MODE_OFF    0 << 2 ///< DIP3..4 = 00
10
#define LED_MODE_ON    1 << 2 ///< DIP3..4 = 10
11
#define LED_MODE_RAND    2 << 2 ///< DIP3..4 = 01
12
#define REMOTE_MODE_25    0 << 4 ///< DIP5..6 = 00 
13
#define REMOTE_MODE_50    1 << 4 ///< DIP5..6 = 10
14
#define REMOTE_MODE_75    2 << 4 ///< DIP5..6 = 01
15
#define REMOTE_MODE_100    3 << 4 ///< DIP5..6 = 11
Und jetzt musst du nur noch nach GAME_MODE_SLOW suchen und findest das 
hier:
1
  if(getGameMode() == GAME_MODE_SLOW) { // boooring
Nächster Schritt: getGameMode suchen:
1
#define getGameMode()    ((~PINB) & 3)
Aha, ein define! Ergo steht dort im Quelltext eigentlich:
1
  if(((~PINB) & 3) == 1 << 0) { // boooring
Das bedeutet letztlich nichts Anderes als:
1
  if( (~PINB)&3 == 1 ) { // boooring
Und schon weißt du, wie dieser DIP-Schalter eingelesen wird.

: Bearbeitet durch Moderator
von Kalaus (Gast)


Lesenswert?

Peter II schrieb:
> 4017er schrieb:
>> Oh...
>> Und wie kann man das in C auswerten? Finde kein einziges Tutorial dazu..
>
> wo ist genau dein Problem damit? Man kann es genauso wie jeden Taster
> oder
> Schalter einlesen.

Mit HW- oder SW-Entprellung und wenn SW-Entprellung, welche? Maaan, man, 
man.

>
> Wenn die DIP gleich sinnvoll an einen Port angeschlossen ist, kann man
> einfach den wert direkt verwenden  - für was braucht man da noch ein
> Tutorial?

Deine Antwort braucht man auch nicht, sowenig wie meine.

von Peter II (Gast)


Lesenswert?

Kalaus schrieb:
> Peter II schrieb:
>> 4017er schrieb:
>>> Oh...
>>> Und wie kann man das in C auswerten? Finde kein einziges Tutorial dazu..
>>
>> wo ist genau dein Problem damit? Man kann es genauso wie jeden Taster
>> oder
>> Schalter einlesen.
>
> Mit HW- oder SW-Entprellung und wenn SW-Entprellung, welche? Maaan, man,
> man.

das ist von der Anwendung abhängig, wenn man den DIP nur beim starten 
einliest braucht man keine Entprellung.
in dem meisten Fälle wird man auch so auf eine Entprellung verzichten 
können, weil man ja keine schritte oder ähnliches damit startet.

> >
> > Wenn die DIP gleich sinnvoll an einen Port angeschlossen ist, kann man
> > einfach den wert direkt verwenden  - für was braucht man da noch ein
> > Tutorial?
> Deine Antwort braucht man auch nicht, sowenig wie meine.
1
wert = DIP_PORT
2
if ( wert == 1 ) {
3
   };
4
if ( wert > 1 && wert < 10 ) 
5
   };

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.