Forum: Mikrocontroller und Digitale Elektronik Wert wird immer auf 0 gesetzt


von freaky (Gast)


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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

1/ Du hast keine Entprellung der +,-,OK Tasten eingebaut.

2/ Wie sind die Taster angeschlossen? Der Code erfordert einen 
active-low Anschluss. Ist das in der Hardware so einegrichtet? Hast du 
an die Pull-Ups gedacht?

von Sam .. (sam1994)


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.

von freaky (Gast)


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

von Stefan B. (stefan) Benutzerseite


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

von freaky (Gast)


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

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.