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: |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum