Bits Prüfen ohne for-Schleife

Gast #2682024
Lesenswert?

im Tutorial zu Bitmanipulation
http://www.mikrocontroller.net/articles/Bitmanipulation
insbesondere Bits prüfen, kann mit dem Ausdruck
if(~tmp & 0x11)
geprüft werden, ob mind. 1 gelöscht ist.
Gibt es auch eine Möglichkeit raus zu bekommen, ob mind. 2 oder 3 oder 
auf ein Port gesehen mind. 7 Bits gelöscht sind?
MfG
Stefan
Gast #2682047
Lesenswert?

hey Leute,

was ich vorhabe ist recht simple, ich will an einem beliebigen port nur 
überprüfen, ob bei den ersten 5 Pins nur 1 Signal anliegt und wenn mehr 
als 1 signal mein if()-Abfrage das erkennt und auf printf ausgibt 
Fehler.
#2682053
Lesenswert?

Was ich meinte, könnte man etwa so schreiben:
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <stdint.h>
4

5
inline uint8_t anzahlBits5( uint8_t n )
6
{
7
  static uint8_t nBits[] =
8
    {
9
      0,  //   0b00000
10
      1,  //   0b00001
11
      1,  //   0b00010
12
      2,  //   0b00011
13
      1,  //   0b00100
14
      2,  //   0b00101
15
      2,  //   0b00110
16
      3,  //   0b00111
17
      1,  //   0b01000
18
      2,  //   0b01001
19
      2,  //   0b01010
20
      3,  //   0b01011
21
      2,  //   0b01100
22
      3,  //   0b01101
23
      3,  //   0b01110
24
      4,  //   0b01111
25
      1,  //   0b10000
26
      2,  //   0b10001
27
      2,  //   0b10010
28
      3,  //   0b10011
29
      2,  //   0b10100
30
      3,  //   0b10101
31
      3,  //   0b10110
32
      4,  //   0b10111
33
      2,  //   0b11000
34
      3,  //   0b11001
35
      3,  //   0b11010
36
      4,  //   0b11011
37
      3,  //   0b11100
38
      4,  //   0b11101
39
      4,  //   0b11110
40
      5,  //   0b11111
41
    };
42

43
  return nBits[n&0b11111];
44
}
45

46
int main()
47
{
48
  uint8_t i;
49
  for( i=0; i<32; ++i )
50
  {
51
    printf( "%2u hat %2u Bits\n", (unsigned)i, (unsigned)anzahlBits5(i) );
52
  }
53

54
  return 0;
55
}
Gast #2682059
Lesenswert?

:-)
das wollt ich so vermeiden, weil es geht mit der for-schleife oder so 
einen umständlichen ausdruck wie (bisschen abgewandelt)
if( (a==b) || (b==c) || (a==d) || etc.
und das für 5 pins durchgespielt ist hölle
#2682062
Lesenswert?

Stefan schrieb:
> hey Leute,
>
> was ich vorhabe ist recht simple, ich will an einem beliebigen port nur
> überprüfen, ob bei den ersten 5 Pins nur 1 Signal anliegt und wenn mehr
> als 1 signal mein if()-Abfrage das erkennt und auf printf ausgibt
> Fehler.

Stefan schrieb:
> das wollt ich so vermeiden, weil es geht mit der for-schleife oder so
> einen umständlichen ausdruck wie (bisschen abgewandelt)
> if( (a==b) || (b==c) || (a==d) || etc.
> und das für 5 pins durchgespielt ist hölle

ich sehe da jetzt keinen Zusammenhang, aber solange du ihn siehst, ist 
es gut :-)
Gast #2682073
Lesenswert?

Stefan schrieb:
> :-)
> das wollt ich so vermeiden, weil es geht mit der for-schleife oder so
> einen umständlichen ausdruck wie (bisschen abgewandelt)
> if( (a==b) || (b==c) || (a==d) || etc.
> und das für 5 pins durchgespielt ist hölle

aja, so ist das gemeint. wenn angenommen port a, dann soll sein:
if( (pa0==pa1) || (pa0==pa1) etc

also gucken, ob bei 2 pin gleichzeitig liegen signal vor
#2682074
Lesenswert?

Stefan schrieb:
> was ich vorhabe ist recht simple, ich will an einem beliebigen port nur
> überprüfen, ob bei den ersten 5 Pins nur 1 Signal anliegt und wenn mehr
> als 1 signal mein if()-Abfrage das erkennt und auf printf ausgibt
> Fehler.
Dann fragst du in einer Schleife die Bits nacheinander ab. Wenn es 1 
ist, zählst du einen Zähler hoch. Und wenn der am Ende >1 ist, ist die 
Fehlerbedingung erfüllt.

unsigned char nCt = 0;
unsigned char nTmp = PINC;

for (unsigned char nInd = 0; nInd < 5; nInd++)
{
  if((nTmp & (1 << nInd))) nCt++;
}
if (nCt > 1) printf("...");

> und das für 5 pins durchgespielt ist hölle
Deswegen in einer Schleife.

mfg.
Gast #2682084
Lesenswert?

Thomas Eckmann schrieb:

> Dann fragst du in einer Schleife die Bits nacheinander ab. Wenn es 1
> ist, zählst du einen Zähler hoch. Und wenn der am Ende >1 ist, ist die
> Fehlerbedingung erfüllt.
>
> unsigned char nCt = 0;
> unsigned char nTmp = PINC;
>
> for (unsigned char nInd = 0; nInd < 5; nInd++)
> {
>   if((nTmp & (1 << nInd))) nCt++;
> }
> if (nCt > 1) printf("...");
>
>> und das für 5 pins durchgespielt ist hölle
> Deswegen in einer Schleife.
>
> mfg.

ich wollten eigentlich ohne for-schleife (topic :-))
#2682196
Lesenswert?

Klaus Wachtler schrieb:

> Genau genommen, weiß ich immer noch nicht genau, was wirklich gefragt
> ist.

Die erste Formulierung fragte u.A. nach 7 Bits. Unter der Annahme, dass 
ein Byte gemeint war, lief das auf die "maximal 1 Bit gesetzt" Situation 
raus.

Später konkretisierte er es etwas. Etwas verallgemeinert bedeutet es, ob 
ein Subset von Portins - dort 5 - maximal ein gesetztes Bit enthält. Was 
zum Schema (var & (var - 1)) nur noch eine Ausblendung der ungefragten 
Pins hinzu fügt.
Gast #2683104
Lesenswert?

was er wollte, war doch nichts anderes, als bei dem genannten Portpin, 
bestehend aus genau 5 Pins, herauszufinden, ob zu jedem Zeitpunkt mehr 
als 2 Pins ein Signal bekommen. Falls ja, soll eine Fehlermeldung 
erscheinen, andernfalls soll was anderes geschehen. Was genau geht nicht 
hervor.

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