Forum: Mikrocontroller und Digitale Elektronik probleme mit bit-zugriff bei m16c


von jack (Gast)


Angehängte Dateien:

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

von jack (Gast)


Lesenswert?

hallo,
kennt den keiner dieses problem, daß beim bit-zugriff immer zwei
verschiede adressen benützt werden.

  jack

von ralf (Gast)


Lesenswert?

poste mal bitte den code, mit den bildern allein kann ich nix anfangen.

von A.K. (Gast)


Lesenswert?

Welchen Inhalt hat FB denn an fraglicher Stelle?

von jack (Gast)


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
}

von jack (Gast)


Angehängte Dateien:

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

von ralf (Gast)


Angehängte Dateien:

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

von jack (Gast)


Angehängte Dateien:

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

von jack (Gast)


Angehängte Dateien:

Lesenswert?

hallo,
bin fast am verzweifeln, finde nicht die lösung.
es wird einfach nicht korrekt übersetzt, glaube kaum das der fehler am
compiler ligt.
im anhang mal meine dateien, hier teil1.

   jack

von jack (Gast)


Angehängte Dateien:

Lesenswert?

teil2

   jack

von jack (Gast)


Angehängte Dateien:

Lesenswert?

teil3

  jack

von OldBug (Gast)


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;

von jack (Gast)


Angehängte Dateien:

Lesenswert?

hallo OldBug,
hat leider nichts gebracht auser fehler, siehe anhang

    jack

von OldBug (Gast)


Lesenswert?

In test2.c muss die test2.h noch inkludiert werden...

von jack (Gast)


Lesenswert?

hallo OldBug,
danke für die hilfe, leider das selbe problem wie oben, siehe anhang2.
beim aufruf der eingänge wird beim test von "if(in1 == 0)" auf eine
falsche adresse gesprungen (803h).

  jack

von jack (Gast)


Lesenswert?

hallo,
habe noch keine lösung gefunden, könnte bitte jemand das mal bei sich
probieren, glaube es liegt am compiler oder so (dateien siehe oben).
ich arbeite mit hew3 und pd30sim.

   jack

von ralf (Gast)


Angehängte Dateien:

Lesenswert?

hallo jack,

sorry für die wartezeit.
ich habbs 1:1 ausprobiert und es funktioniert problemlos.
eventuell hast du ein einstellungsproblem.
ist die hew vielleicht veraltet?

ralf

von jack (Gast)


Lesenswert?

hallo ralf,
danke für deinen test, es liegt an meiner hew3.
diese version war bei meinem starterkit dabei, schwache leistung von
renesas.

   jack

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.