C-File Notlösung. Wer könnte kurz helfen?

OP Persönliche Seite #3299546
Lesenswert?

Hallo geschätztes Forum,

nachdem ich leider nichtmehr weiter komme, wende ich mich an Euch.

Ich habe eine Testschaltung mit einem DHT22, Atmega8 und einem LCD 
aufgebaut. Codeschnipsel sind aus dem Netz. Das Ganze soll in naher 
Zukunft ein Hyro-/Thermometer für den Außenbereich werden.

Mein Problem ist, dass keine Minustemperaturen angezeigt werden/wurden. 
Alles, was unter 0 Grad war, wurde mit 6553,9 angezeigt.

Ich habe das mit:

...

*humidity = (sensor_data[0]<<8) + sensor_data[1] + 42.0; // + 42.0
  //*temp = (sensor_data[2]<<8) + sensor_data[3] - 7.0;      // - 7.0

  if((sensor_data[2]<<8) + sensor_data[3] - 7.0 < 0)
  {
   *temp &= 0x7FFF; // Remove signal bit
     *temp = ((sensor_data[2]<<8) + sensor_data[3] - 7.0) * (-1);
   *x = *x + 1;
  }
    else
    {
      *temp = (sensor_data[2]<<8) + sensor_data[3] - 7.0;      // - 7.0
    }
...


"behoben".....siehe "am2302.c"

Allerdings wird/wurde erst normal bis 0 Grad angezeigt und ab 0 Grad 
abwärts (-0.1 Grad und weniger) wird normal wieder hochgezählt ohne 
Minuszeichen davor. Deswegen auch "*x = *x + 1;", welches dann via einer 
Variablen im main.c das Minuszeichen vor die Temperatur setzt.

...
if (x > 0)
      {
          lcd_string_format("Temp:- %i.%i C   %i      \nHumi: %i.%i %% 
%i     " , temp/10, temp%10, x, humidity/10, humidity%10, i);
        }
      else
          if (temp/10 >= 10)
            {
            lcd_string_format("Temp: %i.%i C   %i   \nHumi: %i.%i %%  %i 
" , temp/10, temp%10, x, humidity/10, humidity%10, i);
            }
          else
          {
            lcd_string_format("Temp:  %i.%i C   %i   \nHumi: %i.%i %% 
%i     " , temp/10, temp%10, x, humidity/10, humidity%10, i);
            }

...

Wie könnte man das geschickter lösen?

Ich würde mich über ein paar Tipps freuen.
Angehängte Dateien:
Gast #3299561
Lesenswert?

kA was du bei der umrechnung in am2302 für Zeug machst. Scheinbar nutzt 
der am2302 das MSB als signed-bit. Du kannst also einfach temp als 
int16_t deklarieren (das meinte ich übrigens auch oben, habs mit 
humidity verwechselt). Dann kannst du sagen:
1
*temp = 0;
2
if( *MSB gesetzt* ){
3
  *temp -= daten;
4
}else{
5
  *temp += daten;
6
}

Und all deine Probleme werden gelöst sein.
Gast #3299728
Lesenswert?

Ich kenne das blöde Kommentieren noch aus Unterrichtszeiten: manche 
Lehrer bestanden echt darauf, dass JEDE Codezeile kommentiert wird. Wenn 
ich es nicht verweigern konnte (weil davon sonst die Note abhing), habe 
ich ähnlich sinnvoll kommentiert - Anforderung war erfüllt.
Vllt hat der TO ein ähnliches Problem? Neben den Anderen genannten 
natürlich ;)
#3299839
Lesenswert?

Michael schrieb:
> Ich kenne das blöde Kommentieren noch aus Unterrichtszeiten: manche
> Lehrer bestanden echt darauf, dass JEDE Codezeile kommentiert wird. Wenn
> ich es nicht verweigern konnte (weil davon sonst die Note abhing), habe
> ich ähnlich sinnvoll kommentiert - Anforderung war erfüllt.
> Vllt hat der TO ein ähnliches Problem? Neben den Anderen genannten
> natürlich ;)

Aber diese Zeilen schreien doch geradezu nach einen echten Kommentar.
OP Persönliche Seite #3299901
Lesenswert?

Guten Morgen ;)

Danke für die Tipps.....

Ich habe die *temp mal zu int16_t abgeändert. Allerdings wird jetzt an 
erster sowie an zweiter Stelle ein negatives Vorzeichen angesetzt (siehe 
Bild).

Hätte da eventuell noch jemand eine Idee, wie man das negative 
Vorzeichen nach der Kommastelle weg bekommt?

Udo Schmitt schrieb:
> und jetzt jemanden sucht der die Schnipsel zu einem lauffähigen Programm
> zusammenpuzzled.

Hi Udo, mein "Thermometer" funktioniert mit den am Thread angehängten 
Files, aber ich hätte das gerne noch ein bißchen unkomplizierter 
"gestaltet", also mit weniger if-else-Abfragen zum Beispiel in der 
main.c

Stefan B. schrieb:
> Wie könnte man das geschickter lösen?
Angehängte Dateien:
Gast #3300260
Lesenswert?

Stefan B. schrieb:
> Ich bekomme es nicht hin :(

was hast Du denn probiert?
1
  if (x > 0)
2
      {
3
          lcd_string_format("Temp:- %i.%i C   %i      \nHumi: %i.%i %%  %i     " , temp/10, temp%10, x, humidity/10, humidity%10, i);
4
        }

Wenn temp einen negativen Wert enthält, müsstest Du eigentlich für 
temp/10 auch ein Minuszeichen haben...

Ändere temp%10 in abs(temp)%10 ab.
OP Persönliche Seite #3300378
Lesenswert?

DirkZ schrieb:
> Stefan B. schrieb:
>> Ich bekomme es nicht hin :(
>
> was hast Du denn probiert?
>   if (x > 0)
>       {
>           lcd_string_format("Temp:- %i.%i C   %i      \nHumi: %i.%i %%
> %i     " , temp/10, temp%10, x, humidity/10, humidity%10, i);
>         }
>
> Wenn temp einen negativen Wert enthält, müsstest Du eigentlich für
> temp/10 auch ein Minuszeichen haben...
>
> Ändere temp%10 in abs(temp)%10 ab.

Danke, so gehts.... :)

Manchmal ärgere ich mich schon. Das sind minimale Änderungen, aber da 
wäre ich nie drauf gekommen.

Grüße vom Bodensee
Gast #3300379
Lesenswert?

Diese /10 und Modulo Rechnerei ist natürlich totaler Unsinn. Eigentlich 
gehört das alles schön in ein Float gepackt, dann ist gut. Da es eh auf 
einem LCD angezeigt wird ist das Rechenzeittechnisch völlig egal, und 
bei der Komplexität des Programms ist der zusätzliche Speicherverbrauch 
der float lib auch irrelevant.
OP Persönliche Seite #3300399
Lesenswert?

Guest schrieb:
> Diese /10 und Modulo Rechnerei ist natürlich totaler Unsinn. Eigentlich
> gehört das alles schön in ein Float gepackt, dann ist gut. Da es eh auf
> einem LCD angezeigt wird ist das Rechenzeittechnisch völlig egal, und
> bei der Komplexität des Programms ist der zusätzliche Speicherverbrauch
> der float lib auch irrelevant.

Mir wäre es auch lieber, wenn ich das Ganze so programmieren könnte, 
dass es sauber und auch logisch aufgebaut wäre. Das Problem ist nur, 
dass ich sozusagen ein Newbie bin und ich mich freue, wenn die Schaltung 
einigermaßen funktioniert. Ich hätte  da noch einige andere Ideen zu 
diesem Thermometer. Zum Beispiel einen Timer einfügen und mit 2 Tasten 
einen Schaltpunkt für die Temperatur und für die Luftfeuchte,  dass dann 
bei irgendeiner Temperatur oder Luftfeuchte irgendwas schaltet. Einen 
Ansatz für die Luftfeuchte ist ja schon "eingebaut".
Aber da darf ich noch viel probieren und lesen.....


Gruss
Gast #3300429
Lesenswert?

mit Gleitkommavariablen

von
1
lcd_string_format("Temp:- %i.%i C   %i      \nHumi: %i.%i %%  %i     " , temp/10, temp%10, x, humidity/10, humidity%10, i);

zu
1
float ftemp, fhumidity;
2

3
.
4
.
5
/*Messwertabfrage*/
6
.
7

8
ftemp = temp/10.0;
9
fhumidity = humidity/10.0;
10

11
lcd_string_format("Temp: %.1f C   %i      \nHumi: %.1f %%  %i     " , ftemp, x, fhumidity, i);

x könnte jetzt auch weg.
Gast #3300593
Lesenswert?

Guest schrieb:
> Eigentlich gehört das alles schön in ein Float gepackt, dann ist gut.

Das ist doch wohl der größte Unsinn, nur weil in der Ausgabe ein Punkt 
auftauchen soll, sich die ganze Floatingpoint-Library aufzuhalsen und 
ggf. auf einen größeren Prozessor umschwenken zu müssen.
OP Persönliche Seite #3300797
Lesenswert?

Mr. Tom schrieb:
> Guest schrieb:
>> Eigentlich gehört das alles schön in ein Float gepackt, dann ist gut.
>
> Das ist doch wohl der größte Unsinn, nur weil in der Ausgabe ein Punkt
> auftauchen soll, sich die ganze Floatingpoint-Library aufzuhalsen und
> ggf. auf einen größeren Prozessor umschwenken zu müssen.

Viele User, viele Meinungen.....

Ich glaube C bietet viele Möglichkeiten um ans Ziel zu kommen.

Vielleicht bekomme ich es auch irgendwann mal hin, mir eine Möglichkeit 
aussuchen zu können ohne Straßenlaternen streifen zu müssen ;)
Gast #3300919
Lesenswert?

Mr. Tom schrieb:
> Guest schrieb:
>> Eigentlich gehört das alles schön in ein Float gepackt, dann ist gut.
>
> Das ist doch wohl der größte Unsinn, nur weil in der Ausgabe ein Punkt
> auftauchen soll, sich die ganze Floatingpoint-Library aufzuhalsen und
> ggf. auf einen größeren Prozessor umschwenken zu müssen.

Ja sicher, größter Unsinn. Ist ja nicht so als ob er auf den Wert regeln 
will. Oh, moment, will er doch! Wäre das nicht schön, wenn er alles in 
einer Variablen stehen hätte mit der er rechnen könnte? Was bietet sich 
denn an...mhm...float vielleicht!
Gast #3444898
Lesenswert?

Da das Thema nicht allzu alt ist und sich mit dem gleichen Sensor 
beschäftigt, hier meine Frage:

Der Sensor bildet ja eine recht simple Checksumme. Ist bekannt (bzw hat 
jemand berechnet) wieviel Prozent der Fehler durch die Checksumme 
gefunden werden? Warum wurde kein Generatorpolynom wie bei CRC16 und Co 
verwendet?

LG

Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren