mikrocontroller.net

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


Autor: jack (Gast)
Datum:
Angehängte Dateien:

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

Autor: jack (Gast)
Datum:

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

  jack

Autor: ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
poste mal bitte den code, mit den bildern allein kann ich nix anfangen.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Inhalt hat FB denn an fraglicher Stelle?

Autor: jack (Gast)
Datum:

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

Autor: jack (Gast)
Datum:
Angehängte Dateien:

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

Autor: ralf (Gast)
Datum:
Angehängte Dateien:

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

Autor: jack (Gast)
Datum:
Angehängte Dateien:

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

Autor: jack (Gast)
Datum:
Angehängte Dateien:

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

Autor: jack (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
teil2

   jack

Autor: jack (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
teil3

  jack

Autor: OldBug (Gast)
Datum:

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

Autor: jack (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hallo OldBug,
hat leider nichts gebracht auser fehler, siehe anhang

    jack

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In test2.c muss die test2.h noch inkludiert werden...

Autor: jack (Gast)
Datum:

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

Autor: jack (Gast)
Datum:

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

Autor: ralf (Gast)
Datum:
Angehängte Dateien:

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

Autor: jack (Gast)
Datum:

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

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.