Wert wird immer auf 0 gesetzt

Gast #1811955
Lesenswert?

Hallo zusammen
Ich bin ein relativer uC neuling ich arbeite zur zeit an einem Projekt
es soll ein Teekühler werden.
Kurze Funktionsbeschreibung: es kann eine Temperatur eingestellt werden 
wenn start gedrückt wird läuft eine Pumpe los die den Tee aus der tasse 
durch eine Kühlschlange pumpt. ist die temperatur des tees kleiner als 
die eingestellte temperatur stopt die pumpe.
zetzt zu meinem problem . Ich möchte, dass die eingestellbare temperatur 
beim einschalten der spannung auf einem festen wert steht z.b. 40°C sie 
kann dann nach oben oder unten verstellt werden. wenn ich aber das menü 
zum einstellen der temperatur aufrufe ist der wert immer auf 0.
Kann mir vieleicht jemand einen Tip geben? (Siehe Code)
1
$regfile = "m16def.dat"                                     'atmega definition
2
 $crystal = 16000000 $prog &HFF , &HF1 , &H89 , &H00        ' generated. Take care that the chip supports all fuse bytes.                                     'Quarztakt 16Mhz
3

4

5
'LCD Configuration********************************
6
Config Lcd = 16 * 2
7
Config Lcdpin = Pin , Db4 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portd.4 , Rs = Portd.5
8
Config Lcdbus = 4
9
'#################################################
10

11
'ADC Auswertung initialisierung*******************
12
 Config Adc = Single , Prescaler = Auto , Reference = Internal_2.56
13
 Start Adc
14
 Const Adc_multi = 0.4882812500                             ' = 5.0 / 1024.0
15

16
 '#################################################
17

18

19
'Eingangskonfiguration*****************************
20
Config Pina.1 = Input
21
Config Pina.2 = Input
22
Config Pina.3 = Input
23
Porta.1 = 1                                                 'Pullup an
24
Porta.2 = 1                                                 'Pullup an
25
Porta.3 = 1                                                 'Pullup an
26
'#################################################
27

28

29
'Ausgangsconfig***********************************
30
 Config Pinc.0 = Output
31
 '#################################################
32

33

34
 'Aliasvergabe*************************************
35
 Plus Alias Pina.3
36
 Ok Alias Pina.2
37
 Minus Alias Pina.1
38

39
 Pumpe Alias Pinc.0
40
 '#################################################
41

42

43

44
 'Variabelvergabe**********************************
45
 Dim Temperatur As String * 10
46
 Dim Einstelltemperatur As Word
47
 Dim Templang As Single
48
 Dim Messwert As Byte
49
 Dim Settemp As Byte
50
 '#################################################
51

52
   Einstelltemperatur = 40
53

54

55

56
Start:
57
Do                                                          'loop starten
58
Messwert = Getadc(0)                                        'messwert holen
59
Templang = Messwert * Adc_multi                             'messwert mal multiplikator dass temperatur angezeigt wird
60
Temperatur = Str(templang)                                  'temperatur in string umwandeln
61
Temperatur = Fusing(templang , "##.#")                      'format 88.88 vorgeben
62

63
Pumpe = 0
64
Cls                                                         'display löschen
65
Locate 1 , 4                                                'cursor setzen
66

67
Lcd "T=:" ; Temperatur ; "°C"                               'T=:88.88°C
68
Locate 2 , 7                                                'Cursor neu setzen
69
Lcd "Set"                                                   'auf LCD Set in der mitte anzeigen
70
Locate 2 , 12
71
Lcd "Start"
72
If Ok = 0 Then                                              'wenn OK gedrückt wird
73
Waitms 50                                                   '50ms warten
74
Goto Temperatureinstellen                                   'dann zur flag Temperatureinstellen springen
75
End If
76
Waitms 50
77
If Plus = 0 Then
78
Goto Kühlen
79
End If
80
Loop                                                        'Loop
81

82

83
Temperatureinstellen:                                       'Flag Temperatureinstellen
84

85

86
Do                                                          'Loop Starten
87

88
Cls                                                         'LCD Löschen
89
Locate 1 , 1                                                'Cursor 1. reihe, 1.position
90
Lcd "SetT=:" ; Einstelltemperatur ; "°C "                   'auf LCD SetT=:88 °C
91
Locate 2 , 8                                                'Cursor in 2. reihe mitte positionieren
92
Lcd "Ok"                                                    'ok auf Pos. anzeigen
93
If Plus = 0 Then                                            'wenn taste + dann
94
Incr Einstelltemperatur                                     'Einstelltemperatur +1
95
End If
96
If Minus = 0 Then                                           'wenn taste - dann
97
Decr Einstelltemperatur                                     'einstelltemperatur -1
98
End If
99
Settemp = Einstelltemperatur                                'signal doppeln da mir einstelltemperatur nicht weitergearbeitet werden kann warum auch immer??
100
If Ok = 0 Then                                              'wenn taste ok dann
101
Waitms 50                                                   'warte 50ms
102
Goto Start                                                  'springe zu flag Start
103
End If
104
Waitms 50                                                   'warte 50ms
105
Loop                                                        'loop
106

107

108
Kühlen:
109
Do                                                          'loop starten
110
Messwert = Getadc(0)                                        'messwert holen
111
Templang = Messwert * Adc_multi                             'messwert mal multiplikator dass temperatur angezeigt wird
112
Temperatur = Str(templang)                                  'temperatur in string umwandeln
113
Temperatur = Fusing(templang , "##.#")                      'format 88.88 vorgeben
114
Cls                                                         'display löschen
115
Locate 1 , 4                                                'cursor setzen
116

117
Lcd "T=:" ; Temperatur ; "°C"                               'T=:88.88°C
118
Locate 2 , 1                                                'cursor an stelle 2.1
119
Lcd "Stop"                                                  'auf LCD stop ausgeben
120
Pumpe = 1                                                   'pumpe einschalten
121
If Minus = 0 Then                                           'wenn minustaste gedrückt dann
122
Goto Start                                                  'springe zu START
123
End If
124
If Settemp > Temperatur Then                                'wenn Einstelltemperatur (settemp) größer Ist Temperatur dann
125
Goto Gekuehlt                                               'springe zu Gehühlt
126
End If
127
Waitms 100                                                  '100ms warten
128
Loop                                                        'loop ende
129

130

131
Gekuehlt:                                                   'flag GEKUEHLT
132
Do                                                          'loop
133
Cls                                                         'cursor an stelle 1.1
134
Locate 1 , 1                                                'Kühlen beendet anzeigen
135
Lcd "Kühlen beendet"
136
                                                             '4 sekunden warten
137
Wait 4                                                      'lcd köschen
138
Cls                                                         'cursor 1.1
139
Locate 1 , 1                                                'Pumpe reinigen anzeigen
140
Lcd "Pumpe reinigen?"                                       'cursor 1. zeile 1. pos
141
Locate 2 , 1                                                'cursor 2.1
142
Lcd "Ja"                                                    'ja ausgeben
143
Locate 2 , 12                                               'cursor 2.12
144
Lcd "Nein"                                                  'nein anzeigen
145
If Minus = 0 Then                                           'wenn minustaste gedrückt dann
146
Goto Reinigen                                               'springe zu reinigen
147
End If
148
If Plus = 0 Then                                            'wenn Plus taste dann
149
Goto Start                                                  'springe zu Start
150
End If
151

152
Reinigen:                                                   'flag REINIGEN
153
Do                                                          'loop
154
Cls                                                         'lcd Löschen
155
Loop
156
Loop
157
End

Vielen dank schon mal!!

Gruß Arndt
#1812096
Lesenswert?

Ich bin jetzt kein Bascomer, aber

freaky schrieb:
> Temperatur = Str(templang)             'temperatur in string umwandeln
> Temperatur = Fusing(templang , "##.#") 'format 88.88 vorgeben

Du wandelst erst die Temperatur in einen String um und gibst dann den 
Zahlenwert bei Fusing an?
Müsste es nicht
Temperatur = Fusing(Temperatur, "##.#")   'format 88.88 vorgeben
heißen?
Sonst wäre nämlich die Zeile
> Temperatur = Str(templang)             'temperatur in string umwandeln
unnötig, da der Wert danach überschrieben wird.
Gast #1814472
Lesenswert?

Hallo
@ Stefan B wie geht denn eine Entprellung?

Ich habe die taster gegen Masse angeschlossen ich habe die internen pull 
ups aktiviert also die Tasten als solches funktionieren ja einwandfrei

mfg Arndt
Persönliche Seite #1814556
Lesenswert?

freaky schrieb:

> @ Stefan B wie geht denn eine Entprellung?

Im Artikel Entprellung ist im Abschnitt zum Warteschleifenverfahren 
der BASCOM Befehl DEBOUNCE und der Link zum Handbuch angegeben. Im 
Handbuch (und im Artikel) ist die Arbeitsweise erklärt und im Handbuch 
ist auch ein Beispiel angegeben.

> Ich habe die taster gegen Masse angeschlossen ich habe die internen pull
> ups aktiviert also die Tasten als solches funktionieren ja einwandfrei

Eingabe

Jein. In deinem Codeausschnitt z.B.
1
Temperatureinstellen:
2
Do
3
  Cls
4
  Locate 1 , 1
5
  Lcd "SetT=:" ; Einstelltemperatur ; "°C "
6
  Locate 2 , 8 
7
  Lcd "Ok"
8

9
  If Plus = 0 Then 'wenn taste + dann
10
    Incr Einstelltemperatur
11
  End If
12

13
  If Minus = 0 Then 'wenn taste - dann
14
    Decr Einstelltemperatur
15
  End If
16

17
  ' signal doppeln da mit einstelltemperatur 
18
  ' nicht weitergearbeitet werden kann warum auch immer??
19
  Settemp = Einstelltemperatur 
20

21
  If Ok = 0 Then 'wenn taste ok dann
22
    Waitms 50
23
    Goto Start
24
  End If
25

26
  Waitms 50
27
Loop

dürftest du die + oder - Taste nur jeweils max. 50 ms betätigen. Das 
schafft nur Chuck Norris.

Drückst du die Taste länger, wird die betreffende Aktion (INCR oder 
DECR) beim nächsten Durchlauf wieder ausgeführt.

Das mit dem Prellen ist allerdings nicht so schlimm, wie ich dachte. 
Durch das letzte waitms 50 milderst du den Prelleffekt ab.

Ausgabe bzw. Debugging

Ich würde die LOCATE anders machen, so dass man die beiden Temperaturen 
(IST und SET) besser sieht. Bei einem 16 Zeichen LCD muss man schon 
sparen :)

Locate 1 , 1
Lcd "T:" ; Temperatur ' Format ##.# sind 2+4=6 Zeichen
...
Locate 1 , 8 ' 6 Zeichen s.o. plus ein Leerzeichen
Lcd "SET:" ; Einstelltemperatur ; "°C "

Welche der beiden Temperaturen ist in deiner Anzeige 0?

Hast du mal templang und settemp ausgegeben?

Variablentypen

Du hast diese Variablen dimensioniert:

 Dim Temperatur As String * 10
 Dim Einstelltemperatur As Word
 Dim Templang As Single
 Dim Messwert As Byte
 Dim Settemp As Byte

und vergleichst später

If Settemp > Temperatur Then
  Goto Gekuehlt
End If

Das kann nicht gut gehen. Du kannst nur entweder Strings mit Strings 
vergleichen oder Zahlen mit Zahlen. Es sollte gehen

If Settemp > Templang Then
  Goto Gekuehlt
End If

bzw.

If Einstelltemperatur > Templang Then
  Goto Gekuehlt
End If
Gast #1817078
Lesenswert?

Hallo
So mittlerweilie habe ich das programm ans laufen bekommen wie genau 
kann ich auch nicht so wirklich sagen einfach abgeändert bis es lief *g

@ stefan b
Ja hast recht man kann tatsächlich nur strings mit strings vergleichen 
;-)

hab nochmal mein programm in finalversion gelistet: (allerdings die 
komentare stimmen nichtmehr weil ich ziemlich viel verändert hab, muss 
ich noch anpassen ;-))
1
$regfile = "m16def.dat"                                     'atmega definition
2
 $crystal = 16000000 $prog &HFF , &HF1 , &H89 , &H00        ' generated. Take care that the chip supports all fuse bytes.                                     'Quarztakt 16Mhz
3

4

5
'LCD Configuration********************************
6
Config Lcd = 16 * 2
7
Config Lcdpin = Pin , Db4 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portd.4 , Rs = Portd.5
8
Config Lcdbus = 4
9
'#################################################
10

11
'ADC Auswertung initialisierung*******************
12
 Config Adc = Single , Prescaler = Auto , Reference = Internal_2.56
13
 Start Adc
14
' Const Adc_multi = 0.4882812500                             ' = 5.0 / 1024.0
15

16
 '#################################################
17

18

19
'Eingangskonfiguration*****************************
20
Config Pina.1 = Input
21
Config Pina.2 = Input
22
Config Pina.3 = Input
23
Porta.1 = 1                                                 'Pullup an
24
Porta.2 = 1                                                 'Pullup an
25
Porta.3 = 1                                                 'Pullup an
26
'#################################################
27

28

29
'Ausgangsconfig***********************************
30
 Config Pinc.0 = Output
31
 '#################################################
32

33

34
 'Aliasvergabe*************************************
35
 Plus Alias Pina.3
36
 Ok Alias Pina.2
37
 Minus Alias Pina.1
38

39
 Pumpe Alias Pinc.0
40
 '#################################################
41

42

43

44
 'Variabelvergabe**********************************
45
 Dim Temperatur As String * 10
46
 Dim Einstelltemperatur As Byte
47
 Dim Templang As Single
48
 Dim Messwert As Byte
49
 Dim Settemp As String * 10
50
 Dim Multi As Single
51
 Dim Zaehler As Byte
52
 '#################################################
53
 Multi = 0.4882812500
54
   Einstelltemperatur = 40.0
55

56

57

58
Start:
59
Do                                                          'loop starten
60
Messwert = Getadc(0)                                        'messwert holen
61
Templang = Messwert * Multi                                 'messwert mal multiplikator dass temperatur angezeigt wird
62
Temperatur = Fusing(templang , "##.#")                      'format 88.88 vorgeben
63

64
Pumpe = 0
65
Cls                                                         'display löschen
66
Locate 1 , 4                                                'cursor setzen
67

68
Lcd "T=:" ; Temperatur ; "°C"                               'T=:88.88°C
69
Locate 2 , 7                                                'Cursor neu setzen
70
Lcd "Set"                                                   'auf LCD Set in der mitte anzeigen
71
Locate 2 , 12
72
Lcd "Start"
73
Waitms 50
74
If Ok = 0 Then                                              'wenn OK gedrückt wird
75
Waitms 50                                                   '50ms warten
76
Goto Temperatureinstellen                                   'dann zur flag Temperatureinstellen springen
77
End If
78
Waitms 50
79
If Plus = 0 Then
80
Goto Kühlen
81
End If
82
Loop                                                        'Loop
83

84

85
Temperatureinstellen:                                       'Flag Temperatureinstellen
86

87

88
Do                                                          'Loop Starten
89

90
Cls                                                         'LCD Löschen
91
Locate 1 , 1                                                'Cursor 1. reihe, 1.position
92
Lcd "SetT=:" ; Einstelltemperatur ; "°C "                   'auf LCD SetT=:88 °C
93
Locate 2 , 8                                                'Cursor in 2. reihe mitte positionieren
94
Lcd "Ok"                                                    'ok auf Pos. anzeigen
95
Waitms 50
96
If Plus = 0 Then                                            'wenn taste + dann
97
Incr Einstelltemperatur                                     'Einstelltemperatur +1
98
End If
99
If Minus = 0 Then                                           'wenn taste - dann
100
Decr Einstelltemperatur                                     'einstelltemperatur -1
101
End If
102
Settemp = Str(einstelltemperatur)
103
If Ok = 0 Then                                              'wenn taste ok dann
104
Waitms 50                                                   'warte 50ms
105
Goto Start                                                  'springe zu flag Start
106
End If
107
Waitms 50                                                   'warte 50ms
108
Loop                                                        'loop
109

110

111
Kühlen:
112
Zaehler = 0
113
Do                                                          'loop starten
114
Messwert = Getadc(0)                                        'messwert holen
115
Templang = Messwert * Multi                                 'messwert mal multiplikator dass temperatur angezeigt wird
116
Temperatur = Fusing(templang , "##.#")
117
Zaehler = Zaehler + 1
118
Cls                                                         'display löschen
119
Locate 1 , 4                                                'cursor setzen
120

121
Lcd "T=:" ; Temperatur ; "°C"                               'T=:88.88°C
122
Locate 2 , 1                                                'cursor an stelle 2.1
123
Lcd "Stop" ; Zaehler                                        'auf LCD stop ausgeben
124
Pumpe = 1                                                   'pumpe einschalten
125
If Minus = 0 Then                                           'wenn minustaste gedrückt dann
126
Goto Start                                                  'springe zu START
127
End If
128
If Settemp > Temperatur And Zaehler = 30 Then               'wenn Einstelltemperatur (settemp) größer Ist Temperatur dann
129
Goto Gekuehlt                                               'springe zu Gehühlt
130
End If
131
Waitms 100                                                  '100ms warten
132
Loop                                                        'loop ende
133

134

135
Gekuehlt:                                                   'flag GEKUEHLT
136
Pumpe = 0                                                   'loop
137
Cls                                                         'cursor an stelle 1.1
138
Locate 1 , 1                                                'Kühlen beendet anzeigen
139
Lcd "Kuehlen beendet"                                       '4 sekunden warten
140
Wait 4
141
Cls
142
Locate 1 , 1
143
Lcd "Schlauch entf."
144
Locate 2 , 8
145
Lcd "Ok"
146
Bitwait Ok , Reset                                          'Warten bis ok gesetzt ist
147

148
Do                                                          'lcd löschen
149
Cls                                                         'cursor 1.1
150
Locate 1 , 1                                                'Pumpe reinigen anzeigen
151
Lcd "Pumpe reinigen?"                                       'cursor 1. zeile 1. pos
152
Locate 2 , 1                                                'cursor 2.1
153
Lcd "Ja"                                                    'ja ausgeben
154
Locate 2 , 12                                               'cursor 2.12
155
Lcd "Nein"                                                  'nein anzeigen
156
If Minus = 0 Then
157
Waitms 50                                                   'wenn minustaste gedrückt dann
158
Goto Reinigen                                               'springe zu reinigen
159
End If
160
If Plus = 0 Then
161
Waitms 50                                                   'wenn Plus taste dann
162
Goto Start
163
                                                  'springe zu Start
164
End If
165
Waitms 100
166
 Loop
167

168

169
 Reinigen:                                                  'flag REINIGEN
170
Cls                                                         'loop
171
Locate 1 , 1
172
Lcd "Reinigen mit"
173
Locate 2 , 1
174
Lcd "Wasser"
175
Wait 4
176
Cls
177
Locate 1 , 1
178
Lcd "Spuelen Start?"
179
Locate 2 , 8
180
Lcd "OK"
181
Bitwait Ok , Reset
182
Cls
183
Locate 1 , 1
184
Lcd "Spuehlen laeuft"
185
Pumpe = 1
186
Wait 6
187
Pumpe = 0
188
Cls
189
Locate 1 , 1
190
Lcd "Schlauch entf."
191
Locate 2 , 8
192
Lcd "Ok"
193
Bitwait Ok , Reset
194
Pumpe = 1
195
Cls
196
Locate 1 , 1
197
Lcd "Schlauch leeren"
198
Wait 5
199
Pumpe = 0
200

201
Cls
202
Goto Start
203
                                                    'lcd Löschen
204
End

Das mit dem Tastenprellen hält sich eigentlich auch in grenzen hab noch 
n paar waitms hinzugefügt

Vielen dank für eure hilfe!!

Gruß Arndt

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren