Pointer auf Bitspeicher

Gast #1374448
Lesenswert?

Hallo,

ich habe diverse Bitvariablen (Speicherbereich 0h-50h) und möchte diese 
gerne mithilfe einer Schleife nacheinander auf 1 setzen.
1
bit var1,var2,var3,...,var80;
Diese Variablen liegen im Bitaddressierbaren Bereich meines 
µControllers.
Nun habe ich schon allerhand ausprobiert aber bis auf
1
setb 0h
2
setb 1h
3
...
4
setb 50h
in ASM bin ich zu keiner Lösung gekommen (da bit nicht als pointer 
verwendet werden kann). (Platform: 8051 Architektur mit C-Compiler).

Weiß jemand von euch ob und wie das möglich ist?
#1374466
Lesenswert?

ist der bit-speicher nicht auch irgendwo in den byte-addressierbaren 
Bereich gemappt?

(Sorry, schon lang nichts meehr mit '51ern gemacht)

Edit: Schaut so aus. Einfach Byteweise den bereich 0x20 .. 0x2F im IDATA 
mit 0xFF beschreiben sollte alle Bitvariablen auf "true" setzen. 
(Ungetestet, probiers einfach mal aus)
#1375305
Lesenswert?

Bitpointer unterstützt C nicht.
Man kann sich aber entsprechende Funktionen schreiben, dann gehts:
1
/************************************************************************/
2
/*                                                                      */
3
/*                      Bit Pointer Implementation                      */
4
/*                                                                      */
5
/*                      SFR bits can not be accessed !                  */
6
/*                                                                      */
7
/*              Author: Peter Dannegger                                 */
8
/*                                                                      */
9
/************************************************************************/
10
#pragma cd
11

12
typedef unsigned char uchar;
13
typedef unsigned int uint;
14

15

16
#define BIT_START       0x20
17

18

19
static uint getibit( uchar bitptr )
20
{
21
  uchar code bitmask[] = { 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80 };
22
  return (uint)bitmask[bitptr & 7] << 8 |       // high byte = bit mask
23
         (uchar) (bitptr / 8 + BIT_START);      // low  byte = byte address
24
}
25

26

27
void setibit( uchar bitptr )                    // *bitptr = 1;
28
{
29
  uint mask_addr = getibit( bitptr );
30
  *(uchar idata *)mask_addr |= mask_addr >> 8;
31
}
32

33

34
void clribit( uchar bitptr )                    // *bitptr = 0;
35
{
36
  uint mask_addr = getibit( bitptr );
37
  *(uchar idata *)mask_addr &= ~(mask_addr >> 8);
38
}
39

40

41
void cplibit( uchar bitptr )                    // *bitptr ^= 1;
42
{
43
  uint mask_addr = getibit( bitptr );
44
  *(uchar idata *)mask_addr ^= mask_addr >> 8;
45
}
46

47

48
void movibit( uchar bitptr, bit inbit )         // *bitptr = inbit;
49
{
50
  inbit ? setibit( bitptr ) : clribit( bitptr );
51
}
52

53

54
bit tstibit( uchar bitptr )                     // return *bitptr;
55
{
56
  uint mask_addr = getibit( bitptr );
57
  return *(uchar idata *)mask_addr & mask_addr >> 8;
58
}


Peter

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