mikrocontroller.net

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


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#define blue_green (uint32_t)((bright_blue+2*dark_green)/3/5000*1023)
...
//Werte in mV!
#define bright_blue 2020  //entsprechenden Farben und
#define dark_green 1660    //Umgebungslichtverhältnissen.
#define bright_green 930  //(dark -> abgedunkelt)
#define dark_orange 140    //(bright -> bei Tageslicht)

#define code_blue 0b11    //2-Bit-Codierung der Farben:
#define code_green 0b10    //MSB->OUT2 ,LSB->OUT1
#define code_orange 0b01
...
  uint16_t value=getAV();

  if (value > blue_green)
   {              //blauer Stein
   PORTB&=0xFC;          //&0b1111 1100
   PORTB|=code_blue;
   }
...

Wert liegt im Bereich von 0 - 400

Kann man sich im Debugger die Werte der Konstanten anschauen?

Autor: Maxxie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Maxxie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: CMosSwitcher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define blue_green (uint32_t)(                                        \
          (float)((float)bright_blue+(float)(2*(float)dark_green))    \
           /(float)3                                                  \
           /(float)((float)5000*(float)1023)                          \
           )                                                          \

Autor: CMosSwitcher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Maxxie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
(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.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Maxxie (Gast)
Datum:

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

Was genau möchtest du mit dem
 / 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)

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.