Forum: Mikrocontroller und Digitale Elektronik Pointer auf Bitspeicher


von ynoel (Gast)


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?

von Εrnst B. (ernst)


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)

von Peter D. (peda)


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

von ynoel (Gast)


Lesenswert?

Vielen Dank für die Antworten, die Lösung von Peter Dannegger ist genau 
was ich gesucht habe.

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.