www.mikrocontroller.net

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


Autor: freaky (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)
$regfile = "m16def.dat"                                     'atmega definition
 $crystal = 16000000 $prog &HFF , &HF1 , &H89 , &H00        ' generated. Take care that the chip supports all fuse bytes.                                     'Quarztakt 16Mhz


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

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

 '#################################################


'Eingangskonfiguration*****************************
Config Pina.1 = Input
Config Pina.2 = Input
Config Pina.3 = Input
Porta.1 = 1                                                 'Pullup an
Porta.2 = 1                                                 'Pullup an
Porta.3 = 1                                                 'Pullup an
'#################################################


'Ausgangsconfig***********************************
 Config Pinc.0 = Output
 '#################################################


 'Aliasvergabe*************************************
 Plus Alias Pina.3
 Ok Alias Pina.2
 Minus Alias Pina.1

 Pumpe Alias Pinc.0
 '#################################################



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

   Einstelltemperatur = 40



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

Pumpe = 0
Cls                                                         'display löschen
Locate 1 , 4                                                'cursor setzen

Lcd "T=:" ; Temperatur ; "°C"                               'T=:88.88°C
Locate 2 , 7                                                'Cursor neu setzen
Lcd "Set"                                                   'auf LCD Set in der mitte anzeigen
Locate 2 , 12
Lcd "Start"
If Ok = 0 Then                                              'wenn OK gedrückt wird
Waitms 50                                                   '50ms warten
Goto Temperatureinstellen                                   'dann zur flag Temperatureinstellen springen
End If
Waitms 50
If Plus = 0 Then
Goto Kühlen
End If
Loop                                                        'Loop


Temperatureinstellen:                                       'Flag Temperatureinstellen


Do                                                          'Loop Starten

Cls                                                         'LCD Löschen
Locate 1 , 1                                                'Cursor 1. reihe, 1.position
Lcd "SetT=:" ; Einstelltemperatur ; "°C "                   'auf LCD SetT=:88 °C
Locate 2 , 8                                                'Cursor in 2. reihe mitte positionieren
Lcd "Ok"                                                    'ok auf Pos. anzeigen
If Plus = 0 Then                                            'wenn taste + dann
Incr Einstelltemperatur                                     'Einstelltemperatur +1
End If
If Minus = 0 Then                                           'wenn taste - dann
Decr Einstelltemperatur                                     'einstelltemperatur -1
End If
Settemp = Einstelltemperatur                                'signal doppeln da mir einstelltemperatur nicht weitergearbeitet werden kann warum auch immer??
If Ok = 0 Then                                              'wenn taste ok dann
Waitms 50                                                   'warte 50ms
Goto Start                                                  'springe zu flag Start
End If
Waitms 50                                                   'warte 50ms
Loop                                                        'loop


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

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


Gekuehlt:                                                   'flag GEKUEHLT
Do                                                          'loop
Cls                                                         'cursor an stelle 1.1
Locate 1 , 1                                                'Kühlen beendet anzeigen
Lcd "Kühlen beendet"
                                                             '4 sekunden warten
Wait 4                                                      'lcd köschen
Cls                                                         'cursor 1.1
Locate 1 , 1                                                'Pumpe reinigen anzeigen
Lcd "Pumpe reinigen?"                                       'cursor 1. zeile 1. pos
Locate 2 , 1                                                'cursor 2.1
Lcd "Ja"                                                    'ja ausgeben
Locate 2 , 12                                               'cursor 2.12
Lcd "Nein"                                                  'nein anzeigen
If Minus = 0 Then                                           'wenn minustaste gedrückt dann
Goto Reinigen                                               'springe zu reinigen
End If
If Plus = 0 Then                                            'wenn Plus taste dann
Goto Start                                                  'springe zu Start
End If

Reinigen:                                                   'flag REINIGEN
Do                                                          'loop
Cls                                                         'lcd Löschen
Loop
Loop
End

Vielen dank schon mal!!

Gruß Arndt

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: freaky (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.
Temperatureinstellen:
Do
  Cls
  Locate 1 , 1
  Lcd "SetT=:" ; Einstelltemperatur ; "°C "
  Locate 2 , 8 
  Lcd "Ok"

  If Plus = 0 Then 'wenn taste + dann
    Incr Einstelltemperatur
  End If

  If Minus = 0 Then 'wenn taste - dann
    Decr Einstelltemperatur
  End If

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

  If Ok = 0 Then 'wenn taste ok dann
    Waitms 50
    Goto Start
  End If

  Waitms 50
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

Autor: freaky (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-))
$regfile = "m16def.dat"                                     'atmega definition
 $crystal = 16000000 $prog &HFF , &HF1 , &H89 , &H00        ' generated. Take care that the chip supports all fuse bytes.                                     'Quarztakt 16Mhz


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

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

 '#################################################


'Eingangskonfiguration*****************************
Config Pina.1 = Input
Config Pina.2 = Input
Config Pina.3 = Input
Porta.1 = 1                                                 'Pullup an
Porta.2 = 1                                                 'Pullup an
Porta.3 = 1                                                 'Pullup an
'#################################################


'Ausgangsconfig***********************************
 Config Pinc.0 = Output
 '#################################################


 'Aliasvergabe*************************************
 Plus Alias Pina.3
 Ok Alias Pina.2
 Minus Alias Pina.1

 Pumpe Alias Pinc.0
 '#################################################



 'Variabelvergabe**********************************
 Dim Temperatur As String * 10
 Dim Einstelltemperatur As Byte
 Dim Templang As Single
 Dim Messwert As Byte
 Dim Settemp As String * 10
 Dim Multi As Single
 Dim Zaehler As Byte
 '#################################################
 Multi = 0.4882812500
   Einstelltemperatur = 40.0



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

Pumpe = 0
Cls                                                         'display löschen
Locate 1 , 4                                                'cursor setzen

Lcd "T=:" ; Temperatur ; "°C"                               'T=:88.88°C
Locate 2 , 7                                                'Cursor neu setzen
Lcd "Set"                                                   'auf LCD Set in der mitte anzeigen
Locate 2 , 12
Lcd "Start"
Waitms 50
If Ok = 0 Then                                              'wenn OK gedrückt wird
Waitms 50                                                   '50ms warten
Goto Temperatureinstellen                                   'dann zur flag Temperatureinstellen springen
End If
Waitms 50
If Plus = 0 Then
Goto Kühlen
End If
Loop                                                        'Loop


Temperatureinstellen:                                       'Flag Temperatureinstellen


Do                                                          'Loop Starten

Cls                                                         'LCD Löschen
Locate 1 , 1                                                'Cursor 1. reihe, 1.position
Lcd "SetT=:" ; Einstelltemperatur ; "°C "                   'auf LCD SetT=:88 °C
Locate 2 , 8                                                'Cursor in 2. reihe mitte positionieren
Lcd "Ok"                                                    'ok auf Pos. anzeigen
Waitms 50
If Plus = 0 Then                                            'wenn taste + dann
Incr Einstelltemperatur                                     'Einstelltemperatur +1
End If
If Minus = 0 Then                                           'wenn taste - dann
Decr Einstelltemperatur                                     'einstelltemperatur -1
End If
Settemp = Str(einstelltemperatur)
If Ok = 0 Then                                              'wenn taste ok dann
Waitms 50                                                   'warte 50ms
Goto Start                                                  'springe zu flag Start
End If
Waitms 50                                                   'warte 50ms
Loop                                                        'loop


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

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


Gekuehlt:                                                   'flag GEKUEHLT
Pumpe = 0                                                   'loop
Cls                                                         'cursor an stelle 1.1
Locate 1 , 1                                                'Kühlen beendet anzeigen
Lcd "Kuehlen beendet"                                       '4 sekunden warten
Wait 4
Cls
Locate 1 , 1
Lcd "Schlauch entf."
Locate 2 , 8
Lcd "Ok"
Bitwait Ok , Reset                                          'Warten bis ok gesetzt ist

Do                                                          'lcd löschen
Cls                                                         'cursor 1.1
Locate 1 , 1                                                'Pumpe reinigen anzeigen
Lcd "Pumpe reinigen?"                                       'cursor 1. zeile 1. pos
Locate 2 , 1                                                'cursor 2.1
Lcd "Ja"                                                    'ja ausgeben
Locate 2 , 12                                               'cursor 2.12
Lcd "Nein"                                                  'nein anzeigen
If Minus = 0 Then
Waitms 50                                                   'wenn minustaste gedrückt dann
Goto Reinigen                                               'springe zu reinigen
End If
If Plus = 0 Then
Waitms 50                                                   'wenn Plus taste dann
Goto Start
                                                  'springe zu Start
End If
Waitms 100
 Loop


 Reinigen:                                                  'flag REINIGEN
Cls                                                         'loop
Locate 1 , 1
Lcd "Reinigen mit"
Locate 2 , 1
Lcd "Wasser"
Wait 4
Cls
Locate 1 , 1
Lcd "Spuelen Start?"
Locate 2 , 8
Lcd "OK"
Bitwait Ok , Reset
Cls
Locate 1 , 1
Lcd "Spuehlen laeuft"
Pumpe = 1
Wait 6
Pumpe = 0
Cls
Locate 1 , 1
Lcd "Schlauch entf."
Locate 2 , 8
Lcd "Ok"
Bitwait Ok , Reset
Pumpe = 1
Cls
Locate 1 , 1
Lcd "Schlauch leeren"
Wait 5
Pumpe = 0

Cls
Goto Start
                                                    'lcd Löschen
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.