Forum: Mikrocontroller und Digitale Elektronik C-File Notlösung. Wer könnte kurz helfen?


von Stefan B. (sibbl) Benutzerseite


Angehängte Dateien:

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.

von Guest (Gast)


Lesenswert?

humidity als int16_t statt uint16_t deklarieren und gut?

von Guest (Gast)


Lesenswert?

Und rück mal dein Code richtig ein, so ist das grauenhaft.

von Guest (Gast)


Lesenswert?

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.

von Guest (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

1
*humidity = (sensor_data[0]<<8) + sensor_data[1] + 42.0; // + 42.0

Welchen tieferen Sinn siehst Du darin, eine float -Konstante zu einem 
uint16_t -Wert zu addieren?

Und was soll der geniale Kommentar?

von Michael (Gast)


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 ;)

von Dumdi D. (dumdidum)


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.

von Udo S. (urschmitt)


Lesenswert?

Das Problem ist doch so wie ich das verstehe daß der To gar nicht selbst 
programmiert hat:

Stefan B. schrieb:
> Codeschnipsel sind aus dem Netz.

und jetzt jemanden sucht der die Schnipsel zu einem lauffähigen Programm 
zusammenpuzzled.

von Stefan B. (sibbl) Benutzerseite


Angehängte Dateien:

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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Stefan B. schrieb:
> Hätte da eventuell noch jemand eine Idee, wie man das negative
> Vorzeichen nach der Kommastelle weg bekommt?

abs

von Stefan B. (sibbl) Benutzerseite


Lesenswert?

abs?

Ich kann damit leider nichts anfangen, da ich nicht unbedingt der große 
C-Programmierer bin.
Würdest Du das bitte bißchen genauer erklären?

von Daniel V. (danvet)


Lesenswert?

Stefan B. schrieb:
> abs?
>
> Ich kann damit leider nichts anfangen, da ich nicht unbedingt der große
> C-Programmierer bin.
> Würdest Du das bitte bißchen genauer erklären?

abs() - "Absolut"-Funktion

von Stefan B. (sibbl) Benutzerseite


Lesenswert?

Danke....

Ich werd mal sehen, ob ich damit was hin bekomme....

Gruss Stefan

von Stefan B. (sibbl) Benutzerseite


Lesenswert?

Ich bekomme es nicht hin :(

von Andreas G. (beastyk)


Lesenswert?

oder auch der Betrag einer Zahl

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

Nicht?

Was genau hast Du denn versucht?

von DirkZ (Gast)


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.

von Stefan B. (sibbl) Benutzerseite


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

von Guest (Gast)


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.

von Thomas K. (muetze1)


Lesenswert?

Er hat es zusammen kopiert. Daher können/waren die Anforderungen bei den 
eigentlichen Quellen auch ganz andere als hier.

von Udo S. (urschmitt)


Lesenswert?

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.

von Stefan B. (sibbl) Benutzerseite


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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Stefan B. schrieb:
> Das Problem ist nur, dass ich sozusagen ein Newbie bin und ich mich
> freue, wenn die Schaltung einigermaßen funktioniert.

Tut mir leid Herr Wachtmeister, das Problem ist das ich noch ein Newbie 
bin und ich mich freue wenn ich einigermaßen gerade aus fahre kann und 
nur selten eine Straßenlaterne streife... ;-)

von DirkZ (Gast)


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.

von Mr. Tom (Gast)


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.

von Stefan B. (sibbl) Benutzerseite


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 ;)

von Guest (Gast)


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!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Guest schrieb:
> 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!

Man kann mit Ganzzahlen nicht rechnen? Erstaunlich.

von Peter Staub (Gast)


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

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.