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

OP Persönliche Seite #3299546
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 #3299559
Und wie wärs mit \t statt diesem blöden Leerzeichen-Eingerücke? Dann 
brauchst du da auch keine 10 IFs für.
Sorry für die vielen Posts, les mir das grad Schritt für Schritt durch.
Gast #3299561
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
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
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
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
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
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
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.
#3300387
Stefan B. schrieb:
> Manchmal ärgere ich mich schon.

Wenn du einfach die Programmiersprache lernen würdest müsstest du dich 
nicht mehr ärgern.
Sowas kann sogar Spass machen.

Auf jeden Fall macht es Spass wenn es erst mal kann und nicht wegen 
jeder Kleinigkeit andere fragen und bitten muss, sondern sich selbst 
sagen kann, das habe ich selbst hingekriegt.
OP Persönliche Seite #3300399
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.