Digitale Temperatur regelnde Lüftersteuerung mit einstellbaren Hysteresewerten

jo okay dann hab ich as jetzt mal so um geschrieben funktioniert auch wunder bar irgend wie griege ich aber keine °C so wie du es hast hin was bedeutet diese LCD chr(0)??
 
und er meckert das er kein Lable [_LOOPO findet ich das bei zurück so machen
If Taster = 0 Then Exit Do
 
Hallo Knut!

Das °C Zeichen habe ich mir mit dem "LCD Designer" von BASCOM selbst gemacht. ;)

Kannst es ja mal ausprobieren.....

Vorerst kannst du dies:
Code:
Deflcdchar 0 , 24 , 24 , 32 , 6 , 9 , 8 , 9 , 6             'Grad Celsius Symbol für LCD

gleich unter die Variablen und Konstanten eintragen.



Die andere Fehlermeldung verstehe ich jetzt nicht? :hmmmm:
Das es innerhalb des Submenüs eine eigene Do-Loop Schleife gibt hast du aber gesehen, oder?
Hast du vielleicht das "Do" (gleich unter Z = 3) vergessen?

Grüße,
Cassio
 
allerdings muss ich den Taster Glaub ich irgend wie entprellen des Klappt trotz 100nf kondensator immer noch net so
 
Hallo Knut!

Bei mir hat der 47nF Kondensator ganz gut funktioniert.
Eigentlich reicht meist ein 100nF Kondensator, um das Prellen in den Griff zu bekommen.

Bist du sicher, dass dir das Prellen des Tasters Probleme bereitet.... oder könnte der Fehler sich auch an anderer Stelle versteckt haben?

Ordne mal das Programm und stelle es hier ggf. noch mal ein.


Grüße,
Cassio
 
so da ich die Finger ja nicht von der Tastatur lassen kann hab ich ein bisschen Weiter gemacht.
Wenn ich den Taster bei einer Auswahl drücke setze ich bei Temp Max X auf 1 und bei Temp min Y auf 1.
und es funktioniert auch bis auf das die >> immer flackern wie kann ich das unterbinden ??
Code:
Menue:

      Z = 3                                                       'Pfeile auf Abbrechen vorgeben

      Do



      If Lcd_flag = 0 Then                                        'wurde das LCD schon mal aktualisiert?

         Locate 1 , 1 : Lcd "Einstellmenue..."

         Locate 2 , 1 : Lcd "  Max-Wert     " : Lcd Chr(0)

         Locate 3 , 1 : Lcd "  Min-Wert     " : Lcd Chr(0)

         Locate 4 , 1 : Lcd "  Abbrechen    "

         Lcd_flag = 1                                             'LCD wurde einmal aktualisiert

         Bitwait Taster , Set                                     'warten ob der Taster losgelassen wurde

      Else

      End If

     Select Case X
     Case 1
     Locate 2 , 1 : Lcd ">>" : Locate 3 , 1 : Lcd "  " : Locate 4 , 1 : Lcd "  "
     If Taster = 0 Then X = 0
     Bitwait Taster , set
     End Select

      Select Case Y
     Case 1
     Locate 2 , 1 : Lcd "  " : Locate 3 , 1 : Lcd ">>" : Locate 4 , 1 : Lcd "  "
     If Taster = 0 Then Y = 0
     Bitwait Taster , Set
     End select


      If Z > 3 Then Z = 1                                         'Z darf nicht größer 3 werden

      If Z = 0 Then Z = 3                                         'Z darf nicht NULL sein





      Select Case Z                                               'Z für Menüwahl auswerten

         Case 1

            Locate 2 , 1 : Lcd ">>" : Locate 3 , 1 : Lcd "  " : Locate 4 , 1 : Lcd "  "

              If Taster = 0 Then Gosub Max_wert_set                 'gehe zu Max_wert

         Case 2

            Locate 2 , 1 : Lcd "  " : Locate 3 , 1 : Lcd ">>" : Locate 4 , 1 : Lcd "  "

            If Taster = 0 Then Gosub Min_wert_set                 'gehe zu Min_wert

         Case 3

            Locate 2 , 1 : Lcd "  " : Locate 3 , 1 : Lcd "  " : Locate 4 , 1 : Lcd ">>"

            If Taster = 0 Then Exit Do                            'zurück zur Standardanzeige

     End Select





      Locate 2 , 13 : Lcd Max_temp                                'aktuelle Max_temp anzeigen

      Locate 3 , 13 : Lcd Min_temp                                'aktuelle Min_temp anzeigen



      Loop



      Return
 
okay wenn ich Z jetzt in dem case x und y auf den Bestimmten wert setzte funktioniert das einwandfrei ist das so okay
 
Code:
Select Case X
     Case 1
     Locate 2 , 1 : Lcd ">>" : Locate 3 , 1 : Lcd "  " : Locate 4 , 1 : Lcd "  "
     If Taster = 0 Then X = 0
     Z = 1
     Bitwait Taster , set
     End Select

      Select Case Y
     Case 1
     Locate 2 , 1 : Lcd "  " : Locate 3 , 1 : Lcd ">>" : Locate 4 , 1 : Lcd "  "
     If Taster = 0 Then Y = 0
     Z = 2
     Bitwait Taster , Set
     End select
 
so hoffe dass das so in ordnung ist jetzt werde ich dan mal die ADC wandlung in angriff nehmen.
 
Hallo Knut!

Nun mal nicht so schnell mit den jungen Pferden....

Das Menü ist noch lange nicht fertig.
Und so wie du es jetzt umgebaut hast, das ist......... ich sage mal, nicht befriedigend.


Ich hatte dir doch schon die Vorlage gegeben......
Du musst doch gesehen haben, dass du zum Einstellen der Werte (Min und Max) in weitere Subroutinen verzweigen musst. :hmmmm:

Habe ich dich überschätzt? :cool:
Ich hätte doch nicht den Code hier einstellen sollen.
Es kommt mir so vor, als hättest du es nur kopiert und nicht wirklich verstanden.
Nun "schraubst" du da auf gut Glück dran rum und möchtest schon das nächste Thema beginnen.


Eines mal vorweg.....
Ich habe dir das Menüprogramm selber vorgeschlagen und darum bin ich auch bereit dir dabei zu helfen.
Die ganze Themperaturgeschichte geht mich nichts an. Da musst du dann schon selber durch.


Nun aber noch mal zurück zum Menü....
Was meinst du, warum diese Zeilen auf verschiedene Untermenüs verweisen?
Code:
Select Case Z                                               'Z für Menüwahl auswerten
   Case 1
      Locate 2 , 1 : Lcd ">>" : Locate 3 , 1 : Lcd "  " : Locate 4 , 1 : Lcd "  "
      If Taster = 0 Then [B]Gosub Max_wert_set[/B]                 'gehe zu Max_wert
   Case 2
      Locate 2 , 1 : Lcd "  " : Locate 3 , 1 : Lcd ">>" : Locate 4 , 1 : Lcd "  "
      If Taster = 0 Then [B]Gosub Min_wert_set[/B]                 'gehe zu Min_wert
   Case 3
      Locate 2 , 1 : Lcd "  " : Locate 3 , 1 : Lcd "  " : Locate 4 , 1 : Lcd ">>"
      If Taster = 0 Then Exit Do                            'zurück zur Standardanzeige
End Select


Wo sind die beiden Subroutinen denn in deinem Programm?
Und mal nebenbei....... Was soll dieser Schei... mit den X und Y ?
Ich dachte, es geht hier um Min.- und Max.-Temperatur?


Gruß,
Cassio
 
okay mein fehler vll hätte ich den ganze code posten sollen.also wenn ich den menu punkt z = 1 oder Z = 2 aus gewählt habe kann ich x für Z = 1 und y für Z = 2 auf 1 mit dem Tasten druck setzten.allerdings kann ist x immer null wenn y = 1 und wenn x = 1 ist y immer null. Dann frage ich beim Drehen die Werte ab wenn x = 1 dann incr Max_temp wenn y = 1 dan Incr Min_temp für Runter und für Rauf nehme ich dann decr min oder max also werden die werte verkleinert oder vergrößert das was ich mit dem case gemacht habe war nur das dein Menue bei dem Jeweilig aus gewählten Programmpunkt stehen Bleibt.
Code:
$regfile = "m8def.dat"

$crystal = 8000000

$framesize = 32

$swstack = 32

$hwstack = 64


Ddrd = &B11100010
'PD0 = Eingang

'PD1 = Ausgang

'PD2 = Encoder

'PD3 = Encoder

'PD4 = Taster-Encoder

'PD5 = LCD-RS

'PD6 = LCD-E
Portd = &B00011100
'pd2-pd4 auf high signal (5V)
' den Rest auf low Signal (0V)



Ddrb = &B11111111
' LCd anzeige 8 Bit

Portb = &B00000000
' alle auf Low Signal gelegt



' Lcd anzeige auf 8 Bit Configurieren
Config Lcdpin = Pin , Port = Portb , E = Portd.6 , Rs = Portd.5

  ' LCD Typ festlegen
 Config Lcd = 20 * 4

 Config Timer0 = Timer , Prescale = 256                     'Overflow nach 2,048ms


On Timer0 Drehencoder                                       'Drehencoder abfragen
'Timer0 zur Überwachung des Drehencoders-------------------
 Dim Lcd_flag As Bit

 ' LCD_flag Dient dazu die daten nur einmal auf die LCD anzeige zuschreiben

 Dim Anzeige_flag As Bit

 ' Anzeige_flag sorgt für den wechsel vom standardbildschirm in die Menueführung

Dim Max_temp As Byte                                        'Variable für die bere Schwelle

Dim Min_temp As Byte                                        ' Variable für den untere Schwelle

Dim De As Byte                                              ' Dreh Encoder

Dim Y As Byte                                               ' Variable zumverstellen des Unteren Schwellwerts

Dim X As Byte                                               ' Variable zum verstellen der Oberen Schwellwertes


Deflcdchar 0 , 24 , 24 , 32 , 6 , 9 , 8 , 9 , 6             'Grad Celsius Symbol für LCD


Dim Z As Byte                                               ' Variable die mit dem Encoder hoch und runter gezählt wird

Taster Alias Pind.4                                         ' Taster Alias damit nicht immer PIND.4 Geschrieben werden muss

Bl Alias Portd.1                                            ' reserve Ausgang

Ein Alias 1                                                 'EIN

Aus Alias 0                                                 ' AUS

'*******************************************************************************

'                  --------------Systemstart------------------

'*******************************************************************************

'           Hier kommt alles rein was für den Systemstart wichtig ist
 Max_temp = 60
 Min_temp = 20
 X = 0
 Y = 0
 Z = 0
 '**********************************************************

'                 ----Hauptschleife----

'**********************************************************

 Do

 Enable Timer0                                              'Timer0 aktiv



Enable Interrupts

  If Taster = 0 Then                                        ' ist der Taster betätigt ?
                                       ' Ja dann setze  Layout auf null oder eins abhänig davon welchen wert es vorher hatte.
   Toggle Anzeige_flag

   Lcd_flag = 0                                             ' Setze Flag LC auf 0


  End If

   If Anzeige_flag = 0 Then
                                        ' ist die LCD schon Beschrieben?
    Gosub Lcdanzeige                                        ' Nein Springe zur Routine LCDanzeige

     Else

     Gosub Menue                                            ' ja dan springe in menue

   End If

Loop

'*******************************************************************************




'*******************************************************************************

'       -----------------------Subroutinen--------------------------

'*******************************************************************************



  Lcdanzeige:

  If Lcd_flag = 0 Then
  X = 0
  Y = 0
  Z = 0                                                     ' Standart Bildschirm festlegen
  Cls

  Locate 1 , 1 : Lcd "Kuehlagregat"

  Locate 2 , 1 : Lcd "Kuehlhaus"

  Locate 3 , 1 : Lcd "Obere Temp."

  Locate 4 , 1 : Lcd "Untere Temp."
                                                  ' festlegung Lcd ist schon beschrieben
     Lcd_flag = 1

     End If

     Bitwait Taster , Set
                                                 ' darauf warten das taster wieder betätigt wird

     Return



     'Sub für Taster-----------------------------------------------------------------

      Menue:

      Z = 3                                                 'Pfeile auf Abbrechen vorgeben

      Do



      If Lcd_flag = 0 Then                                  'wurde das LCD schon mal aktualisiert?

         Locate 1 , 1 : Lcd "Einstellmenue..."

         Locate 2 , 1 : Lcd "  Max-Wert     " : Lcd Chr(0)

         Locate 3 , 1 : Lcd "  Min-Wert     " : Lcd Chr(0)

         Locate 4 , 1 : Lcd "  Abbrechen    "

         Lcd_flag = 1                                       'LCD wurde einmal aktualisiert

         Bitwait Taster , Set                               'warten ob der Taster losgelassen wurde

      Else

      End If

     Select Case X
     Case 1
     Locate 2 , 1 : Lcd ">>" : Locate 3 , 1 : Lcd "  " : Locate 4 , 1 : Lcd "  "
     If Taster = 0 Then X = 0
     Z = 1
     Bitwait Taster , Set
     End Select

      Select Case Y
     Case 1
     Locate 2 , 1 : Lcd "  " : Locate 3 , 1 : Lcd ">>" : Locate 4 , 1 : Lcd "  "
     If Taster = 0 Then Y = 0
     Z = 2
     Bitwait Taster , Set
     End Select


      If Z > 3 Then Z = 1                                   'Z darf nicht größer 3 werden

      If Z = 0 Then Z = 3                                   'Z darf nicht NULL sein





      Select Case Z                                         'Z für Menüwahl auswerten

         Case 1

            Locate 2 , 1 : Lcd ">>" : Locate 3 , 1 : Lcd "  " : Locate 4 , 1 : Lcd "  "

              If Taster = 0 Then Gosub Max_wert_set         'gehe zu Max_wert

         Case 2

            Locate 2 , 1 : Lcd "  " : Locate 3 , 1 : Lcd ">>" : Locate 4 , 1 : Lcd "  "

            If Taster = 0 Then Gosub Min_wert_set           'gehe zu Min_wert

         Case 3

            Locate 2 , 1 : Lcd "  " : Locate 3 , 1 : Lcd "  " : Locate 4 , 1 : Lcd ">>"

            If Taster = 0 Then Exit Do                      'zurück zur Standardanzeige

     End Select





      Locate 2 , 13 : Lcd Max_temp                          'aktuelle Max_temp anzeigen

      Locate 3 , 13 : Lcd Min_temp                          'aktuelle Min_temp anzeigen



      Loop



      Return




   Drehencoder:

   De = Encoder(pind.2 , Pind.3 , Rauf , Runter , 0)

   Return


  Rauf:
                                                                ' Routine Z runter zählen
  [B][U]If X = 1 Then

     Decr Max_temp                                          ' wenn X = 1 dann verringere den oberen Hysteresewert um 5

      End If

     If Max_temp < 40 Then

     Max_temp = 40                                          ' minimale grenze für die obere Temperatur

     End If





     If Y = 1 Then

     Decr Min_temp
                                                      ' wenn X = 2 dann verringere den unteren Hysteresewert um 5
     End If


     If Min_temp < 20 Then

     Min_temp = 20                                          ' minimale grenze für die untere Temperatur


     End If[/U][/B]




  If De = 0 Then                                            ' ist K = 0  ?

  Decr Z                                                    ' Ja dann Z = Z - 1

  End If

   If Z < 1 Then                                            ' ist z = 0 ?

   Z = 3                                                    'ja dann Z = 3

   End If





  Return

  Runter:
                                                      ' Routine Z rauf zählen und hysterese werte rauftählen
  [B][U]If X = 1 Then

     Incr Max_temp                                          ' wenn X = 1 dann verringere den oberen Hysteresewert um 5

      End If

     If Max_temp > 60 Then

     Max_temp = 60                                          ' minimale grenze für die obere Temperatur

     End If



     If Y = 1 Then

     Incr Min_temp
                                                      ' wenn X = 2 dann verringere den unteren Hysteresewert um 5
     End If


     If Min_temp > 40 Then

     Min_temp = 40                                          ' minimale grenze für die untere Temperatur


     End If[/U][/B]






  If De = 0 Then                                            ' ist K = 0  ?

  Incr Z                                                    ' Ja dann Z = Z + 1

  End If

  If Z > 3 Then                                             ' ist z = 3 ?

  Z = 1

    End If



  Return






[B][B][U]
  Max_wert_set:

   X = 1
   Y = 0
   Z = 1
   Locate 3 , 1 : Lcd X



     

     Return

    Min_wert_set:

   Y = 1
   X = 0
   Z = 2
   Locate 2 , 1 : Lcd Y


 

      Bitwait Taster , Set

     Return

     Abbrechen:
     If Taster = 0 Then
     Lcd_flag = 0
     Gosub Lcdanzeige
     End If
     Return

[/U][/B][/B]


End
 
und durch die select habe ich halt veranlast das die >> immer bei dem punkt stehen bleiben und wenn ich den taster noch mal gedrückt habe wurde x wieder 0 und ich konnte wieder in meinem Menue rumspringen wie ich lustig bin bis ich das nächste mal den Taster betätigt habe und dann vll y gesetzt hatte oder auf abbrechen war.
also ich fand das bis eben eigendlich ne gute idee
 
Hallo Knut!

Hm.... nee... so wird das nichts.

Was ich eben erst gesehen habe....
Die Konfig für den Timer0, incl. Interrupts, gehört nicht in die Hauptschleife.
Das machst du einmal im Header und dann war es das!

Bring also den Block:
Code:
'Timer0 zur Überwachung des Drehencoders-------------------
Config Timer0 = Timer , Prescale = 64                       'Overflow nach 2,048ms
On Timer0 Drehencoder                                       'Drehencoder abfragen
Enable Timer0                                               'Timer0 aktiv


Enable Interrupts                                           'Interrupts einschalten

zum Beispiel gleich unter die Definition der Pins und Ports!



Dann sind deine Gedanken in Sachen "Wertveränderung der Temperaturwerte" zwar nicht ganz falsch..... aber das funktioniert auf diese Weise nicht so richtig.

Mal ein Tipp....
Du musst an meiner Subroutine für das erste Menü gar nichts mehr ändern.
Die ist so komplett fertig! ;)

Wie du sehen kannst, springst du zum Beispiel bei "Z = 1" in die nächste Sub zur Einstellung des Max-Wertes (Max_wert_set).

Dort angekommen musst du das Display EINMAL aktualisieren damit der Anwender auch mitbekommt, wo er gelandet ist. ;)
Das sieht bei mir dann so aus:
DSCF1164.JPG
allerdings OHNE das Wort "Gespeichert" (das kommt zum Schluss)!

Im Programm sieht dass dann so aus:
Code:
Cls                                                         'LCD löschen
Locate 1 , 1 : Lcd "  Maximum-Wert  "
Locate 2 , 1 : Lcd "li= -      re= +"
Locate 3 , 1 : Lcd "Max-Wert=      " : Lcd Chr(0)

Aber das war ja nun nicht wirklich schwer. ;)


In dieser Sub wird dann mit dem Drehencoder der Maxwert eingestellt.
Du kannst dafür ruhig Z verwenden...... und dann die Daten später nur umkopieren.

Wenn der Wert eingestellt ist, dann wird durch einen Tastendruck am Encoder die Sub verlassen und vorher noch der Hinweis "Gespeichert" ausgegeben.

Ich gebe zu, diese Subroutine ist die Kniffligste, weil man hier einige Dinge beachten muss..... aber das kommt dann, wenn du die ersten Versuche damit gemacht hast. ;)

Als Tipp gebe ich dir.....
Auch in dieser Sub wird wieder mit einer Do-Loop Schleife gearbeitet und im Display wird NUR der geänderte Sollwert aktualisiert!



Da die Subroutine für den Min_wert genauso funktioniert, würde ich mich an deiner Stelle erst mal nur um die Funktion der einen Sub kümmern.
Wenn die dann fehlerfrei arbeitet, kannst du das in die Min_wert-Sub übernehmen.


Grüße,
Cassio
 
okay kjann das aber erst montag ausprobieren da ich das test board nicht mit nachhause nehmen darf. Werde aber das wochenende ein bisschen Grübeln.
 
Hallo Knut!

Nun ja... Grübeln und Nachdenken ohne Hardware ist immer etwas......
Meistens verbeibt es dann. ;)


Damit du aber über das Wochenende doch noch etwas grübeln kannst, gebe ich dir ein paar Überlegungen mit auf den Weg.


Du befindest dich im erten Menüpunkt und möchtest den Max_wert (also die obere Schaltschwelle) einstellen.
Nach Anwahl des Menüpunktes durch den Drehencoder und Druck auf den Taster gelangst du in die Subroutine Max_wert_set !

Dort angekommen musst du das Display löschen und mit den neuen Daten zum Untermenü beschreiben.
Überwache dann auch wieder den Drucktaster.
Jeder Mensch drückt eine Taste immer so lange, bis er eine Rückmeldung bekommt..... ein deinem Fall die Displayanzeige.
Demnach muss die Tasterüberwachung auch erst nach dem Wechsel der Displayanzeige erfolgen.

Da du in den Subroutinen "Rauf" und "Runter" die Variable "Z" bearbeitest, musst du als nächstes den aktuellen Max_wert auch "Z" zuweisen.

Wenn du nun am Encoder drehst, wird sich die Variable "Z" immer um einen Wert verändern....
Dies musst du auch ständig neu auf dem Display ausgeben damit man weiß, welchen Wert man nun "eingedreht" hat.

Wenn der gewünschte Wert erreicht ist, wird durch einen Tastendruck die Schleife zum Einstellen des Wertes verlassen und eine Meldung wie zum Beispiel "Gespeichert" mindestens für eine bestimmte Zeit ausgegeben..... oder eben solange der Taster gedrückt bleibt.

Danach wird das Untermenü verlassen und du gelangst wieder in das Einstellmenü.... in der gleich wieder die ">>" Pfeile auf "Abbrechen" vorgegeben sind.



Nun noch zwei weitere Überlegungen....
Damit man die Max.- und Min.-Temperaturen nicht von 0-255 einstellen kann, habe ich im Header zwei Variablen eingefügt:
Code:
Dim Max_wert As Byte                                        'Maximal mögliche Temperatur
Dim Min_wert As Byte                                        'Minimal mögliche Temperatur

Wenn es zum Beispiel nur sinnvoll ist die Temperaturen im Bereich von 10Grad bis 40Grad einzustellen.... was für eine Hysterese schon seeeeehr weit ist, dann kannst du das damit vorgeben:

Code:
Max_wert = 40                                               'Maximalwert vorgeben
Min_wert = 10                                               'Minimalwert vorgeben


Beim Einstellen des Max-Wertes im Untermenü musst du dann berücksichtigen, dass du mit dem Encoder auch keine Werte z.B. über 40 einstellen kannst.

Denke auch bitte daran, dass sich die Temperatur sofort wieder um einen Grad verringern muss, wenn der Encoder dann wieder links herum gedreht wird..... egal wie oft der Encoder vorher nach rechts (und damit über den Endpunkt hinaus) gedreht wurde. ;)


Was du ebenfalls noch mit berücksichtigen solltest....
Es macht natürlich keinen Sinn, wenn du den Max-Wert kleiner (oder gleich) dem Min-Wert einstellen kannst!
Der niedrigste Max-Wert ist also immer 1Grad höher als der Min-Wert!

Wenn du das alles berücksichtigt hast, dann sollte es am Ende auch problemlos funtionieren! :)

Erst wenn die "Max_wert_set" in Ordnung ist und richtig arbeitet, kannst du die "Min_wert_set" beginnen...... die ja genauso funktioniert, nur eben anders herum. ;)


Ich wünsch dir viel Spaß beim Erstellen des Programmcodes.

Grüße,
Cassio
 
moin also nach reichlicher Überlegung und 2 Gesprächen mit dem Kunden und meinem Ausbilder hab ich mich entschieden das mit dem Einstellungsmenü so zu lassen nur das noch ein >> auf den wert zeigt der mit tasten druck ausgelöst wurde. Nichts gegen deine Version Cassio aber es darf auch nicht zu schwer werden, sonst kaufen die Prüfer mir das so gar nicht ab das ich mit Hilfe von euch erarbeitet habe.
hier der Code.
Hab nur noch nicht rausgegriegt wie ich beim Tasten drück die >> auf die Temperatur wieder lösche.
 
gut ich muss ihn auf 2 mal posten .
Code:
$regfile = "m8def.dat"

$crystal = 8000000

$framesize = 32

$swstack = 32

$hwstack = 64


Ddrd = &B11100010
'PD0 = Eingang

'PD1 = Ausgang

'PD2 = Encoder

'PD3 = Encoder

'PD4 = Taster-Encoder

'PD5 = LCD-RS

'PD6 = LCD-E
Portd = &B00011100
'pd2-pd4 auf high signal (5V)
' den Rest auf low Signal (0V)

Ddrc = &B00000000                                           ' alle Ports des ADC wandlers als eingang declarieren

Portc = &B00000000                                          ' alle eingänge auf 0 setzen

Ddrb = &B11111111
' LCd anzeige 8 Bit

Portb = &B00000000
' alle auf Low Signal gelegt

Admux = &B11000000                                          ' ADC wandlung über die Interne Referzen Spannung  2,56V es werden 10 bit genauigkeit verwendet

Adcsra = &B11100111                                         'Bit 7 ADCan Bit 6 =1 :start Bit 5 = 1  Freilauf  Bits 2 1 0 AVR Clock / x

' Lcd anzeige auf 8 Bit Configurieren
Config Lcdpin = Pin , Port = Portb , E = Portd.6 , Rs = Portd.5

  ' LCD Typ festlegen
 Config Lcd = 20 * 4

 Config Timer0 = Timer , Prescale = 256                     'Overflow nach 2,048ms


On Timer0 Drehencoder                                       'Drehencoder abfragen
'Timer0 zur Überwachung des Drehencoders-------------------
 Dim Lcd_flag As Bit

 ' LCD_flag Dient dazu die daten nur einmal auf die LCD anzeige zuschreiben

 Dim Anzeige_flag As Bit

 ' Anzeige_flag sorgt für den wechsel vom standardbildschirm in die Menueführung

Dim Max_temp As Byte                                        'Variable für die bere Schwelle

Dim Min_temp As Byte                                        ' Variable für den untere Schwelle

Dim Temp As Byte

Dim De As Byte                                              ' Dreh Encoder

Dim Y As Byte                                               ' Variable zumverstellen des Unteren Schwellwerts

Dim X As Byte                                               ' Variable zum verstellen der Oberen Schwellwertes

Dim Curch As Byte
Dim Lb1 As Word
Dim Hb1 As Word
Dim Lb2 As Word
Dim Hb2 As Word
Dim A As Word
Dim B As Word
Dim C As Word
Dim D As Word
Dim E As Word
Dim F As Word
Dim G As Word
Dim H As Word
Dim I As Word
Dim J As Word
Dim K As Byte
Dim L As Byte
Dim Xe As Word
Dim Ye As Word

Deflcdchar 0 , 24 , 24 , 32 , 6 , 9 , 8 , 9 , 6             'Grad Celsius Symbol für LCD


Dim Z As Byte                                               ' Variable die mit dem Encoder hoch und runter gezählt wird

Taster Alias Pind.4                                         ' Taster Alias damit nicht immer PIND.4 Geschrieben werden muss

Bl Alias Portd.1                                            ' reserve Ausgang

Ein Alias 1                                                 'EIN

Aus Alias 0                                                 ' AUS

'*******************************************************************************

'                  --------------Systemstart------------------

'*******************************************************************************

'           Hier kommt alles rein was für den Systemstart wichtig ist
 Max_temp = 60
 Min_temp = 20
 X = 0
 Y = 0
 Z = 0
 '**********************************************************

'                 ----Hauptschleife----

'**********************************************************

 Do

 B = 206                                                    'Steigung 1° = 2,06 bit mehr und da man keine Kommastellen angeben kann * 100

  C = 56300                                                 'Offset wert bei 0° hat die Schaltung 563 Bit * 100 für die Rechnung

  Incr Curch

  If Curch > 1 Then Curch = 0

  Temp = Admux And &B11110000

  Admux = Temp Or Curch



  Lb1 = Adcl                                                'Abfrage des Lowbits

  Hb1 = Adch

  Waitms 20                                                 'Abfrage des Highbits

  Hb1 = Hb1 And &B00000011                                  'Highbit mit 3 und verknüpfen um eventuele Störsignale ich ein zu Beziehen

  Hb1 = Hb1 * 256                                           'High bit * 256 um  1023 bit zu bekommen

  A = Lb1 + Hb1
                                                            'Variable A = Gesamt bit High- und Lowbit
  D = A * 100                                               'Umwandlung von A für die Berechnung der Temperatur

  Ye = D - C
                                                            'Bitwert der Temperatur - Offset
  Xe = Ye / B

  Udr = Xe

  Incr Curch

  If Curch < 1 Then Curch = 1


  Temp = Admux And &B11110000

  Admux = Temp Or Curch


  Lb2 = Adcl

  Hb2 = Adch                                                'Abfrage des Highbits

  Waitms 20

  Hb2 = Hb2 And &B00000011                                  'Highbit mit 3 und verknüpfen um eventuele Störsignale ich ein zu Beziehen

  Hb2 = Hb2 * 256                                           'High bit * 256 um  1023 bit zu bekommen

  G = Lb2 + Hb2



  H = G * 100

  I = H - C
                                               'Resultierenden Wert Y durch die Steigung B X= Temperatur
  J = I / B

  Udr = J

    If E < 40 Then E = 60
    If F > 30 Then F = 20

     Locate 1 , 15 : Lcd Xe : Lcd Chr(0)

 Locate 2 , 15 : Lcd J : Lcd Chr(0)

 Locate 3 , 15 : Lcd Max_temp : Lcd Chr(0)

 Locate 4 , 15 : Lcd Min_temp : Lcd Chr(0)

 Enable Timer0                                              'Timer0 aktiv




Enable Interrupts

  If Taster = 0 Then                                        ' ist der Taster betätigt ?
                                       ' Ja dann setze  Layout auf null oder eins abhänig davon welchen wert es vorher hatte.
   Toggle Anzeige_flag

   Lcd_flag = 0                                             ' Setze Flag LC auf 0


  End If

   If Anzeige_flag = 0 Then
                                        ' ist die LCD schon Beschrieben?
    Gosub Lcdanzeige                                        ' Nein Springe zur Routine LCDanzeige

     Else

     Gosub Menue                                            ' ja dan springe in menue

   End If

Loop

'*******************************************************************************




'*******************************************************************************

'       -----------------------Subroutinen--------------------------

'*******************************************************************************



  Lcdanzeige:

  If Lcd_flag = 0 Then
  X = 0
  Y = 0
  Z = 0                                                     ' Standart Bildschirm festlegen
  Cls

  Locate 1 , 1 : Lcd "Kuehlagregat"

  Locate 2 , 1 : Lcd "Kuehlhaus"

  Locate 3 , 1 : Lcd "Obere Temp."

  Locate 4 , 1 : Lcd "Untere Temp."
                                                  ' festlegung Lcd ist schon beschrieben
     Lcd_flag = 1

     End If

     Bitwait Taster , Set
                                                 ' darauf warten das taster wieder betätigt wird

     Return



     'Sub für Taster-----------------------------------------------------------------

      Menue:

      Z = 3                                                 'Pfeile auf Abbrechen vorgeben

      Do



      If Lcd_flag = 0 Then                                  'wurde das LCD schon mal aktualisiert?
         Cls
         Locate 1 , 1 : Lcd "Einstellmenue..."

         Locate 2 , 1 : Lcd "  Max-Wert     " : Lcd Chr(0)

         Locate 3 , 1 : Lcd "  Min-Wert     " : Lcd Chr(0)

         Locate 4 , 1 : Lcd "  Abbrechen    "

         Lcd_flag = 1                                       'LCD wurde einmal aktualisiert

         Bitwait Taster , Set                               'warten ob der Taster losgelassen wurde

      Else

      End If
 
Code:
  Max_wert_set:

   X = 1
   Y = 0
   Z = 1



  If Taster = 0 Then




                                      ' wenn X = 1 dann setzte den oberen hysterese wert um 5 hoch
      Gosub Lcdanzeige

     End If

     Bitwait Taster , Set

     Return

    Min_wert_set:

   Y = 1
   X = 0
   Z = 2



  If Taster = 0 Then


                                      ' wenn X = 1 dann setzte den oberen hysterese wert um 5 hoch
      Gosub Lcdanzeige

     End If

      Bitwait Taster , Set

     Return

     Abbrechen:
     If Taster = 0 Then
     Lcd_flag = 0
     Gosub Lcdanzeige
     End If
     Return




End
 
Nichts gegen deine Version Cassio aber es darf auch nicht zu schwer werden, sonst kaufen die Prüfer mir das so gar nicht ab das ich mit Hilfe von euch erarbeitet habe.


Hallo Knut!

Wie jetzt? Du willst auf den letzten Metern umdrehen? :hmmmm:
Die Menüsteuerung ist doch so gut wie fertig!

Außerdem....
Warum sollten dir die Prüfer das nicht "abkaufen"?
Wenn du dein Programm fehlerfrei erklären kannst und du selber weißt was bestimmte Variablen machen und warum das Programm so aufgebaut wurde, dann hast du doch wirklich etwas gelernt und kannst es sogar umsetzen.
Was wollen die Prüfer denn mehr?

Ob du dir nun etwas anliest und ausprobierst, oder dein Ausbilder dir bei Problemen hilft, oder du hier die benötigte Hilfe bekommst.... wo liegt da der Unterschied?

Ganze Doktorarbeiten basieren auf diesem System.....
Ideen und Quellen anderer Personen nutzen um seine EIGENEN Theorien belegen zu können.


Mir ist es aber egal....
Mit dem Menü allein ist es ja auch nicht getan.
Das Ermitteln der ADC-Werte und das Ansteuern der Ausgänge kommt ja auch noch.
Tja und gerade weil die meisten temperaturabhängigen Widerstände nicht wirklich linear arbeiten und du noch mit Messverstärkung und Dergleichen zu tun bekommst, hast du da sowie noch eine Menge Theorie zu bewältigen.
Hauptsache, dass du kannst den Prüfer dann auch nachher fehlerfrei erklären. ;)


OK... aber dann brechen wir das hier an dieser Stelle mal ab, damit es nicht zu kompliziert wird.
Hoffen wir mal, dass die Prüfer auch eine fast fehlerfreie Steuerung bzw. Regelung akzeptieren und für in Ordnung befinden.


Dann mach dich mal an die ADC-Werte.....


Viel Spaß weiterhin.... und Glück!

Cassio
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)