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: