Datum:
Hallo, ich habe diverse Bitvariablen (Speicherbereich 0h-50h) und möchte diese gerne mithilfe einer Schleife nacheinander auf 1 setzen.
bit var1,var2,var3,...,var80; |
Diese Variablen liegen im Bitaddressierbaren Bereich meines µControllers. Nun habe ich schon allerhand ausprobiert aber bis auf
setb 0h setb 1h ... 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?
Datum:
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)
Datum:
Bitpointer unterstützt C nicht.
Man kann sich aber entsprechende Funktionen schreiben, dann gehts:
/************************************************************************/ /* */ /* Bit Pointer Implementation */ /* */ /* SFR bits can not be accessed ! */ /* */ /* Author: Peter Dannegger */ /* */ /************************************************************************/ #pragma cd typedef unsigned char uchar; typedef unsigned int uint; #define BIT_START 0x20 static uint getibit( uchar bitptr ) { uchar code bitmask[] = { 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80 }; return (uint)bitmask[bitptr & 7] << 8 | // high byte = bit mask (uchar) (bitptr / 8 + BIT_START); // low byte = byte address } void setibit( uchar bitptr ) // *bitptr = 1; { uint mask_addr = getibit( bitptr ); *(uchar idata *)mask_addr |= mask_addr >> 8; } void clribit( uchar bitptr ) // *bitptr = 0; { uint mask_addr = getibit( bitptr ); *(uchar idata *)mask_addr &= ~(mask_addr >> 8); } void cplibit( uchar bitptr ) // *bitptr ^= 1; { uint mask_addr = getibit( bitptr ); *(uchar idata *)mask_addr ^= mask_addr >> 8; } void movibit( uchar bitptr, bit inbit ) // *bitptr = inbit; { inbit ? setibit( bitptr ) : clribit( bitptr ); } bit tstibit( uchar bitptr ) // return *bitptr; { uint mask_addr = getibit( bitptr ); return *(uchar idata *)mask_addr & mask_addr >> 8; } |
Peter
Datum:
Vielen Dank für die Antworten, die Lösung von Peter Dannegger ist genau was ich gesucht habe.