C Code für mein Projekt anpassen?

Gast #3982527
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..
Moderator (Firma: Titel) Persönliche Seite #3982550
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...
Gast #3982554
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?
Gast #3982564
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?
#3982565
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.
Moderator (Firma: Titel) Persönliche Seite #3982577
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.
Gast #3982584
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.
Gast #3982591
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
   };

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