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
hallo, kennt den keiner dieses problem, daß beim bit-zugriff immer zwei verschiede adressen benützt werden. jack
poste mal bitte den code, mit den bildern allein kann ich nix anfangen.
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 }
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
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
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
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
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;
hallo OldBug, hat leider nichts gebracht auser fehler, siehe anhang jack
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.