Forum: Mikrocontroller und Digitale Elektronik Bedingte Verknüpfung-Code so in Ordnung?


von Matthias H. (maethes26)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

würdet ihr bitte so nett sein und über meinen funktionierenden!!! Code 
drüber schauen, ob dieser noch verbesserungswürdig ist?


Ich bin Anfänger und möchte mich gern weiterentwickeln, deswegen Frage 
ich Euch hier.

In meinem Programm läuft eine Nebenschleife zur Temperaturmessung ab.

Es soll nun aber nicht nach jeder Messung der Tempwert aufs LCD Display 
via 4bit Modus geschrieben werden, denn das blockiert mein Hauptprogramm 
während der Zeitdauer des Schreibvorganges.

Deswegen die Variable temp_Priorisierung


Mein Problem war auch, das die Temperaturausgabe stark um ein Grad 
flackerte.
Dies habe ich unterbunden, indem ich die 6 letzten berechneten 
Temperaturwerte gespeichert habe!
Nun wenn diese gleich waren und sich der berechnete WErt um 1° vom 
aktuell auf dem Display angezeigten WErt unterschied, sollte darauf 
geschrieben werden.
Hättet ihr den Code optimaler geschrieben? Insbesondere diesen ..
if (temperatur[0]==temperatur[1] && temperatur[1]==temperatur[2]...

Für ein paar Tipps bin ich Euch sehr dankbar.

Viele Grüße,

Matthias.
1
//Temperatursensorauswertung und Ausgabe
2
3
if (temp_Priorisierung>=4)         
4
5
//Die Temperaturmessung wird nur nach jedem 5.Durchlauf ausgeführt -->Priorisierung 
6
7
  {
8
  wert_temperatursensor=ADC_Read_Avg(Temperatursensor,20);      //Analogwert des Temperatursensors einlesen
9
    
10
  temperatur[i_temp]=wert_temperatursensor*5000UL/1024; 
11
// A/D-Wert in Spannung umrechnen (AREF=5V, 10 Bit A/D-Wandler: 2^10=1024)
12
  temperatur[i_temp]=temperatur[i_temp]-V_0GRAD;
13
  temperatur[i_temp]=temperatur[i_temp]/10;
14
  
15
  //Schreibe nur aufs Display, wenn die Werte die letzten 6 Werte gleich sind (kein Schwanken) und sich um mindestens 1° zur Anzeige auf dem Display  unterscheiden
16
  if (temperatur[0]==temperatur[1] && temperatur[1]==temperatur[2] && temperatur[2]==temperatur[3] && temperatur[3]==temperatur[4] && temperatur[4]==temperatur[5] && !(temperatur[i_temp]==temp_wert_LCD) )       
17
    {     
18
     //Flakkern der Tempwerte soll dadurch vermieden werden
19
    lcd_gotopos(4,17); lcd_writezahl (temperatur[i_temp]);         //Ausgabe der aktuell gemessenen GradZahl                    
20
    temp_wert_LCD=temperatur[i_temp];      
21
//speichern der ausgegebenen Temperatur, damit man weiß welcher Wert auf das Display geschrieben wurde
22
    }
23
  
24
  temp_Priorisierung=0;                
25
//Temperatur wurde gemessen, Zähler der Priorisierung wieder zurück setzen und auf die nächsten 5 Durchläufe warten
26
  }
27
28
else
29
  {
30
  temp_Priorisierung++;  
31
  }
32
33
i_temp++;            // erhöhe die Zählvariable von Null beginnend um 1
34
if (i_temp>5)        //hiermit wird die Zählvariable wieder auf Null gesetzt
35
  {
36
  i_temp=0;
37
  }

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Ja, das könnte man besser schreiben. Alles bis auf das If-Monster ist 
aber in Ordnung. Das könntest Du aber so lösen: Jedes Mal, wenn du 
i_temp erhöhst, prüfst Du, ob der aktuelle und der vorherige Wert 
übereinstimmen. Wenn nicht, dann löschst Du ein Flag. Das Flag setzt Du 
jedes Mal, wenn i_temp zurückgesetzt wird. Vor dem Zurücksetzen 
überprüfst Du noch, ob es gesetzt ist und gibst dann deinen Wert aus, 
wenn es gesetzt ist. Verstanden? ;)


Gruß
Jonathan

von Matthias H. (maethes26)


Lesenswert?

Jonathan Strobl schrieb:
> Ja, das könnte man besser schreiben. Alles bis auf das If-Monster ist
> aber in Ordnung. Das könntest Du aber so lösen: Jedes Mal, wenn du
> i_temp erhöhst, prüfst Du, ob der aktuelle und der vorherige Wert
> übereinstimmen. Wenn nicht, dann löschst Du ein Flag. Das Flag setzt Du
> jedes Mal, wenn i_temp zurückgesetzt wird. Vor dem Zurücksetzen
> überprüfst Du noch, ob es gesetzt ist und gibst dann deinen Wert aus,
> wenn es gesetzt ist. Verstanden? ;)
>
>
> Gruß
> Jonathan


Hallo Jonathan,

danke für Deine Unterstützung.
Ich vermute, dass man das If Monster eleganter schreiben kann. :-) 
Deswegen stelle ich den Code auch hier rein.

kann man den Vergleich nicht auch so schreiben?

if (temperatur[0]==temperatur[1]==temperatur[2]==temperatur[3] ...

das wäre doch auch schon eleganter.

Deine ERklärung verstehe ich leider nicht.
Wolltest Du damit das If-Monster entschärfen???

So halbwegs habe ich Deinen Weg verstanden?

klingt auch nicht schlecht, ist aber dann nicht mehr so leicht nachzu 
vollziehen wie meine eindeutiges If-Monster findest Du nicht auch??

Viele Grüße,

Matthias.

von Karl H. (kbuchegg)


Lesenswert?

Generell solltest du eher dem Problem nachgehen, warum sich deine 
Temperatur in kurzer Zeit scheinbar so stark verändert. Das muss ja 
einen Grund haben. Wenn du sowieso schon den Mittelwert aus 20 Messungen 
nimmst, dann sollte der ADC Wert eigentlich so gut wie gar nicht mehr 
schwanken.

Und das andere ist, dass man solche Nebenschauplätze im Programm ruhig 
mit einem Timer im Sekundentakt anstossen kann. Temperaturen ändern sich 
nicht so schnell und da sowieso ein Mensch nur eine begrenzte 
Ablesegeschwindigkeit hat, reichen 1 Sekunde zwischen 2 Messungen locker 
aus.
Wenn sich dann der Messwert jede Sekunde tatsächlich +-1 verändert (weil 
die Temperatur tatsächlich auf der Kippe steht), dann ist das dann auch 
ok, wenn dann auch wirklich die Einerstelle 'ständig' umspringt.

von Matthias H. (maethes26)


Angehängte Dateien:

Lesenswert?

Karl Heinz Buchegger schrieb:
> Generell solltest du eher dem Problem nachgehen, warum sich deine
> Temperatur in kurzer Zeit scheinbar so stark verändert. Das muss ja
> einen Grund haben. Wenn du sowieso schon den Mittelwert aus 20 Messungen
> nimmst, dann sollte der ADC Wert eigentlich so gut wie gar nicht mehr
> schwanken.

anbei ein Bild von meinem Aufbau. Das markierte Kabel liefert das 
Analogsignal hin zum Atmega32.
Als Referenzspannung nehme ich die 5V Versorgung meines selbst gebauten 
Schaltreglernetzteils.

Das liefert ja auch schon keine glatte Spannung +-30mV SChwankungen sind 
da schon bei. Der Atmega hat eine Auflösung von 10bit.

Dann kommt wahrscheinlich noch das ungeschützte Analogkabel dazu, was 
sich frei in der Luft vieles einfangen kann, oder?

Sollte ich darum noch eine Groundleitung legen?


> Und das andere ist, dass man solche Nebenschauplätze im Programm ruhig
> mit einem Timer im Sekundentakt anstossen kann. Temperaturen ändern sich
> nicht so schnell und da sowieso ein Mensch nur eine begrenzte
> Ablesegeschwindigkeit hat, reichen 1 Sekunde zwischen 2 Messungen locker
> aus.

so sehe ich das auch. Bis jetzt habe ich nur noch keinen Timer 
verwendet, weil ich mich damit noch nicht beschäftigt habe.

> Wenn sich dann der Messwert jede Sekunde tatsächlich +-1 verändert (weil
> die Temperatur tatsächlich auf der Kippe steht), dann ist das dann auch
> ok, wenn dann auch wirklich die Einerstelle 'ständig' umspringt.

das springen der Einerstelle fand ich nicht schön und habe es daher über 
dieses IF-Monster gelöst.

Ich wollte Euch fragen, ob man diese If-Bedingung nicht noch eleganter 
und kürzer ausdrücken kann als wie ich es gelöst habe.

Viele Grüße,

Matthias.

von Karl H. (kbuchegg)


Lesenswert?

Matthias H. schrieb:

> Ich wollte Euch fragen, ob man diese If-Bedingung nicht noch eleganter
> und kürzer ausdrücken kann als wie ich es gelöst habe.


:-)
Lass das if-Monster weg und sample 40 mal.

Aber im Ernst: Nimm eine ordentliche Spannungsversorgung, wenn du mit 
dem ADC arbeiten willst. Das ist doch kein Zustand, wenn du keine 
vernünftige Referenzspannung hast.

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.