-
Wenn er i von Null bis 500 zählt, kommt er bei bei drei und zwei auch nur einmal vorbei.
Code:
if (P2<=0x0080)
// das klappt nur, wenn niemand sonst in P2 was setzt. das tut aber zwei()
// daher ist P2 immer größer
P2=P2<<1; // hier verschiebst du auch das Muster von zwei() mit
else
P2=0x0001; // und hier würdest du es sogar löschen
// deswegen hab' ich das so gemacht, daß die Sub's jeder ihr eigenes Muster haben, und erst wenn sie fertig geschoben haben, wird es in P2 reingemischt
-
in dem programm was ich vorher geschrieben habe sind die funktionen 2 und drei kommentare markiert.
d.h es besteht nur die funktion "erste" und "softdelay"
was mich aber stört ist dass überhaupt keine reaktion in der simulation zu sehen ist somit wußte ich auch nicht was falsch sein könnte.
ist es möglich dass P2 in der ersten funktion imnmer den wert vergißt weil es die funktion immer verläßt und somit der wert gelöscht wird
-
Vergessen sollt er nix, P2 ist ja ein Ausgaberegister, das verschwind' nicht.
Eigentlich müßt' er schon bist 500 zählen und dann erste() aufrufen.
Überprüf mal, ob er i auch wirklich raufzählt und setz dann bei (i == eins)
einen Breakpoint und laß ihn laufen
-
die erste funktion habe ich mal hinbekommen
nur mich interessiert jetzt wirklich wieso es beim ersten programm läuft und beim zweiten nicht.
mit breakpoints kenne ich mich nicht aus.
Code:
#define eins 500
void softdelay();
void erste();
static unsigned int patt1=0x0001;
void main(void)
{
DP2= 0xFFFF;
while(1)
{
int i=0;
for(i=0; i<=1000; i++)
{
if(eins%i)
erste();
softdelay();
}
}
}
void erste(void)
{
if (patt1<=0x0070)
patt1= patt1<<1;
else
patt1=0x0001;
P2=patt1;
}
void softdelay()
{
unsigned long j=0;
for (j=0; j<500000; j++)
{};
}
2.tes
Code:
#define eins 500
void softdelay();
void erste();
void main(void)
{
DP2= 0xFFFF;
while(1)
{
int i=0;
for(i=0; i<=1000; i++)
{
if(eins%i)
erste();
softdelay();
}
}
}
void erste(void)
{
if (P2<=0x0070)
P2= P2<<1;
else
P2=0x0001;
}
void softdelay()
{
unsigned long j=0;
for (j=0; j<500000; j++)
{};
}
-
das solltest du umdrehen "der rest von i / eins" willst du ja haben
if ( i % eins)
Vielleicht kann er P2 garnicht shiften, weil's ein IO-Register ist. Sollte aber auch nicht sein.
tja ?
-
hallo
wie kann ich diese bitfolge am port ausgeben
0x8000
0x0000
0x8000
0x0000
-
sieht aus wie toggeln mit dem 2^^15 Bit
Port ^= 0x8000; // toggeln (Bit umdrehen)
-
jetzt funktioniert das programm
picnick ich danke dir für deine hilfe
was macht aber genau diese ^ Funktion
-
Genau heißt das Statement
Port = Port XOR 0x8000
Exklusiv Oder, ergibt 1, wenn die Operanden verschieden sind
0 xor 0 ---> 0
1 xor 0 ---> 1
0 xor 1 ---> 1
1 xor 1 ---> 0
-
'^' steht in C für exclusive-or.
Eigentlich sollte gar nix gehen, weil "eins % i" beim ersten Durchlauf zu "eins % 0" auswertet, und das ist nicht definiert. Jedenfalls hast du kein definiertes Ergebnis oder läufts auf ne trap.