/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
C spørgsmål om do while
Fra : Kasper


Dato : 29-12-03 01:43

Hey gutter

Sidder lige og hugger mig med lidt c programmering i imagecraft, en compiler
til AVR serien af uC


Jeg har lavet dette :
void pc74start(void)
{ unsigned char k=0;
do
{
TWCR |= 0x20; // set start condition
TWCR |= 0x80; // clr TWINT to send
TWCR &= 0xDF; // clr start condition
k=0;
while(k==0) // Wait until TWINT is set
{
k=TWCR;
k &= 0x80;
}
k = TWSR;
k &= 0xf8;
}
while ((k!=0x10) && (k!=0x08));
}



koden her virker helt fint. !!



men problemet er at i den nederste while sætning burde der have stået

while ((k!=0x10) || (k!=0x08)); efter min mening

men hvorfor virker det ikke som en or sætning mens den oppe i koden virker
som or



Kasper









 
 
Ove Kjeldgaard (29-12-2003)
Kommentar
Fra : Ove Kjeldgaard


Dato : 29-12-03 11:03

"Kasper" <RepzakRemoveme@hotmail.com> wrote:

>Hey gutter
>
>Sidder lige og hugger mig med lidt c programmering i imagecraft, en compiler
>til AVR serien af uC
>
>Jeg har lavet dette :

Og jeg har lige formatteret koden lidt, mistede "do" linien i første omgang.

>void pc74start(void)
>{ unsigned char k=0;
> do
> {
> TWCR |= 0x20; // set start condition
> TWCR |= 0x80; // clr TWINT to send
> TWCR &= 0xDF; // clr start condition
> k=0;
> while(k==0) // Wait until TWINT is set
> {
> k=TWCR;
> k &= 0x80;
> }
> k = TWSR;
> k &= 0xf8;
> }
> while ((k!=0x10) && (k!=0x08));
>}
>
>koden her virker helt fint. !!
>
>men problemet er at i den nederste while sætning burde der have stået
>
>while ((k!=0x10) || (k!=0x08)); efter min mening
>
Hvad står der i TWSR når pc74start() må forlades ?
Og skal k maskes med 0xF8 eller er det 0x18 ?
>

--
Med venlig hilsen, Ove Kjeldgaard, nospam AT privat DOT dk
Natur og Friluftsliv: <http://hiker.dk>

Kasper (29-12-2003)
Kommentar
Fra : Kasper


Dato : 29-12-03 11:20


"Ove Kjeldgaard" <ReadMyEmail@The.Signature> wrote in message
news:fvtvuvk5vkfumn8lt9ai41fscikthudv96@4ax.com...
> "Kasper" <RepzakRemoveme@hotmail.com> wrote:
>
> >Hey gutter
> >
> >Sidder lige og hugger mig med lidt c programmering i imagecraft, en
compiler
> >til AVR serien af uC
> >
> >Jeg har lavet dette :
>
> Og jeg har lige formatteret koden lidt, mistede "do" linien i første
omgang.
>
> >void pc74start(void)
> >{ unsigned char k=0;
> > do
> > {
> > TWCR |= 0x20; // set start condition
> > TWCR |= 0x80; // clr TWINT to send
> > TWCR &= 0xDF; // clr start condition
> > k=0;
> > while(k==0) // Wait until TWINT is set
> > {
> > k=TWCR;
> > k &= 0x80;
> > }
> > k = TWSR;
> > k &= 0xf8;
> > }
> > while ((k!=0x10) && (k!=0x08));
> >}
> >
> >koden her virker helt fint. !!
> >
> >men problemet er at i den nederste while sætning burde der have stået
> >
> >while ((k!=0x10) || (k!=0x08)); efter min mening
> >
> Hvad står der i TWSR når pc74start() må forlades ?
> Og skal k maskes med 0xF8 eller er det 0x18 ?

0x10 eller 0x18 ved begge værdier må den forlade rutinen

men jeg undre mig bar eover det virker med && som eller, sådan som koden er
skrevet øverst forlader den ved entet 0x10 eller 0x18

Kasper



Kasper (29-12-2003)
Kommentar
Fra : Kasper


Dato : 29-12-03 11:29


"Kasper" <RepzakRemoveme@hotmail.com> wrote in message
news:3fefff33$0$159$edfadb0f@dread11.news.tele.dk...
>
> "Ove Kjeldgaard" <ReadMyEmail@The.Signature> wrote in message
> news:fvtvuvk5vkfumn8lt9ai41fscikthudv96@4ax.com...
> > "Kasper" <RepzakRemoveme@hotmail.com> wrote:
> >
> > >Hey gutter
> > >
> > >Sidder lige og hugger mig med lidt c programmering i imagecraft, en
> compiler
> > >til AVR serien af uC
> > >
> > >Jeg har lavet dette :
> >
> > Og jeg har lige formatteret koden lidt, mistede "do" linien i første
> omgang.
> >
> > >void pc74start(void)
> > >{ unsigned char k=0;
> > > do
> > > {
> > > TWCR |= 0x20; // set start condition
> > > TWCR |= 0x80; // clr TWINT to send
> > > TWCR &= 0xDF; // clr start condition
> > > k=0;
> > > while(k==0) // Wait until TWINT is set
> > > {
> > > k=TWCR;
> > > k &= 0x80;
> > > }
> > > k = TWSR;
> > > k &= 0xf8;
> > > }
> > > while ((k!=0x10) && (k!=0x08));
> > >}
> > >
> > >koden her virker helt fint. !!
> > >
> > >men problemet er at i den nederste while sætning burde der have stået
> > >
> > >while ((k!=0x10) || (k!=0x08)); efter min mening
> > >
> > Hvad står der i TWSR når pc74start() må forlades ?
> > Og skal k maskes med 0xF8 eller er det 0x18 ?
>
> 0x10 eller 0x18 ved begge værdier må den forlade rutinen
>
> men jeg undre mig bar eover det virker med && som eller, sådan som koden
er
> skrevet øverst forlader den ved entet 0x10 eller 0x18
>
> Kasper

selvfølgelig er værdierne efter de 3 nederste bit er masket væk

Kasper



Ove Kjeldgaard (29-12-2003)
Kommentar
Fra : Ove Kjeldgaard


Dato : 29-12-03 11:55

"Kasper" <RepzakRemoveme@hotmail.com> wrote:

>
>"Ove Kjeldgaard" <ReadMyEmail@The.Signature> wrote in message
>news:fvtvuvk5vkfumn8lt9ai41fscikthudv96@4ax.com...
>> Hvad står der i TWSR når pc74start() må forlades ?
>> Og skal k maskes med 0xF8 eller er det 0x18 ?
>
>0x10 eller 0x18 ved begge værdier må den forlade rutinen
>
De konstanter kan jeg ikke rigtig få til at passe med koden.

Men ellers må det være nok at checke bit 4 i TWSR, altså noget med:

k = TWSR;
k &= 0x10;
}
while( k != 0x10 );

Som burde komplere til mere kompakt kode med (k kan kun være 0x00 eller 0x10):

k = TWSR;
k &= 0x10;
}
while( k == 0 );

Eller noget der giver meget kompakt kode i PIC-C fra HiTech, her bruges k ikke:

}
while(( TWSR & 0x10 ) == 0 );

Og hvis jeg husker ret er denne også gangbar (kompilerer til samme ASM
instruktioner):

}
while( !( TWSR & 0x10 ));


--
Med venlig hilsen, Ove Kjeldgaard, nospam AT privat DOT dk
Natur og Friluftsliv: <http://hiker.dk>

Bertel Brander (29-12-2003)
Kommentar
Fra : Bertel Brander


Dato : 29-12-03 11:44

Kasper wrote:
> Hey gutter
>
> Sidder lige og hugger mig med lidt c programmering i imagecraft, en compiler
> til AVR serien af uC
>
>
> Jeg har lavet dette :
> void pc74start(void)
> { unsigned char k=0;
> do
> {
> TWCR |= 0x20; // set start condition
> TWCR |= 0x80; // clr TWINT to send
> TWCR &= 0xDF; // clr start condition
> k=0;
> while(k==0) // Wait until TWINT is set
> {
> k=TWCR;
> k &= 0x80;
> }
> k = TWSR;
> k &= 0xf8;
> }
> while ((k!=0x10) && (k!=0x08));
> }
>
>
>
> koden her virker helt fint. !!
>
>
>
> men problemet er at i den nederste while sætning burde der have stået
>
> while ((k!=0x10) || (k!=0x08)); efter min mening
>
> men hvorfor virker det ikke som en or sætning mens den oppe i koden virker
> som or

Jeg lærte en gang at man kan omskrive:
(!x || !y) til !(x && y)

I dit tilfælde kan vi omskrive

while ((k!=0x10) || (k!=0x08)); til

while(!(k == 0x10 && k == 0x08));

Det ses let at k ikke kan være både 0x10 og 0x08,
(hvis k er en simpel data type som f.ex. char)
hvorfor loopen vil fortsætte i det uendelige.

Man kan også sige at k altid vil være forskellig fra
enten 0x10 eller 0x08.

/b


Kasper (29-12-2003)
Kommentar
Fra : Kasper


Dato : 29-12-03 11:44


"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:3ff003c0$0$27453$edfadb0f@dread16.news.tele.dk...
> Kasper wrote:
> > Hey gutter
> >
> > Sidder lige og hugger mig med lidt c programmering i imagecraft, en
compiler
> > til AVR serien af uC
> >
> >
> > Jeg har lavet dette :
> > void pc74start(void)
> > { unsigned char k=0;
> > do
> > {
> > TWCR |= 0x20; // set start condition
> > TWCR |= 0x80; // clr TWINT to send
> > TWCR &= 0xDF; // clr start condition
> > k=0;
> > while(k==0) // Wait until TWINT is set
> > {
> > k=TWCR;
> > k &= 0x80;
> > }
> > k = TWSR;
> > k &= 0xf8;
> > }
> > while ((k!=0x10) && (k!=0x08));
> > }
> >
> >
> >
> > koden her virker helt fint. !!
> >
> >
> >
> > men problemet er at i den nederste while sætning burde der have stået
> >
> > while ((k!=0x10) || (k!=0x08)); efter min mening
> >
> > men hvorfor virker det ikke som en or sætning mens den oppe i koden
virker
> > som or
>
> Jeg lærte en gang at man kan omskrive:
> (!x || !y) til !(x && y)
>
> I dit tilfælde kan vi omskrive
>
> while ((k!=0x10) || (k!=0x08)); til
>
> while(!(k == 0x10 && k == 0x08));
>
> Det ses let at k ikke kan være både 0x10 og 0x08,
> (hvis k er en simpel data type som f.ex. char)
> hvorfor loopen vil fortsætte i det uendelige.
>
> Man kan også sige at k altid vil være forskellig fra
> enten 0x10 eller 0x08.

Hey

ja det er sant, burde jeg have tænkt på, har da selv mødt demorgan eller
hvad han nu hedder

Kasper



Ivan Johansen (29-12-2003)
Kommentar
Fra : Ivan Johansen


Dato : 29-12-03 11:49

Kasper wrote:
> while ((k!=0x10) && (k!=0x08));

Her loopes en gang til hvis k ikke er 0x10 og ikke er 0x08. Med andre
ord, der hoppes ud når k er 0x10 eller 0x08.

> men problemet er at i den nederste while sætning burde der have stået
>
> while ((k!=0x10) || (k!=0x08)); efter min mening

Her loopes hvis k ikke er 0x10 eller ikke er 0x08. Da k ikke kan være
0x10 og 0x08 på samme tid er dette altid opfyldt og der loopes hver gang.

Hvis du vil skrive det anderledes er en anden måde at skrive det
oprindelige:
while (!(k==0x10 || k==0x08));

Ivan Johansen


René Larsen (29-12-2003)
Kommentar
Fra : René Larsen


Dato : 29-12-03 12:00

In article <3fef77fd$0$138$edfadb0f@dread11.news.tele.dk>, Kasper wrote:
> From: "Kasper" <RepzakRemoveme@hotmail.com>
> Newsgroups: dk.edb.programmering.c
> Subject: C spørgsmål om do while
> Date: Mon, 29 Dec 2003 01:42:53 +0100
>
> Hey gutter
>
> Sidder lige og hugger mig med lidt c programmering i imagecraft, en compiler
> til AVR serien af uC
>
>
> Jeg har lavet dette :
> void pc74start(void)
> { unsigned char k=0;
> do
> {
> TWCR |= 0x20; // set start condition
> TWCR |= 0x80; // clr TWINT to send
> TWCR &= 0xDF; // clr start condition
> k=0;
> while(k==0) // Wait until TWINT is set
> {
> k=TWCR;
> k &= 0x80;
> }
> k = TWSR;
> k &= 0xf8;
> }
> while ((k!=0x10) && (k!=0x08));
> }
>
>
>
> koden her virker helt fint. !!
>
>
>
> men problemet er at i den nederste while sætning burde der have stået
>
> while ((k!=0x10) || (k!=0x08)); efter min mening

Hvorfor?
Din sætning betyder "Stop for alle værdier af k" !!!!!!!!!

Prøv at opskrive en sandhedstabel for k:

k ((k!=0x10) && (k!=0x08)) ((k!=0x10) || (k!=0x08))
0x00 TRUE TRUE
0x01 TRUE TRUE
0x02 TRUE TRUE
0x04 TRUE TRUE
0x08 FALSE TRUE (k != 0x10)
0x10 FALSE TRUE (k != 0x08)
0x20 TRUE TRUE

MVH, René



Bertel Lund Hansen (29-12-2003)
Kommentar
Fra : Bertel Lund Hansen


Dato : 29-12-03 12:10

Kasper skrev:

>while ((k!=0x10) && (k!=0x08));

>koden her virker helt fint. !!

>men problemet er at i den nederste while sætning burde der have stået
>while ((k!=0x10) || (k!=0x08)); efter min mening

Niks.

>men hvorfor virker det ikke som en or sætning mens den oppe i koden virker
>som or

Det virker ikke som OR.

   x !=5 || x!=7

returnerer altid true. Hvis x er 5 er den garanteret forskellig
fra 7 og omvendt.

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409081
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste