www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik Pointer auf Bitspeicher

Autor: ynoel (Gast)
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?
Autor: Εrnst B✶ (ernst)
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)
Autor: Peter Dannegger (peda)
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
Autor: ynoel (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

Das große 51er Anwendungsbuch
7,95 €
statt 34,95 €
Alle Preise inkl. MwSt, zzgl. Versand

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net
Lade...