-
Das geht recht einfach.
Nehmen wir mal an Position 1 ist die 20° Marke und jede weitere 5° mehr.
Wenn du deinen AD-Wert nun mit dem Datazeileninhalt vergleichen willst dann nimmste ne Schleife
Du vergleichst ob der Gelesene Wert kleiner als der jeweilige Tabellenwert ist.
Ist der Fall gegeben dann ist der Rest einfach.
Der Gefundene Wert errechnet sich für Tempmaximum 20+((x-1)*5) und das Minimum dann mit 20+((x-2)*5)
Dazwischen wird dann einfach gemittelt.
also Schrittweite =Maximum-Minimum
Abstand zum Maximum = Maximum-Aktuell.
Endwert=Maximum-(Abstand zum Maximum *Schrittweite)
DerEndwert ist dann in °Celsius
Durch die Schleife sparst du nochmal beträchtlich an platz.
-
Alles klar, ich glaube ich habs.
Stelle den code mal rein. Dann kannst du bze ihr euch das ja mal angucken.
Von 91% auf bis jetzt 16% runter programmiert! :-)
Ohne den Aufruf der Print Befehle sogar nur 7%, also die reine Berechnung.
gute Nacht
Code:
$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600
Dim Volt As Integer
Dim Ist As Integer
Dim Ist2 As Integer
Dim Istwert As Integer
Dim Tempwert As Byte
Dim Maxwert As Integer
Dim Minwert As Integer
Dim Differenz As Integer
Dim Abstand As Integer
Dim Differenz5 As Integer
Dim Abstand5 As Integer
Dim Temperatur As Integer
Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc
Do
Ist = -1
Do
Minwert = Lookup(ist , Dta)
Volt = Getadc(0)
Incr Ist
Maxwert = Lookup(ist , Dta)
Loop Until Volt <= Maxwert
Tempwert = Ist * 5
Tempwert = 20 + Tempwert
Differenz = Maxwert - Minwert
Abstand = Maxwert - Volt
Differenz5 = Differenz / 5
Abstand5 = Abstand / Differenz5
Temperatur = Tempwert - Abstand5
Print " Zähler: " ; Ist
Print " Temperatur Grundwert: " ; Tempwert
Print " Analogsignal: " ; Volt
Print " Maximalwert: " ; Maxwert
Print " Minimalwert: " ; Minwert
Print " Differenz: " ; Differenz
Print " Abstand zum Maximum: " ; Abstand
Print " Differenz durch5: " ; Differenz5
Print " Abstand durch differen5: " ; Abstand5
Print " Isttemperatur: " ; Temperatur
Print
Wait 2
Loop
End
Dta:
Data 515% , 567% , 616% , 662% , 705% , 744% , 779% , 811% , 838% , 862% , 882% , 900% , 916% , 929% , 941% , 951% , 959% , 966% , 973% , 978% , 983% ,
-
Ich hab das jetzt nur überflogen.
Ist schon wesentlich kürzer und wenn die Routine läuft kann man da noch ne Variable einsparen.
Die Formel scheint soweit ok aber ich meine das bei den beiden letzten Zeilen vor den Prints noch irgendwas nicht stimmt aber da kann ich auch irren.
Ich muß das Heut nachmittag mal Exemplarisch durchrechnen bevor ich da was zu sage.
-
So habe nochmals weiter gemacht.
Habe die Berechnung jetzt in ein Sub gepackt.
Somit kann ich jetzt relativ einfach mehrere Fühler abfragen.
Habe es einfach mal mit 4 Fühlern gemacht.
Alle Werte berechnet und auf ein LCD geschrieben und 17% Ausgenutzt.
Ich denke das geht jetzt so, oder??
Oder was könnte man noch optimieren.
Was ich jetzt noch machen wollte ist das ich vor dem Aufruf des Sub Berechnung vorgeben kann welchen wert er nimmt. Also es werden unten 10 verschiedene Data Zeilen kommen. Und da soll halt der richtige gewählt werden. Kann ich bei Lookup auch eine Variable angeben.
Also anstatt dta die variable und vor dem Sub Berechnung dann einfach sagen Variable = DTA2 oder DTA3 usw usw
So das war erst mal wieder genug für heute.
Hänge den code nochmal an.
Ciao
und schönes Wochenende noch euch allen.
Code:
$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600
Dim Adcwert As Integer , Volt1 As Integer , Volt2 As Integer , Volt3 As Integer , Volt4 As Integer
Dim Ist As Integer , Ist2 As Integer , Istwert As Integer
Dim Tempwert As Byte , Maxwert As Integer , Minwert As Integer , Differenz As Integer
Dim Abstand As Integer , Temperatur As Integer
Declare Sub Berechnung
Declare Sub Ausser_bereich
Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc
Cursor Off
Do
Cls
Volt1 = Getadc(0)
Volt2 = Getadc(1)
Volt3 = Getadc(2)
Volt4 = Getadc(3)
Adcwert = Volt1
' Adcwert = 400
Berechnung
Locate 1 , 1
Lcd "1: " ; Temperatur
' Adcwert = Volt2
Adcwert = 400
Berechnung
Locate 1 , 10
Lcd "2: " ; Temperatur
' Adcwert = Volt3
Adcwert = 500
Berechnung
Locate 2 , 1
Lcd "3: " ; Temperatur
' Adcwert = Volt4
Adcwert = 600
Berechnung
Locate 2 , 10
Lcd "4: " ; Temperatur
Waitms 500
Loop
End
Sub Berechnung
If Adcwert > 945 Then Goto Ende1
If Adcwert < 179 Then Goto Ende1
Ist = -1
Do
Minwert = Lookup(ist , Dta)
Incr Ist
Maxwert = Lookup(ist , Dta)
Loop Until Adcwert <= Maxwert
Tempwert = Ist * 5 ' Brechnung welche Temperaturgrundwert gerade gewählt ist
Differenz = Maxwert - Minwert ' Differenz zwischen Maxwert und Minwert
Abstand = Maxwert - Adcwert ' Abstand zwischen Grundwert zum Istwert
Differenz = Differenz / 5 ' Differenz durch 5 Teilen um die Analogwertänderung pro 1°C zu erhalten
Abstand = Abstand / Differenz ' Abstand durch Differenz teilen um auf den Wert zu kommen der vom Grundwert abgezogen wird
Temperatur = Tempwert - Abstand ' Aktuelle Temperatur Errechnung
Ende1:
End Sub
'----------------Datenzeile für 1000Ohm Vorwiderstand--------------------
'Dta:
'Data 305% , 356% , 409% , 462%, 515% , 567% , 616% , 662% , 705% , 744% , 779% , 811% , 838% , 862% , 882% , 900% , 916% , 929% , 941% , 951% , 959% , 966% , 973% , 978% , 983% ,
'----------------Datenzeile für 500 Ohm Vorwiderstand--------------------
Dta:
Data 179% , 215% , 255% , 299% , 344% , 392% , 440% , 489% , 538% , 584% , 629% , 671% , 709% , 744% , 775% , 803% , 828% , 850% , 870% , 887% , 902% , 915% , 926% , 936% , 945%,
Edit:
Ach ja und was noch fehlt ist die Abfrage wenn er kleiner als 0°C oder größer as 120°C ist, damit er dann den Wert LO oder Hi ausgibt, aber das wird ja wohl das kleinste übel sein
-
Zu Lo/Hi :
Da kannste draus machen was dir gefällt und was Sinvoll ist.
Ich zb. gehe bei den Werten in einer Tempgesteuerten Lüftersteuerung davon aus das entweder der Fühler ab/Kurzgeschlossen ist oder die Temperaturen wirklich ausserhalb des zugelassenen Bereichs ist.
Ergo gehe ich auf Nummer Sicher und Schalte die Lüfter auf 100% und gebe Alarm (LED,Summer,Schaltausgang usw. je nach vorhandenen Möglichkeiten)
Zu Optimieren:
Das ergibt sich wenn der Speicher wieder knapp wird.
Da kannste dann sehen was man vereinfachen kann auch wenn es unüpbersichtlicher wird.
Wart erstmal ab.
Zu verschiedene Labels.
Gute Frage,hab ich so noch nicht probiert aber vieleicht läst sich da was mit Alias machen.
Ansonsten kannste die Datazeilen auch einfach ins EEProm schieben.
Das bringt wieder mehr Platz und was im EEprom steht hat eine Adresse.
Die Adrresse ist eine Zahl und damit kannste wieder was im Programm anfangen.
Zb. indem du für die entsprechende Tabelle einen Offset(Tabellenstart) vorgibst.
Das ist zwar ne Zählervariable mehr aber recht praktisch.
-
OK, mit dem Hi/LO werde ich mich nochmal beschäftigen, sollte aber das kleinste Problem darstellen.
Und mit den Labels werde ich nochmal testen ob und wie es geht.
Danke nochmal für die Hilfe.
Hab da noch ein paar Fragen die aber sehr in eine andere Richtung laufen. Werde dazu einen neuen Thread aufmachen.
Ciao Marco
-
-
Da ich ja im Momnt Probleme mit dem Programm für den Attiny habe habe ich mich nochmal mit dem Temperaturmessprogramm beschäftigt.
Es wird jetzt auch ein Druckgeber ausgewertet.
Klappt auch soweit ganz gut, mal abgesehen davon das das wieder echzt Speicherfressend ist. Ich musste mit Kommazahlen rechnen, und das wird das Problem sein, oder?
Werde mich da nachher mal mit beschäftignen das ich die Kommas raus bekomme
Code:
$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600
Dim Adctemp As Integer , Adcdruck As Integer , Volt1 As Integer , Volt2 As Integer , Volt3 As Integer , Volt4 As Integer
Dim Ist As Integer , Ist2 As Integer , Istwert As Integer
Dim Tempwert As Single , Maxwert As Integer , Minwert As Integer , Differenz As Single
Dim Abstand As Single , Temperatur As Integer , Istdruck As Single
Declare Sub Temp
Declare Sub Druck
Declare Sub Ausser_bereich
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Cursor Off
Do
Cls
Volt1 = Getadc(0)
Volt2 = Getadc(1)
Volt3 = Getadc(2)
Volt4 = Getadc(3)
' Adctemp = Volt1
Adctemp = 887
Temp
Locate 1 , 1
Lcd "1: " ; Temperatur
' Print " Isttemperatur1: " ; Temperatur
' Print
' Adctemp = Volt2
Adctemp = 400
' Temp Alias Temp2
Temp
Locate 1 , 10
Lcd "2: " ; Temperatur
' Print " Isttemperatur2: " ; Temperatur
' Print
' Adcwert = Volt3
Adcdruck = 325
Druck
Locate 2 , 1
Lcd "3: " ; Istdruck
' Print " Isttemperatur3: " ; Istdruck
' Print
' Adcwert = Volt4
' Adcwert = 600
' Berechnung
' Locate 2 , 10
' Lcd "4: " ; Temperatur
' Print " Isttemperatur4: " ; Temperatur
' Print "---------------------------------------------------------"
Waitms 500
Loop
End
Sub Temp
If Adctemp > 945 Then Goto Endetemp
If Adctemp < 179 Then Goto Endetemp
Ist = -1
Do
Minwert = Lookup(ist , Tempwerte)
Incr Ist
Maxwert = Lookup(ist , Tempwerte)
Loop Until Adctemp <= Maxwert
Tempwert = Ist * 5 ' Brechnung welche Temperaturgrundwert gerade gewählt ist
Differenz = Maxwert - Minwert ' Differenz zwischen Maxwert und Minwert
Abstand = Maxwert - Adctemp ' Abstand zwischen Grundwert zum Istwert
Differenz = Differenz / 5 ' Differenz durch 5 Teilen um die Analogwertänderung pro 1°C zu erhalten
Abstand = Abstand / Differenz ' Abstand durch Differenz teilen um auf den Wert zu kommen der vom Grundwert abgezogen wird
Temperatur = Tempwert - Abstand ' Aktuelle Temperatur Errechnung
Endetemp:
End Sub
Sub Druck
If Adcdruck > 945 Then Goto Endedruck
If Adcdruck < 179 Then Goto Endedruck
Ist = -1
Do
Minwert = Lookup(ist , Druckwerte)
Incr Ist
Maxwert = Lookup(ist , Druckwerte)
Loop Until Adcdruck <= Maxwert
Tempwert = Ist * 50 ' Brechnung welche Temperaturgrundwert gerade gewählt ist
Tempwert = Tempwert / 100
Differenz = Maxwert - Minwert ' Differenz zwischen Maxwert und Minwert
Abstand = Maxwert - Adcdruck ' Abstand zwischen Grundwert zum Istwert
Differenz = Differenz / 5 ' Differenz durch 5 Teilen um die Analogwertänderung pro 1°C zu erhalten
Abstand = Abstand / Differenz ' Abstand durch Differenz teilen um auf den Wert zu kommen der vom Grundwert abgezogen wird
Abstand = Abstand / 10
Istdruck = Tempwert - Abstand ' Aktuelle Temperatur Errechnung
Endedruck:
End Sub
' - - - - - - - - - - - - - - - -Datenzeile Temperatursensor mit 500Ohm Vorwiderstand - - - - - - - - - - - - - - - - - - - -
Tempwerte:
Data 179% , 215% , 255% , 299% , 344% , 392% , 440% , 489% , 538% , 584% , 629% , 671% , 709% , 744% , 775% , 803% , 828% , 850% , 870% , 887% , 902% , 915% , 926% , 936% , 945%,
' - - - - - - - - - - - - - - - -Datenzeile Drucksensor mit 20mA Konstantstromquelle - - - - - - - - - - - - - - - - - - - -
Druckwerte:
Data 42% , 86% , 128% , 170% , 211% , 251% , 291% , 329% , 367% , 404% , 440% , 475% , 509% , 543% , 575% , 607% , 638% , 668% , 697% , 726% , 753%
-
Ja, Single bzw. Double sind wahre Speicherfresser und sollten nur wenn nötig verwendet werden.
Wenn es nur um max 3 Stellen hinterm Komma geht dann kannste lieber mit Word oder Long arbeiten und die zu bearbeitenden Zahlen einfach vorher Multiplizieren.
Also statt 23/5 dann 230/50 bzw. 2300/500
So kommste ohne Flieskommas aus,der Fehler bleibt erträglich und du sparst reichlich platz.
-
OK, das werde ich dann jetzt mal testen.
Danke schonmal.