Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: zusammengesetzte arithmetische Ausdrücke Kategorie: Programmierung C (von ER - 28.08.2009 16:02)
Als Antwort auf Re: zusammengesetzte arithmetische Ausdrücke von PeterS - 27.08.2009 11:55

> > > > Hallo zusammen,
> > > > bei meinen Aktivit├Ąten zur Umsetzung meiner Programme von der CC1 auf die CC Pro
> > > > bin ich auf etwas gesto├čen, was sehr fragw├╝rdig ist:
> > > > Folgender Code l├Ąsst sich fehlerfrei compilieren.
> > > > Die Funktion liefert die Werte 0x0A f├╝r OK oder 01 - Fehler zur├╝ck.
> > > > Das Programm kommt aus der Schleife nicht mehr raus.
> > > > Der arithmetische Ausdruck wird anscheinend nicht korrekt
> > > > aufgel├Âst. Wird immer zu 1 berechnet.
> > > >
> > > > void DS2482WIRE_WAITIDLE(void)
> > > > {
> > > > DS2482WT:
> > > > if ((DS2482GET_STATUS() & 1) > 0) goto DS2482WT;
> > > > }
> > > >
> > > >
> > > > Der Code funktioniert, wenn man die Berechung aus der Klammer
> > > > herausl├Âst:
> > > >
> > > > void DS2482WIRE_WAITIDLE(void)
> > > > {
> > > > DS2482WT:
> > > > buffer=DS2482GET_STATUS() & 1;
> > > > if (buffer > 0) goto DS2482WT;
> > > > }
> > > >
> > > > Was Ist da los? Also der B++ Compiler vom Stefan Tapertzhofen kann so etwas
> > > > problemlos bearbeiten.
> > > >
> > > > mfg
> > > > Ellen
> > >
> > > Hallo Ellen,
> > >
> > > ich kann das nicht best├Ątigen. Bei mir funktionieren beide Ausdr├╝cke. Bitte gib doch auch die
> > > Funktion DS2482GET_STATUS() an, vielleicht ist der Fehler da.
> > >
> > > Gruss Peter
> >
> >
> > Hallo Peter,
> > ok, hier der Code:
> > Die Inhalte aus dem Status Register kommen korrekt ├╝ber den I2C Bus.
> > Das habe ich mittels LA ├╝berpr├╝ft ├ťbrigens komme ich sehr gut voran
> > mit der Pro. Seit gestern laufen alle DS 1820 Kontrollroutinen.
> > Die CC Pro ist erheblich schneller als die CC1. Das ├Ąu├čerst sich darin dass
> > die I2C Datenpakete fast ohne Pause aufeinander folgen. Beim Lesen vom 1 Wire
> > Bus kann es deswegen zu Timingproblemen kommen, weil der 1 Wire Bus zu langsam
> > ist. An einigen Stellen muss man die CC Pro ausbremsen mit 50 us.
> > Dann l├Ąuft der Bus absolut stabil.
> >
> > Gru├č
> > Ellen
> >  
> >
> > //-----------------------------------------------------
> > //----------------- GET DS2482 STATUS -----------------
> > //-----------------------------------------------------
> > byte DS2482GET_STATUS(void)
> > {
> >
> > I2C_Start();
> > I2C_Write(ADDR);
> > I2C_Write(SET_READ_POINTER);
> > I2C_Write(STATUS_POINTER);
> > I2C_Stop();
> >
> > I2C_Start();
> > I2C_Write(ADDR+1);
> > DATA=I2C_Read_NACK();
> > I2C_Stop();
> >
> > return DATA;
> > }
> >
>
> Hmm, schick mir doch bitte das Projekt an ccpro@gmx.de, vielleicht ergibt sich das Problem nur im
> kompletten Programmcode.
>  
> Ich habe folgendes getestet:
>
> byte DS2482GET_STATUS(void)
> {
>     return(0x0A);
> }
>
> void DS2482WIRE_WAITIDLE(void)
> {
>     DS2482WT:
>     if ((DS2482GET_STATUS() & 1) > 0) goto DS2482WT;
> }
>
> Bei einem Aufruf von S2482WIRE_WAITIDLE() kommt die Funktion ohne Schleifendurchlauf direkt
> zur├╝ck. Es wird hier korrekt ausgewertet.
>
> Gruss Peter
>
>
Hallo Peter,

Die Routine l├Ąuft jetzt auch bei mir.
Ich kann den Fehler nicht mehr reproduzieren. Leider habe auch ich das Bild vom
Logikanalysator nicht gespeichert. Ich vermute, dass der Compiler dieses ausgef├╝hrt hat:
1 > 0 mit Ergebnis 1 und die Funktion ignoriert. (Aus welchen Gr├╝nden auch immer??)
Ich schlage vor, ich beobachte das weiter. Im Wiederholungsfall werde ich sofort alles speichern.
Vielen Dank f├╝r das Hilfeangebot.

mfg
Ellen




    Antwort schreiben


Antworten: