probleme mit bit-zugriff bei m16c

Gast #206210
Lesenswert?

hallo,
habe für den zugriff auf bit-ebene ein struct angelegt für den zugriff
auf einzelne bit.
habe das ganze dann im pd30sim simuliert und muste feststellen, dass
beim zurgriff auf die bit unterschiedliche adressen verwendet werden.
z.bsp.: wird "in1 = 0" übersetzt in "and.b #feh, 0103h" dies wäre
ja korrekt, da mein struct auf adresse 0103h angelegt ist.
aber an anderer stelle wird der selbe ausdruck in
"bclr 0, -2h[fb] übersetzt und das ist eine ganz andere adresse.
was kann ich nun machen damit ich immer auf das richtige bit zugreife?

  jack
Angehängte Dateien:
Gast #206214
Lesenswert?

hallo,
hier mein code:


  struct {
    char  b0:1;
    char  b1:1;
    char  b2:1;
    char  b3:1;
    char  b4:1;
    char  b5:1;
    char  b6:1;
    char  b7:1;
    char  b8:1;
    char  b9:1;
    char  b10:1;
    char  b11:1;
    char  b12:1;
    char  b13:1;
    char  b14:1;
    char  b15:1;
    }in;
#define in1  in.b0
#define in2  in.b1

  struct {
    char  b0:1;
    char  b1:1;
    char  b2:1;
    char  b3:1;
    char  b4:1;
    char  b5:1;
    char  b6:1;
    char  b7:1;
    char  b8:1;
    char  b9:1;
    char  b10:1;
    char  b11:1;
    char  b12:1;
    char  b13:1;
    char  b14:1;
    char  b15:1;
    }out;

#define out1  out.b0
#define out2  out.b1

unsigned short T1;
unsigned short T2;
unsigned char i;
unsigned char a;
unsigned char b;
unsigned short c;

unsigned int count = 20000;


extern void eingang(void);
unsigned short Berechne(unsigned char  x, unsigned char y);

void main(void)
{
  #include "test2.h"

    prc1 = 1;                       /* enable access to processor mode
registers */
    pm20 = 0;                       /* 2 wait states for sfr
access...this is the reset value
                                       necessary for >16Mhz operation,
can be set to 1 wait for <=16Mhz */
    prc1 = 0;                       /* disable access to processor mode
registers */

    /* configure and switch main clock to PLL at 20MHz */
    prc0 = 1;                       /* enable access to clock registers
*/
    cm1 = 0x20;                     /* set to hi-drive Xin, divide by 1
*/
    cm0 = 0x08;                     /* set to main clock using divide
by 1 */
    cm21 = 0;                       /* switch to Xin */
    plc0 = 0x11;                    /* configure PLL to x2 */
    plc0 = 0x91;                    /* enable PLL */
    while(count > 0) count--;       /* wait for PLL to stabilize (20mS
maximum, 200,000 cycles @10Mhz)
                                       this decrement with no
optimization is 12 cycles each (20,000*12 cycles=240,000=24mS) */
    cm11 = 1;                       /* switch to PLL */
    prc0 = 0;                       /* disable access to clock
registers */

  prc1 = 1;
  pm10 = 1;    // enable data flash area
  prc1 = 0;

  a = 100;
  b = 20;
  in1 = 1;
  in2 = 1;
  in1 = 0;
  in2 = 0;
for(;;)
{
  for(T1=0;T1<0xffff;T1++)
  {
    for(T2=0;T2<0xffff;T2++)
    i++;
    if(i==100)
    i=0;
    if(p6_0 == 1)
    p6_0 = 0;
    else
    p6_0 = 1;
    eingang();
  }
}
}

void eingang(void)
{
  if(in1 == 0)
  {
    in1 = 1;
    out1 = 0;
    out2 = in1;
  }
  else
  {
    in1 = 0;
    out1 = 1;
    out2 = in1;
  }



in der speicherstelle [FB] erscheint eben je nach befehl der Wert

  jack
}
Gast #206215
Lesenswert?

hallo,
habe das nochmals etwas anderes probiert komme aber nicht weiter.
auszug aus programm:  (wird übersetzt siehe anhang)

volatile char reg1;
#define r1    0
#define r2    1
#define r3    2
#define r4    3


  if((CHECKBIT(reg1, r1)))     //& (CHECKBIT(reg1, r2)))
  {
    SETBIT(reg1, r1);
  }
  else
  {
    CLEARBIT(reg1, r1);
  }

es wird aber immer nur die zeile CLEARBIT(reg1, r1) angesprungen.
komme einfach nicht mehr weiter, hat jemand eine idee?

   jack
Angehängte Dateien:
Gast #206216
Lesenswert?

also deine erste version funktioniert problemlos, d.h. der syntax
ist schonmal ok (programming manual nov 12., 2001; seite 94).

ne frage, funktioniert das bei dir nicht, oder störst du dich an
den vom compiler erzeugten code? (im sinne von nicht verstehen)

indirekte adressierung wäre dann das stichwort.


ralf
Angehängte Dateien:
Gast #206217
Lesenswert?

hallo ralf,
danke für die hilfe, es funktioniert fast.
hatte einen fehler beim einbinden meiner header-datei.
habe nun noch ein kleines problem, wenn ich das ganze in einer datei
schreibe und übersetze, läuft es korrekt (so wie bei dir).
schreibe ich das ganze in 3dateien (eingang.c, test2.h und test2.c)
wird das ganze nicht korrekt übersetzt siehe Anhang (erstes bild ist
die korrekte übersetzung mit einer datei, 2übersetzung aufgeteil auf
3dateien). achte auf die übersetzung des ausdruckes if(in1 == 0), wird
nicht gleich übersetzt (adresse ist unterschiedlich) und funktioniert
beim test auch nicht.

  danke
   jack
Angehängte Dateien:
Gast #206221
Lesenswert?

Ich vermute da einen Seiteneffekt des Optimierers.

Probiers mal so:

in test2.h:

typedef struct ioport_s {
  charb0:1;
  char b1:1;
  char b2:1;
  char b3:1;
  char b4:1;
  char b5:1;
  char b6:1;
  char b7:1;
  char b8:1;
  char b9:1;
  char b10:1;
  char b11:1;
  char b12:1;
  char b13:1;
  char b14:1;
  char b15:1;
} ioport_t;

extern volatile ioport_t in;
extern volatile ioport_t out;

Anstelle der beiden struct-Konstrukte in test2.c:

volatile ioport_t in;
volatile ioport_t out;

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