Forum: Mikrocontroller und Digitale Elektronik Konstantenberechnung / Debugger watchen möglich?


von Andreas (Gast)


Lesenswert?

Das Problem ist, dass er mir anscheinend nicht den richtigen Wert 
rausgibt, zumindest reagiert er nicht wie gewollt, ersetze ich den 
Konstantennamen jedoch durch einen Wert den ich von hand mit 
Taschenrechner errechne, so funktioniert alles.

Der Code:
1
#define blue_green (uint32_t)((bright_blue+2*dark_green)/3/5000*1023)
2
...
3
//Werte in mV!
4
#define bright_blue 2020  //entsprechenden Farben und
5
#define dark_green 1660    //Umgebungslichtverhältnissen.
6
#define bright_green 930  //(dark -> abgedunkelt)
7
#define dark_orange 140    //(bright -> bei Tageslicht)
8
9
#define code_blue 0b11    //2-Bit-Codierung der Farben:
10
#define code_green 0b10    //MSB->OUT2 ,LSB->OUT1
11
#define code_orange 0b01
12
...
13
  uint16_t value=getAV();
14
15
  if (value > blue_green)
16
   {              //blauer Stein
17
   PORTB&=0xFC;          //&0b1111 1100
18
   PORTB|=code_blue;
19
   }
20
...

Wert liegt im Bereich von 0 - 400

Kann man sich im Debugger die Werte der Konstanten anschauen?

von Maxxie (Gast)


Lesenswert?

Per Hand ausgerechnet komm ich auf 0

Es wird entsprechend der Bindung evaluiert in C:

(bright_blue+2*dark_green) -> 5340
5340 / 3 -> 1780
1780 / 5000 -> 0
0 * 1023 -> 0

von Maxxie (Gast)


Lesenswert?

PS: Setz die *1023 vor die  5000 oder gar vors  3 / 5000. Damit 
verlierst du in der Division nicht soviele Stellen. Musst aber 
aufpassen, dass du nicht nach oben aus dem Wertebereich herauskommst. 
Maximalwerte?

von Andreas (Gast)


Lesenswert?

oh ja jetzt seh ich mein schlamassel, hab ich natürlich brav als ganzes 
in den rechner gehämmert. naja meine jetzigen maximalwerte sind 82-364, 
ich schätze also dass es über 400 nicht hinausgehen wird. Ich schätze 
wenn ich mit floatzahlen hantiere wird er es ebensowenig mögen.

von CMosSwitcher (Gast)


Lesenswert?

1
#define blue_green (uint32_t)(                                        \
2
          (float)((float)bright_blue+(float)(2*(float)dark_green))    \
3
           /(float)3                                                  \
4
           /(float)((float)5000*(float)1023)                          \
5
           )                                                          \

von CMosSwitcher (Gast)


Lesenswert?

Lass doch den Compiler in float rechnen.
Es passiert offline, also vor dem compilieren ein beeinträchtigt somit 
nicht die Laufzeit.

Für sowas sollte man so spät wie möglich die Genauigkeit reduzieren.
Ansonsten darauf achten, wie schon geschrieben, dass du erst immer 
multiplizierst und dann dividierst. Wobei das floar keine Rolle spielen 
sollte.

von Maxxie (Gast)


Lesenswert?

Mit float sowieso nicht. Nichtmal zum "mal eben" ist einfach auf reinen 
Ganzzahlsystemen Schrott.


Überlege dir nochmal was du genau machen willst, und in welchem Format 
deine Werte vorliegen. Sind es überhaupt Intensitäten? Eventuell doch 
nur Bitmasken?

Generell bei Intensitäten:
1
(MischanteilA * FarbeA + MischanteilB * FarbeB) / (MischanteilA + MischanteilB)

Hier kannst du bei den Mischanteilen auf (Fest)Kommazahlen verzichten, 
das Format von FarbeA und FarbeB ist bei Festkomma dann egal und braucht 
nicht mehr nachjustiert werden. Wenn bereits die einzelnen Farbwerte im 
benötigten Format vorliegen.

von Andreas (Gast)


Lesenswert?

also ich habe einen simplen aufbau, der licht aussendet und mit einem 
rotfilter wieder auffängt. das gibt mir dann einen Spannungswert zurück, 
der anscheinend intern noch verarbeitet wird. Die Spannungswerte hab ich 
bei den 3 Farben recht gut ermittlen können und somit möchte ich diese 
jetzt nutzen. Irgendwie glaube ich, dass er trotz der float 
cast-operatoren noch nicht den richtigen wert ermittelt.. kann ihn ja 
leider nicht einsehen und daher nur erkennbar an der fehlfunktion.

von Andreas (Gast)


Lesenswert?

nein ich muss mich korrigieren, funktioniert jetzt wunderbar, hatte nur 
eine klammer falsch gesetzt!
Danke für die Hilfe, echt klasse, da macht das Lernen richtig Spass.

von Maxxie (Gast)


Lesenswert?

Dann macht deine Formel (für mich) nicht viel Sinn.

Was genau möchtest du mit dem
1
 / 5000 * 1023
machen, wenn die Orginalwerte bereits in der richtigen (gemessenen) 
Skalierung sind?

Ich würde erwarten, dass deine Messwerte ca 5 mal höher sind als die 
hier erwarteten. (Mal ganz ausser Acht gelassen, dass hinter dem Filter 
die Luminanz -> Messung nicht einfach linear interpoliert werden kann, 
sondern durch die Chrominanz beeinflusst wird)

von Andreas (Gast)


Lesenswert?

nur zur info für Maxxie noch:

/5000*1023 benutz ich nur um von den Spannungswerten auf die relativen 
werte vom adc zu kommen (/5000mV*1023), die er mir zurückgibt mit Vcc 
als Ref.(5V). Die werte die ich berechne sind grenzwerte, die ich aus 
meinen minimalen und maximalen werten für die einzelnen farben ermittel, 
das klappt soweit auch schon ganz gut.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.