www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Pointer auf Bitspeicher


Autor: ynoel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht 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)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.