Bits Prüfen ohne for-Schleife

Gast #2682024
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
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
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
}
#2682057
Eine andere Möglichkeit, wäre passende logische Ausdrücke zu bauen.
1
inline uint8_t anzahlBits5( uint8_t n )
2
{
3
  return ( n&0b00001 != 0 ) + ( n&0b00010 != 0 ) + ( n&0b00100 != 0 ) + ( n&0b01000 != 0 ) + ( n&0b10000 != 0 );
4
}
Gast #2682059
:-)
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
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 #2682065
ein freund sagt, ich muss jeden pin untereinander prüfen und die 
untereinander prüfen. ich glaub du hast recht, der letzt post klappt 
nicht so wie ich das gedacht hab.
Gast #2682073
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
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 #2682075
1
switch (PORTxy){
2
  case 0x01:
3
  case 0x02:
4
  case 0x04:
5
  case 0x08:
6
  case 0x10:
7
  case 0x20:
8
  case 0x40:
9
  case 0x80:
10
    printf ("Ok!");
11
  break;
12
  default
13
    printf ("Ko!");
14
}
Gast #2682084
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 :-))
Gast #2682097
A. K. schrieb:
> Liebe Güte macht ihr das kompliziert... Nu ist schon fast alles da,
> Tabelle, Schleife, Switch-Statement. Fehlt eigentlich nur noch jemand,
> der es auf den Logarithmus zurückführt. ;-)

haha, du weißt:
wer sagen a muss auch sagen b
#2682190
A. K. schrieb:
> Das hatte ich bereits. Das war aber so kurz und offenbar viel zu
> einfach, dass es niemand zur Kenntnis nahm.

doch, doch - nur war mir lange Zeit nicht klar, ob es wirklich um 7 bzw. 
1 Bit geht, oder andere Kombinationen.
Genau genommen, weiß ich immer noch nicht genau, was wirklich gefragt 
ist.
#2682196
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.