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

Re: Bug bei bedingter Bewertung? Kategorie: Programmierung C (von PeterS - 11.02.2009 17:47)
Als Antwort auf Bug bei bedingter Bewertung? von Wolfgang - 11.02.2009 16:57

> Hallo,
>
> ich nutzt zur Zeit Beta 1.98 mit C-Compiler
> Float-Variablen benenne ich zur Unterscheidung von Integers mit einem führenden "f"
>
>
> Ich lasse in einer Interrupt-Routine jede Sekunde eine Regel-Routine laufen, die als Ergebnis in der
> Float-Variablen "fDAC_neu" einen neuen Stellwert liefert, der (nach Begrenzung auf das Intervall
> 0..65536) per SPI-Schnittstelle in einen externen 16-Bit-DAC geschrieben wird. Dazu kopiere ich
> fDac_neu in die Integer-Vaiable "DAC_Wert"und schicke die per SPI raus - das funktioniert!
>
> Interrupt-Routine:
>   ...
>   fDAC_neu = MITTE + fProp +fInteg + fDblInteg;                   // Berechnung eines neuen Regel-Wertes
>   if (fDAC_neu>65535.0) fDAC_neu=65535.0; if (fDAC_neu<0.0) fDAC_neu=0.0;  // Begrenzung
>   DAC_Wert = fDAC_neu;                                                    // Wandlung nach Int
>
>   Port_WriteBit(SYNC, Low);                                               // Selektieren des externen DAC
>     SPI_Write(DAC_Wert >> 8);                                           // 2 Byte per SPI aussenden
>     SPI_Write(DAC_Wert & 0x00FF);
>   Port_WriteBit(SYNC, High);                                              // De-selektieren des DAC
>   ...
>
>
> Nun wollte ich optional den DAC auf einem vom Hauptprogramm vorzugebenden Wert einfrieren, der
> in der Integer-Variable "man_DAC" abgelegt ist.
>
> Zu diesem Zweck habe ich eine Byte-Variable "Tune_Flag" eingeführt, die im Hauptprogramm auf
> entweder "True" (->Regeln) oder "False" (-> Einfrieren) gesetzt werden kann, wobei definiert ist:
> #define False 0
> #define True 1
>
> In der Interrupt-Routine habe ich dann die Zuweisung
>   DAC_Wert = fDAC_neu;                                                    // Wandlung nach Int
>
> ersetzt durch
>   DAC_Wert = (Tune_Flag)? fDAC_neu : man_DAC;
>
> Falls Tune_Flag==True, so geht das falsch: die Regelschleife 'spinnt' -
> es wird weder der Wert fDAC_neu noch der Wert man_DAC verwendet!
> (bei Tune_Flag==False geht es richtig: man_DAC wird verwendet).
>
> Dasselbe gilt, wenn ich die Bedingung ausformuliere zu "(Tune_Flag==True)?
>
> Was ist falsch?
>
Die bedingte Bewertung hat einen Bug bei der Zuweisung von floating point Variablen. Da bitte ein
if benutzen. Ich meine ich hätte da in der 1.99 schon gefixed.

Gruss Peter



    Antwort schreiben


Antworten: