PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tempmessung mit NTC und Atmega 8.



astro9481
25.01.2006, 23:50
Hallo,
ich habe mal ein Programm geschrieben mit dem ich die Temperatur messen kann. Als Fühler nheme ich einen BMW(VDO) Temperaturfühler(NTC)
Ich habe dann einen 1kohm widerstand und den NTC in reihe geschaltet und zwischen den beden Widerständen das Sognal für den ADC abgegriffen.

Soweit so gut. Allerdings habe ich die Weerte nicht in Bascom berechnet sonder in excel und habe dann nur alle Wete eingegeben un dmit dem Case Befehl den richtigen wert ausgegeben.

Jetzt meine Frage besteht die Möglichkeit das ich das auch direkt in Bascom berechne? Weil das ist ja nicht die feine Art. Klappt zwar hervorragend und auch recht genau. Aber es sind auch schon 91% des Speichers des Mega 8 belegt. Und ioch will ja auch noch ein Display und eine Druckmessung realisieren. Die Druckgeber haben eine Polynomfunktion direkt angegeben. Damit kann ich doch eigentlich direk den Druck errechnen, oder? Ich muss doch dann nur aus dem Strom und der Spannung den Widerstand errechnen und darauss dann den Druck, oder?


Hänge den code einfach mal dran. Könnt ihr euch ja mal angucken. Und vielleicht ein paar Tips geben.

Cia Marco

$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600

Declare Sub Fall

Dim Temp As Integer
Dim Volt As Integer

Ddrb = &B00000001
Original Alias Pinb.3
Auf Alias Pinb.5
Zu Alias Pinb.4
Relais Alias Portb.0

Set Portb.3
Set Portb.4
Set Portb.5

Config Adc = Single , Prescaler = Auto , Reference = Internal

Start Adc
Cursor Off
Cls
Locate 1 , 2
Lcd Chr(239) ; "ltemp:"
Locate 1 , 13
Lcd Chr(223) ; "C"
Lowerline
Lcd Chr(239) ; "ltemp2:"
Locate 2 , 13
Lcd Chr(223) ; "C"

Do

Volt = Getadc(0)
Locate 1 , 9
Fall
Volt = Getadc(1)
Locate 2 , 9
Fall

Waitms 10
Loop
End


Sub Fall
Select Case Volt
Case 0 To 515
Lcd " LO "
Case 515 To 525
Lcd " 21 "
Case 525 To 535
Lcd " 22 "
Case 535 To 545
Lcd " 23 "
Case 545 To 556
Lcd " 24 "
Case 556 To 567
Lcd " 25 "
Case 567 To 576
Lcd " 26 "
Case 576 To 585
Lcd " 27 "
Case 585 To 595
Lcd " 28 "
Case 595 To 605
Lcd " 29 "
Case 605 To 616
Lcd " 30 "
Case 616 To 625
Lcd " 31 "
Case 625 To 634
Lcd " 32 "
Case 634 To 643
Lcd " 33 "
Case 643 To 653
Lcd " 34 "
Case 653 To 662
Lcd " 35 "
Case 662 To 670
Lcd " 36 "
Case 670 To 679
Lcd " 37 "
Case 679 To 687
Lcd " 38 "
Case 687 To 696
Lcd " 39 "
Case 696 To 705
Lcd " 40 "
Case 705 To 713
Lcd " 41 "
Case 713 To 720
Lcd " 42 "
Case 720 To 728
Lcd " 43 "
Case 728 To 736
Lcd " 44 "
Case 736 To 744
Lcd " 45 "
Case 744 To 751
Lcd " 46 "
Case 751 To 758
Lcd " 47 "
Case 758 To 765
Lcd " 48 "
Case 765 To 772
Lcd " 49 "
Case 772 To 779
Lcd " 50 "
Case 779 To 785
Lcd " 51 "
Case 785 To 791
Lcd " 52 "
Case 791 To 798
Lcd " 53 "
Case 798 To 804
Lcd " 54 "
Case 804 To 811
Lcd " 55 "
Case 811 To 816
Lcd " 56 "
Case 816 To 821
Lcd " 57 "
Case 821 To 827
Lcd " 58 "
Case 827 To 832
Lcd " 59 "
Case 832 To 838
Lcd " 60 "
Case 838 To 843
Lcd " 61 "
Case 843 To 847
Lcd " 62 "
Case 847 To 852
Lcd " 63 "
Case 852 To 857
Lcd " 64 "
Case 857 To 862
Lcd " 65 "
Case 862 To 866
Lcd " 66 "
Case 866 To 870
Lcd " 67 "
Case 870 To 874
Lcd " 68 "
Case 874 To 878
Lcd " 69 "
Case 878 To 882
Lcd " 70 "
Case 882 To 886
Lcd " 71 "
Case 886 To 889
Lcd " 72 "
Case 889 To 893
Lcd " 73 "
Case 893 To 897
Lcd " 74 "
Case 897 To 900
Lcd " 75 "
Case 900 To 903
Lcd " 76 "
Case 903 To 906
Lcd " 77 "
Case 906 To 909
Lcd " 78 "
Case 909 To 913
Lcd " 79 "
Case 913 To 916
Lcd " 80 "
Case 916 To 918
Lcd " 81 "
Case 918 To 921
Lcd " 82 "
Case 921 To 924
Lcd " 83 "
Case 924 To 926
Lcd " 84 "
Case 926 To 929
Lcd " 85 "
Case 929 To 931
Lcd " 86 "
Case 931 To 934
Lcd " 87 "
Case 934 To 936
Lcd " 88 "
Case 936 To 938
Lcd " 89 "
Case 938 To 941
Lcd " 90 "
Case 941 To 943
Lcd " 91 "
Case 943 To 945
Lcd " 92 "
Case 945 To 947
Lcd " 93 "
Case 947 To 949
Lcd " 94 "
Case 949 To 951
Lcd " 95 "
Case 951 To 952
Lcd " 96 "
Case 952 To 954
Lcd " 97 "
Case 954 To 956
Lcd " 98 "
Case 956 To 957
Lcd " 99 "
Case 957 To 959
Lcd "100 "
Case 959 To 961
Lcd "101 "
Case 961 To 962
Lcd "102 "
Case 962 To 963
Lcd "103 "
Case 963 To 965
Lcd "104 "
Case 965 To 966
Lcd "105 "
Case 966 To 968
Lcd "106 "
Case 968 To 969
Lcd "107 "
Case 969 To 970
Lcd "108 "
Case 970 To 971
Lcd "109 "
Case 971 To 973
Lcd "110 "
Case 973 To 974
Lcd "111 "
Case 974 To 975
Lcd "112 "
Case 975 To 976
Lcd "113 "
Case 976 To 977
Lcd "114 "
Case 977 To 978
Lcd "115 "
Case 978 To 979
Lcd "116 "
Case 979 To 980
Lcd "117 "
Case 980 To 981
Lcd "118 "
Case 981 To 982
Lcd "119 "
Case 982 To 983
Lcd "120 "
Case 983 To 1025
Lcd " HI "
End Select

End Sub

Ratber
26.01.2006, 03:51
Ja,das funktioniert aber ist etwas "Windowslike".

Leg dir ne gröbere Tabelle an (zb 5° Schritte)
Mit dem Gemessenen Wert und der Tabelle kannste dann die Temperatur errechnen.
Mit der Formelrechnung biste wesentlich kürzer im Code und hast dann mehr platz für Anderes.

astro9481
26.01.2006, 08:01
Ja deswegen frage ich ja hier nach weil ich wollte eigentlich keinen größeren uC nehmen.

Wie meinst du das ,mit der gröberen Tabelle? und wie kome ich auf die Teilschritte? Einfach 3satz oder wie? Obwohl stimmt ja habe ich ja jetzt auch gemacht. Somit hätte ich nur ein 5.tel der Daten, müsste aber dann nochmal rechnen. Oder versteh ich da jetzt was falsch?

ciao Marco

Tom K
26.01.2006, 12:34
Gibt es in Bascom einen Befehl wie bei C++ der heist "table"?
wie zb..



kt ist Kesseltemperatur
ks ist Kesselsensor(AD-Wert)
Looktab verweis zu einer Tabelle
tempe Name der Tabelle


kt=looktab(tempe,ks)

table tempe
0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8
8 9 9 10 10 11 11 12 12 12 13 13 14 14 14 15 15 16
16 16 17 17 18 18 18 19 19 20 20 20 21 21 22 22 22 23 23 23
24 24 25 25 25 26 26 27 27 27 28 28 29 29 29 30 30 31 31 31
32 32 32 33 33 34 34 34 35 35 36 36 36 37 37 38 38 38 39 39
40 40 40 41 41 42 42 42 43 43 43 44 44 45 45 45 46 46 47 47
47 48 48 49 49 49 50 50 51 51 51 52 52 52 53 53 54 54 54 55
55 56 56 56 57 57 58 58 58 59 59 60 60 60 61 61 62 62 62 63
63 63 64 64 65 65 65 66 66 67 67 67 68 68 69 69 69 70 70 71
71 71 72 72 72 73 73 74 74 74 75 75 76 76 76 77 77 78 78 78
79 79 80 80 80 81 81 82 82 82 83 83 83 84 84 85 85 85 86 86
87 87 87 88 88 89 89 89 90 90 91 91 91 92 92 92 93 93 94 94
94 95 95 96 96 96 97 97 98 98 98 99 99 100 100
end table

astro9481
26.01.2006, 13:19
Mal ne Frage zu dem c++ Code!
Sehe ich das richtig das das Programm einen bestimmten wert in der Tabelle sucht und den dazugehörigen Partner dann den Wert zuweist??

Tom K
26.01.2006, 14:41
so ist´s richtig wie su es siehst.
Wenn du nachzählst sind es 255 oder 256 Zahlen von 0-100
und ad-wert =1 => tab-wert=0
ad-wert =256 => tab-wert=100

Ringo
26.01.2006, 16:23
Es gibt so einen Befehl schau ma in der Bascom Hilfe nach "Lookup"

MfG
Ringo

Ratber
26.01.2006, 16:54
Ja deswegen frage ich ja hier nach weil ich wollte eigentlich keinen größeren uC nehmen.

Wie meinst du das ,mit der gröberen Tabelle? und wie kome ich auf die Teilschritte? Einfach 3satz oder wie? Obwohl stimmt ja habe ich ja jetzt auch gemacht. Somit hätte ich nur ein 5.tel der Daten, müsste aber dann nochmal rechnen. Oder versteh ich da jetzt was falsch?

ciao Marco

Das ist einfache Mathematik.
Du hast 2 Eckwerte.
zb. 1926 Ohm für 20° und 2000 für 25°
Bei 1K als Vorwiderstand an 5V sind das 3.291V und 3.333V.
Also 42mV differenz auf 5° .
macht also 8.4mV pro Grad.
Der Rest ist Rechnen.
Auf dem Papier haste es ja schon getan also mußte das einfach nur nochmal als Programm umsetzen.

Zur Größe des Controllers.:

Ich hab ne komplette Lüftersteuerung mit PWM,Tempfühler,Drehzahlkennlinie für den Lüfter und Serieller Komunikaton unter Bascom in nen Tiny13 gesteckt und immernoch satte 132 Byte Flash frei.
Das reicht noch für nen 2. Kanal hab ich mir gesagt und es ging dann auch leichten änderungen am Code.
Als dann immernoch 73 Byte Flash frei waren hab ich der Schaltung noch nen Alarmausgang spendiert wo ein einfacher Piezosummer darüber informiert wenn die Temp. ausserhalb des zugelassenen Bereiches liegt.

Es ist also kein großer Controller nötig wenn man sich nur etwas mühe gibt.
Studiere die Hilfe mal durch.
Es gibt ne Menge Bfehle die einem helfen.

Edit:Schreibfehler.

astro9481
26.01.2006, 18:52
Ja ok, so meinte ich das ja auch. Ich berechne die werte für alle 5°C schritte und den rest rechne ich dann um. Habe ich ja in Excel auch so gemacht. Werde mich da nachher mal ran begeben. Melde mich dann später nochmal.

Ciao Marco

astro9481
26.01.2006, 21:53
Nochmal zum Verständnis, die werte für alle 5°C gebe ich aber weiterhin ein, oder? Und rechne dann nur die zwischenräume aus.

Ratber
26.01.2006, 22:03
Ja,richtig.

Auf der halben differenz (Also in der Mitte 2.5° vom nächsten Stützwert) ist die Abweichung vernachlässigbar.

astro9481
27.01.2006, 00:08
Ich glaube ich habs,
habe es zumindest sowetit das der code nur noch 40% bracuht, also mal eben 50% eingespart.

Ihr könnt mir ja evtl nochmal einen Tip geben um das weiter zu verkürzen, oder ist das so schon OK?

Ich habe alles in excel aufbereitet und musste dann nachher nur aus excel in bascom rauskopieren. Das klappt hervorragend.
Ich hänge die Excelliste auch mal an. Dann seht ihr auch die Werte die ich berechnet habe und die Werte die der mega errechnet hat.





$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600

Declare Sub Fall

Dim Temp As Integer
Dim Volt As Integer
Dim Differenz As Integer
Dim Helfer As Integer
Dim Startwert As Integer
Dim Wert As Integer
Dim Anzeige As Integer


Ddrb = &B00000001
Original Alias Pinb.3
Auf Alias Pinb.5
Zu Alias Pinb.4
Relais Alias Portb.0

Set Portb.3
Set Portb.4
Set Portb.5

Config Adc = Single , Prescaler = Auto , Reference = Internal

Start Adc
Cursor Off
Cls
Locate 1 , 2
Lcd Chr(239) ; "ltemp:"
Locate 1 , 13
Lcd Chr(223) ; "C"
Lowerline
Lcd Chr(239) ; "ltemp2:"
Locate 2 , 13
Lcd Chr(223) ; "C"

Do

Volt = Getadc(0)

Locate 1 , 9
Fall
Print "vor berechnung"
Print "startwert:" ; Startwert
Print "Tempstartwert:" ; Temp
Print "Differenz:" ; Differenz
Print
Helfer = Differenz / 5 'analogwert um wieviel verändern damit temperatur um 1 größer
Wert = Volt - Startwert
Wert = Wert / Helfer
Anzeige = Temp + Wert
Print "Ergebnisse"
Print "Isttemperatur" ; Anzeige
Print "aufzu addierender Wert:" ; Wert
Print "Helfer für Berechnunng:" ; Helfer

Wait 2
Loop
End


Sub Fall
Select Case Volt 'startwertetabelle für alle 5°C
Case 0 To 515
Lcd " LO "
Case 515 To 567
Startwert = 515
temp= 20
differenz= 51

Case 567 to 616
startwert= 567
temp= 25
differenz= 49

Case 616 to 662
startwert= 616
temp= 30
differenz= 46

Case 662 to 705
startwert= 662
temp= 35
differenz= 43

Case 705 to 744
startwert= 705
temp= 40
differenz= 39

Case 744 to 779
startwert= 744
temp= 45
differenz= 35

Case 779 to 811
startwert= 779
temp= 50
differenz= 32

Case 811 to 838
startwert= 811
temp= 55
differenz= 27

Case 838 to 862
startwert= 838
temp= 60
differenz= 24

Case 862 to 882
startwert= 862
temp= 65
differenz= 21

Case 882 to 900
startwert= 882
temp= 70
differenz= 18

Case 900 to 916
startwert= 900
temp= 75
differenz= 16

Case 916 to 929
startwert= 916
temp= 80
differenz= 13

Case 929 to 941
startwert= 929
temp= 85
differenz= 12

Case 941 to 951
startwert= 941
temp= 90
differenz= 10

Case 951 to 959
startwert= 951
temp= 95
differenz= 8

Case 959 to 966
startwert= 959
temp= 100
differenz= 7

Case 966 to 973
startwert= 966
temp= 105
differenz= 6

Case 973 to 978
startwert= 973
temp= 110
differenz= 6

Case 978 to 983
startwert= 978
temp= 115
differenz= 5

Case 983 to 987
startwert= 983
temp= 120
differenz= 4


Case 987 To 1025
Lcd " HI "
End Select

End Sub

Ratber
27.01.2006, 00:48
Also ganz genau hab ich mir das jetzt nicht angesehen aber die vielen Case-anweisungen sind zuviel.

Das kann man besser mit ner Schleife erledigen.

Die Stützpunktwerte kannst du in einer Datazeile verewigen dann kann man das Abklappern auch per Schleifenzähler erledigen.
Das macht dann Codemäßig nen schlanken Fuß



Mit nem KTY-81-210 wäre das ne Sache von 5 Zeilen Code bis du deine Temp hast.
Muß es denn unbedingt dieser Fühler sein ?

astro9481
27.01.2006, 12:22
OK, werde dann da nochmal ran gehen. Aber war ja auhc schn spät gestern. Und von 91% auf 41% ist ja schonmal was.

Werde dann das nochmal mit der Datazeile versuchen.

Wegen dem Fühler:
Ja es muss dieser Fühler sein, weil das fürs Auto eine Öltemperatur anzeige wird. Und da gibts halt nur entweder original BMW, VW, Audi usw oder halt Fühler von VDO. Und ich habe halt diese VDO Fühler. Das Problem ist das Einschraubgewinde der Fühler. Man könnte höchsten so einen Fühler kaufen den aufbohren und einen anderen einbauen. Aber das wollte ich eigentlich vermeiden.

Werde mir am WE auch noichmal die Polynomfunktion zu Gemüte führen. Um die Werte des Öldruckgebers direkt zu berehcnen, also ohne die Wertetabelle. Bei den Druckgebern sind die Polynomfunktionen ja angegeben. Bei den Temperaturfühlern leider nicht.

Melde mich dann nochmal wenns neue Ergebnisse gibt.
Und danke nochmal. Bin erst vor knapp 2-3Wochen mit uC programmieren angefangen. Aber klappt schon recht gut wie ich finde. Also habt ein nachsehen falls ich komische oder blöde Fragen stelle :wink:

ciao Marco


EDIT: Was meinst du mit Datazeile?? Dieses Lookup???

Ratber
27.01.2006, 14:13
Zu fühler:

Ja,gut,wenn es nicht anders geht dann gehts eben nicht anders.


Und danke nochmal. Bin erst vor knapp 2-3Wochen mit uC programmieren angefangen. Aber klappt schon recht gut wie ich finde. Also habt ein nachsehen falls ich komische oder blöde Fragen stelle

Das wird schon.



Was meinst du mit Datazeile?? Dieses Lookup???

Bevor ich mir Fransen anne Finger tipper ackerst du am besten mal die Hilfe dazu durch.
Ds ist recht einfach.

astro9481
27.01.2006, 14:14
Ja habs schon gefunden, bin da gerade mit am spielen.

Ratber
27.01.2006, 14:18
Ja,probier einfach mal einwenig damit rum um ein gefühl dafür zu bekommen.
Die Verweise auf zusammenhängende Befehler ebenfalls.

astro9481
27.01.2006, 14:31
Ich habe jetzt ma ein bißchen getestet,
bin im moment der Meinung das ich am einfachsten 3 Datenreihen mache undd dann mit dem Befehl look up die Stützpunktwerte einlese.
Und dann die gleiche Berechnung wie die von gestern. Nur hole ich mir die Daten halt anders.
Kann man datenreihen auch übere mehrer zeilen schrieben?, er macht immer ein fehler wenn nicht alle sin einer reihe steht, ahe es mit sämtlichen kombinationen aus leerzeihchen und komma probiert.


Meinst du das so?
oder habe ich wieder die verkehrte richtung eingeschlagen.

Ratber
27.01.2006, 15:36
Ja richtig.
Ringo hat es ja schon angesprochen.

Mit Lookup (Zähler,Wert) kannste die Werte schön einfach ansprechen und mit ner Schleife abfragen was wesentlich kürzer als die lange Casereihe ist.


Kann man datenreihen auch übere mehrer zeilen schrieben?, er macht immer ein fehler wenn nicht alle sin einer reihe steht, ahe es mit sämtlichen kombinationen aus leerzeihchen und komma probiert.

Du kannst in einer Zeile 256 Zeichen unterbringen.
Was wollteste denn unterbringen ?

astro9481
27.01.2006, 17:59
OK, ich schreibe dann die werte mal in die Data Zeile.
Schreibe dann alle 5°C schritte ein. Musss halt nur mal gucken wie ich das mache das der uC auch weiß welches Feld er jetzt nehmen muss. Aber das bekomme ich schon hin.
Werdfe da nochmal ein bißchen mit rumtesten.

Dank euch allen.

ciao Marco

Ratber
27.01.2006, 20:10
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.

astro9481
28.01.2006, 01:17
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


$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% ,

Ratber
28.01.2006, 06:20
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.

astro9481
28.01.2006, 17:17
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.




$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

Ratber
28.01.2006, 19:48
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.

astro9481
29.01.2006, 13:51
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

Ratber
30.01.2006, 01:52
Yo,kein Problem

astro9481
04.02.2006, 18:01
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


$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%

Ratber
04.02.2006, 18:15
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.

astro9481
04.02.2006, 22:42
OK, das werde ich dann jetzt mal testen.

Danke schonmal.