PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : fehlerproblem



ich bins
29.09.2005, 18:27
hallo
ich habe hier einen code geschrieben, jedoch in der 19 zeile zeigt er einen fehler wegen syntax an ';'
ich komm einfach nicht auf den fehler


#include <reg167.h>

#define eins 200;
#define zwei 100;
#define drei 50;

void softdelay (unsigned int);


void main (void)
{
unsigned int i;

DP2=0xFFFF;

for (i=0x0000; i<=0x00FF; i++)
{
P2=i;
softdelay(eins);

}
}


void softdelay(unsigned int zeit)
{
int i;
int j;

for (i=0; i<zeit; i++)
for (j=0; j <2000; j++)
{};
}



mfg

PicNick
29.09.2005, 18:32
DP2=0xFFFF;

for (i=0x0000; i<=0x00FF; i++)
{
P2=i; // soll das vielleicht DP2 heissen ?
softdelay(eins);

}

ich bins
29.09.2005, 18:35
nein

mit DP2 habe ich das ports als ausgang definiert und
p2 sind die ausgangspins

PicNick
29.09.2005, 18:52
softdelay((unsigned int) eins);
Gut. Probier das

ich bins
29.09.2005, 18:55
danke für deine hilfe aber funktioniert auch nicht

vielleicht sollte ich auch noch erwähnen dass das in keil programmiert ist für einen c167

PicNick
29.09.2005, 19:00
C mässig sollt das wurst sein.
Aber stelle bitte das Error listing und ggf. die source rein. das da ist momentan blindflug

PicNick
29.09.2005, 19:02
Hopperla:

#define eins 200;

define mit strichpunkt ist eher falsch . lass sie da weg

ich bins
29.09.2005, 19:03
compiling lauflicht.c...
LAUFLICHT.C(19): error C25: syntax error near ';'
lauflicht.c - 1 Error(s), 0 Warning(s).

ich bins
29.09.2005, 19:04
du hast es erraten
danke

ich bins
01.10.2005, 12:25
hallo

ich bin wieder auf ein problem gestoßen, und zwar:

meine drei funktionen sollten parallel laufen (jede funktion gleichzeitig), jedoch laufen die sequentiell ab. wie könnte ich dieses problem lösen.

und bei meiner ersten funktion wenn ich die for-schleife weglasse startet es am NULLTEN- BIT aber wenn ich die for- schleife dazugebe startet es am ERSTEN- BIT.
jedoch wenn ich hinschreibe "P2=0x0000" dann läuft es überhaupt nicht.

was könnte das sein.

danke im vorhinein
mfg




#include <reg167.h>

#define eins 2000
#define zwei 100
#define drei 50

void softdelay (unsigned int);
void erstes();
void zweites();
void drittes();

sbit port15= P2^15;

void main(void)
{
while(1)
{
DP2=0xFFFF;
erstes();
zweites();
drittes();
}
}




void erstes (void)
{
unsigned int i;

P2=0x0001;
for (i=0; i<7;i++)
{
P2=P2<<1;
softdelay(eins);
}
}


void zweites(void)
{
unsigned int i;

P2=0x0100;
for (i=0; i<6;i++)
{
P2=P2<<1;
softdelay(zwei);
}

for (i=0; i<6; i++)
{
P2= P2>>1;
softdelay(zwei);
}
}


void drittes(void)
{
port15=1;
softdelay(drei);
port15=0;
softdelay(drei);
}



void softdelay(unsigned int zeit)
{
int i,j;

for (i=0; i<zeit; i++)
for (j=0; j <2000; j++)
{};
}

PicNick
01.10.2005, 13:49
Was ist das P2 eigentlich ? Du verwendest es, als hätte es 16 Bit ?

ich bins
01.10.2005, 17:35
P2 => Port2

und es hat auch 16bit

PicNick
01.10.2005, 18:49
Schau, schau, sieh an.
Und was meinst du mit "gleichzeitig" ? die einen 8 Bit sollen ihre Lauflichter gleichzeitig (und unabhängig) mit den anderen 8 Bit machen ?

ich bins
01.10.2005, 19:03
hallo

was meinst du mit schau schau sieh an.

der code hat drei funktionen

1. lauflicht vorwärts
2. lauflicht vorwärts und rückwärts mit
3. led blinken

im programm läuft es so ab dass zuerst die erste dann die zweite und dann die dritte funktion ausgeführt wird.

jedoch sollen die funktionen unäbhängig von den anderen ausgeführt werden d.h. alle drei funktionen gleichzeitig jede für sich

ceekay
01.10.2005, 21:28
Soweit ich informiert bin ist das nicht möglich.
Du hast nur einen Prozessor und der kann immer nur eine Sache gleichzeitig machen.

Du kannst also die Funktionen nur nacheinander ablaufen lassen.

Aber das geht ja so rasend schnell das du es gar nicht mitbekommst. Wo liegt denn das Problem wenn sie nacheinander ablaufen?

Also wenn ich mir die Auflistung so anschaue, dann frag ich mich warum die gleichzeitig ablaufen sollen? gleichzeiting lauflicht vorwärts, lauflicht rückwärts und das ganze noch blinkend. willst du nen zufallsgenrator bauen? O:)

gruß ceekay

PicNick
02.10.2005, 09:29
Gut, versuch dich mal damit.
Alle drei Funktionen sind ineinander gemischt, der Effekt ist pseudo-gleichzeitig. Daher gibt es 3 "i" und 3 zeit-Counter und getrennte "P2", damit sie sich nicht in die Quere kommen.
Ich kann's nicht testen, daher kann schon sein, daß irgendwas nicht gleich funzt. In diesem Fall hast du aber am meisten davon, wenn du versucht, das Ganze zu verstehen und dann selbst daran rumzubasteln.


#include <reg167.h>

#define eins 2000
#define zwei 100
#define drei 50

void softdelay ();
void erstes();
void zweites();
void drittes();

sbit port15= P2^15;


static unsigned int i_1;
static unsigned int Cnt_1;
static unsigned int Patt_1;

static unsigned int i_2;
static unsigned int Cnt_2;
static unsigned int Patt_2;

static unsigned int i_3;
static unsigned int Cnt_3;

void main(void)
{
i_1 = 0;
i_2 = 0;
i_3 = 0;
DP2 = 0xFFFF;
Patt_1 = 0x0001;
Patt_2 = 0x0100;
port15 = 1;
Cnt_1 = eins;
Cnt_2 = zwei;
Cnt_3 = drei;

while(1)
{
if (Cnt_1 > 0)
Cnt_1--;
else
{
erstes();
Cnt_1 = eins;
}
if (Cnt_2 > 0)
Cnt_2--;
else
{
zweiter();
Cnt_2 = zwei;
}
if (Cnt_3 > 0)
Cnt_3--;
else
{
drittes();
Cnt_3 = drei;
}
softdelay();
}
}
;----------------------------------------------
void erstes (void)
{
i_1++;
Patt_1 <<= 1;
if (i_1 >= 8)
{
i_1 = 0;
Patt_1 = 0x0001;
}
P2 &= 0xFF00;
P2 |= Patt_1;
}
;----------------------------------------------
void zweites(void)
{
i_2++;
if (i_2 >= 12)
{
i_2 = 0;
Patt_2 = 0x0100;
}
else
{
if (i_2 < 6)
Patt_2 <<= 1;
else
Patt_2 >>= 1;
}
P2 &= 0x00FF;
P2 |= Patt_2;
}
;----------------------------------------------
void drittes(void)
{
port15 ^= 1;
}
;----------------------------------------------
void softdelay()
{
for (j=0; j <2000; j++) {};
}


Edit: "schau, schau", weil wir es hier meistens mit 8-Bit Geräten zu tun haben.

ich bins
02.10.2005, 17:32
hallo picnic

ich habe versucht dein programm zu simulieren. es waren einige fehler dabei aber die habe ich gefunden und ausgebessert.

und ich gratuliere dir es funktioniert mit einem kleinen fehler.

jedoch so ganz verstehe ich deinen code nicht.

PicNick
02.10.2005, 17:53
In der while(1)-hauptschleife werden nacheinander die drei Delayzähler runtergezählt, die sind ja am Anfang 2000, 100 u. 50
Solange in denen was drin steht, wird nur EINMAL Softdelay angesprungen.
Der mit 50 wird als erstes Null kriegen. In diesem Fall rufen wir erstes() auf und setzen den Zähler wieder auf 50 fürs nächste mal.
Das passiert so bei allen drei Zählern.

erstes()
der erhöht i_1 und schiebt Patt_1 nach links.
ist (i_1 > 7), setzt er i_1 wieder auf Null und erneuert Patt_1
Jedesmal aber mischt er Patt_1 in P2:
P2 &= 0xFF00; löschen des gesamten Bytes in P2
P2 |= Patt_1; neusetzen aktueller Wert

zweites()
ist ganz ähnlich, nur schiebt er Patt_2 bei i_2: 0 -> 6 nach links, bei i_2: 7 -> 11 nach rechst. Bei zwölf alles wieder neu.

drittes()
der schaltet das bit in Port 15 einfach immer um (toggle) , einmal 1 und einmal 0

Tut mit leid, wenn ein Fehler drin ist :oops:

ich bins
03.10.2005, 14:20
hallo

ich habe mir das programm angeschaut und versucht es auf eine andere art zu schreiben

es funktioniert aber überhaupt nicht, kannst du mir vielleicht sagen was an der idee falsch ist

was bedeuten in deinem programm die patt variablen

und in der softdelay funktion ist eine warnung und ich weiß nicht was das ist
es zeigt auf die for schleife

"LAUFLICHT.C(238): warning C137: constant in condition expression "

danke auch für deine hilfe



#define eins 500
#define zwei 250
#define drei 125

void softdelay();
void erste();
void zweite();
void dritte();

sbit port15= P2^15;


void main(void)
{
DP2= 0xFFFF;
P2=0x0001;


while(1)
{
int i=0;

for(i=0; i<=eins; i++)
{
if(i==drei)
dritte();
else if(i==zwei)
zweite();
else if(i==eins)
erste();

softdelay();
}

}
}

void erste(void)
{
if (P2<=0x0080)
P2=P2<<1;
else
P2=0x0001;
}


void softdelay()
{
unsigned int j=0;

for (j=0; j=2000; j++)
{};
}

PicNick
03.10.2005, 14:44
for (j=0; j=2000; j++)
Das soll heissen
for (j=0; j < 2000; j++)

das andere schau ich mir jetzt an

PicNick
03.10.2005, 15:03
Wenn er i von Null bis 500 zählt, kommt er bei bei drei und zwei auch nur einmal vorbei.


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

ich bins
03.10.2005, 15:26
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

PicNick
03.10.2005, 15:43
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

ich bins
03.10.2005, 16:08
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.




#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


#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++)
{};
}

PicNick
03.10.2005, 16:14
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 ?

ich bins
04.10.2005, 14:30
hallo

wie kann ich diese bitfolge am port ausgeben

0x8000
0x0000
0x8000
0x0000

PicNick
04.10.2005, 14:32
sieht aus wie toggeln mit dem 2^^15 Bit

Port ^= 0x8000; // toggeln (Bit umdrehen)

ich bins
04.10.2005, 14:50
jetzt funktioniert das programm

picnick ich danke dir für deine hilfe

was macht aber genau diese ^ Funktion

PicNick
04.10.2005, 14:53
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

SprinterSB
04.10.2005, 14:53
'^' 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.

PicNick
04.10.2005, 14:55
@SprinterSB : auf die Traps vom AVR tät' ich mich nicht verlassen.